【问题标题】:How to convert the output of a neural network into probabilities?如何将神经网络的输出转换为概率?
【发布时间】:2019-04-25 19:10:22
【问题描述】:

我目前正在研究一个图像识别问题,我希望识别具有最高概率的图像,这意味着期望从给定输入测试图像的图像池中匹配具有最大匹配分数百分比的图像。

我想要任何想法、建议或任何博客文章,我可以通过它继续前进。

  1. 我编写了一个 CNN 分类器,它由通常的卷积、最大池化层组成;
  2. 然后我使用 Keras 的 ImageDataGenerator 函数来使用图像增强。我将其应用于训练集,并重新调整了我的测试集。
  3. 然后我用一些随机图像测试了算法。但我需要了解如何从给定输入测试图像的图像池中准确匹配具有最大匹配分数百分比的图像。
  4. 此时我只是传递一张图像作为输入,算法正在返回它是猫、狗还是任何材料。

如果要求不清楚,请告诉我,我将提供所有细节。

             classifier = Sequential()
             classifier.add(Conv2D(32,(3,3), input_shape =(600,200,3), 
                                                     activation ='relu')) 
             classifier.add(MaxPooling2D(pool_size = (2,2)))

             classifier.add(Conv2D(32,(3,3), activation ='relu')) 
             classifier.add(MaxPooling2D(pool_size = (2,2)))
             classifier.add(Flatten())
             classifier.add(Dense(units = 128, activation ='relu'))
             classifier.add(Dropout(0.4))
             classifier.add(Dense(units = 64, activation ='relu'))
             classifier.add(Dense(units = 3, activation ='softmax'))
             classifier.compile(optimizer = 'adam', loss = 
             'categorical_crossentropy', metrics =['accuracy'])  

             #Testing
              img_width, img_height = 600, 200

              def prediction(file):
                    x = load_img(file, target_size=(img_width,img_height))
                    x = img_to_array(x)
                    x = np.expand_dims(x, axis=0)
                    array = classifier.predict(x)
                    result = array[0]
                    #print(result)
                    answer = np.argmax(result)
                    if answer == 1:
                       print("Predicted: Dog")
                    elif answer == 0:
                       print("Predicted: Cat")
                    elif answer == 2:
                       print("Predicted: Materials")         

我想要这样的输出,给定一张图片,它应该告诉我它属于哪个类别的概率,例如狗:23%,猫:2%,材料:75%

【问题讨论】:

  • 您能向我们展示您在模型中添加最后一层的代码吗?
  • classifier.add(Dense(units = 128, activation ='relu')) classifier.add(Dropout(0.1)) classifier.add(Dense(units = 64, activation ='relu') ) #Hidden Layers classifier.add(Dense(units = 3, activation ='softmax')) #Output Node #Compiling classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics =['accuracy'])
  • 好的,看起来不错。您还可以添加用于测试模型并获取图像预测的代码吗?

标签: python machine-learning deep-learning computer-vision


【解决方案1】:

您可以做的是在输出层节点上使用 sigmoid 传递函数(接受数据范围 (-inf,inf) 并输出 [-1,1] 中的值)。 然后通过使用 1-of-n 输出编码(每个类一个节点),您可以将范围 [-1,1] 映射到 [0,1] 并将其用作每个类值的概率(请注意,这是有效的自然不止两个类)。

您可以在此处阅读更多内容,包括概率解释的证明:

[1] Bishop,Christopher M. 用于模式识别的神经网络。牛津大学出版社,1995 年。

简单示例

如果您想将概率作为网络的输出,您可以在Dense 层之后使用softmax

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# probability array
probabilities = model.predict(image)[0]

# get predicted classes
pred_classes = np.argmax(probabilities)

【讨论】:

  • 嗨!感谢您的建议!我了解您是从哪个角度说的,但是您能否就此分享更多见解,我无法将代码可视化。
  • @user11409134 我添加了一个简单的示例,说明如何使用Softmax 层获得类概率。干杯
猜你喜欢
  • 2010-12-04
  • 2020-08-11
  • 2018-09-01
  • 2011-02-16
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 2014-01-15
  • 2015-07-31
相关资源
最近更新 更多