Keras - model.predict 返回类而不是概率

Posted

技术标签:

【中文标题】Keras - model.predict 返回类而不是概率【英文标题】:Keras - model.predict return classes and not probabilities 【发布时间】:2018-07-15 10:49:35 【问题描述】:

我加载了我训练的模型。 这是训练的最后一层:

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

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

之后,我尝试对随机图像进行预测。 所以我加载模型:

#load the model we created
json_file = open('/path/to/model_3.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
# load weight into model
loaded_model.load_weights("/path/to/model_3.h5")
print("\nModel successfully loaded from disk! ")


# Predicting images
img =image.load_img('/path/to/image.jpeg', target_size=(224, 224))
x = image.img_to_array(img)
x *= (255.0/x.max())
image = np.expand_dims(x, axis = 0)
image = preprocess(image)
preds = loaded_model.predict_proba(image)
pred_classes = np.argmax(preds)
print(preds)
print(pred_classes)

作为输出我得到这个:

[[6.0599333e-26 0.0000000e+00 1.0000000e+00]]
2

这基本上就像我得到[0 0 1] 喜欢predict_classes。虽然我想得到概率。 所以我正在寻找像[0.75 0.1 0.15] 这样的输出。 有什么想法吗?

【问题讨论】:

***.com/questions/48621833/… 是不是同一个问题?你可能是同一个用户?? 【参考方案1】:

如果你想将概率作为网络的输出,你只需要使用 softmax 激活函数而不是 sigmoid

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'])

【讨论】:

我改成softmax现在我得到[1 0 0 这是一个分布,这只是意味着网络确定它是第一个。还有其他函数,如“log-softmax”,它给出的输出概率较低,但我认为 softmax 是 keras 提供的唯一一个 好的,我明白了!但是对于我试图获得这些组合的每张照片来说这是否正常? ([0 1 0])。我的意思是网络对所有照片都如此确定? 例如,我将模型训练成鸟和猫的照片,第三类是混合照片的类。那是图像既不是鸟也不是猫的概率。当我尝试用猫和人对图像进行分类时,我应该得到类 [cat] 的示例 [0,45 0,45 0,1] ,随机,鸟]。但我只得到 [1, 0 ,0]。这就是为什么我告诉我没有得到概率! softmax 倾向于生成向量,其中只有一个高,其余的都低,但如果你总是得到两个零和一个,那就有点奇怪了。在猫 + 人类 1 0 0 的情况下,这是有道理的,因为如果你的网络正在学习在猫和鸟之间进行分类,如果它看到一只猫,它很可能肯定地说它是一只猫,网络不知道有图片中的一个人。但是请确保您没有过度拟合,这可能是输出总是一个热的另一个原因

以上是关于Keras - model.predict 返回类而不是概率的主要内容,如果未能解决你的问题,请参考以下文章

从 Keras model.predict_generator 计算准确率

Keras 的 predict_generator 未返回正确数量的样本

keras 中 model.predict() 和 model.predict_generator() 之间的预测差异

Keras model.evaluate() 和 model.predict() 有啥区别?

model.predict(keras)输出中的类的顺序是啥?

model.predict 不适用于 Keras 自定义层(推理错误)