如何将神经网络的输出转换为概率?

时间:2019-04-25 07:43:01

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

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

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

  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%

1 个答案:

答案 0 :(得分:0)

您可以做的是在输出层节点上使用S形传递函数(该函数接受数据范围(-inf,inf)并输出[-1,1]中的值)。 然后,使用n中的1-输出编码(每个类一个节点),您可以将范围[-1,1]映射到[0,1]并将其用作每个类值的概率(请注意,这是可行的当然不只是两个班级。

您可以在此处了解更多信息,包括概率解释的证明:

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

简单示例

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

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)