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

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

我希望能得到任何想法、建议或博客文章,以便我能够继续推进这个项目。

  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转移函数(接受数据范围(-∞,∞)并输出在[-1,1]范围内的值)。然后通过使用1-of-n输出编码(每个类别一个节点),你可以将范围[-1,1]映射到[0,1],并将其用作每个类别值的概率(请注意,这自然适用于不止两个类别的情况)。

你可以在这里阅读更多内容,包括概率解释的证明:

[1] Bishop, Christopher M. Neural networks for pattern recognition. Oxford university press, 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 arrayprobabilities = model.predict(image)[0]# get predicted classespred_classes = np.argmax(probabilities)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注