繁体   English   中英

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

[英]How to convert the output of a neural network into probabilities?

我目前正致力于图像识别问题,我想要识别具有最高概率的图像,这意味着期望匹配给定输入测试图像的具有最大匹配分数百分比的图像。

我想要任何想法,建议或任何博客文章,我可以通过它发布它。

  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%

你可以做的是在输出层节点上使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM