使用 Keras 构建了一个模型,该模型报告了良好的准确性,但随后无法进行预测

Posted

技术标签:

【中文标题】使用 Keras 构建了一个模型,该模型报告了良好的准确性,但随后无法进行预测【英文标题】:Built a model using Keras that reports good accuracy, but then can't get predict to work 【发布时间】:2020-04-21 04:11:42 【问题描述】:

我使用 Keras/Tensorflow 构建了一个神经网络模型,该模型在构建时(使用“fit_generator”)报告了良好的训练和验证准确度(90%-ish),并在测试集上使用“evaluate_generator”函数报告了类似的准确度.但是,当我尝试使用该模型生成预测时,无论是使用“predict_generator”还是手动生成单个文件,它都会为每个预测给出“0”的答案。代码如下。我非常缺乏经验,非常感谢指导。谢谢。

from keras.preprocessing.image import img_to_array, load_img, ImageDataGenerator
from keras.models import load_model
import glob, sys
import numpy as np

myModel = load_model("Gender.h5")
dataGenerator = ImageDataGenerator()
testGen = dataGenerator.flow_from_directory("newData\\A1\\test",target_size=(218,178),
    batch_size=32, class_mode='binary',shuffle=False,color_mode="rgb")
testGen.reset()
print("Test Set Accuracy: %0.1f%%"%(100*myModel.evaluate_generator(testGen)[1]))
testGen.reset()
testPredictions = myModel.predict_generator(testGen)
predictedClassIndices=np.argmax(testPredictions,axis=1)
filenames = testGen.filenames
for f in range(len(filenames)):
    print(filenames[f],":",predictedClassIndices[f])

【问题讨论】:

发布myModel.summary() 结果。 【参考方案1】:

这种情况的一种可能性是您的类可能是Imbalanced。如果是这样的话,你可以试试:

重新平衡您的数据集:通过对频率较低的类别进行上采样或对频率较高的类别进行下采样。 调整班级权重:通过为频率较低的班级设置较高的班级权重,您将促进网络训练,从而将更多注意力放在下采样班级上。 增加训练时间:在许多情况下 - 经过较长时间的训练后,网络开始更多地关注频率较低的课程。

其他可能性 => 如果您的 DatasetBalanced,那么当您将类分配给 testPredictions 结果时,这里的问题出在 最后一步 . argmax 方法返回 the indices of the maximum values along an axis

在这种情况下,它始终为 0,因为沿 axis=1 我们只有一个元素 (with index 0)。

由于您正在执行binary classification,因此应用0.5 probability threshold 分配classes 是最有意义的。相同的代码如下所示:

predictedClassIndices = testPredictions > 0.5

for idx, filename in enumerate(filenames):
    print(filename,":",predictedClassIndices[idx])

那么输出将是TrueFalse,其中False代表Value of Label = 0 (Female)True代表Value of Label = 1 (Male)或者可以是其他方式,如图下面:

female/female.1546.jpg : [False]
female/female.1547.jpg : [ True]
female/female.1548.jpg : [False]
female/female.1549.jpg : [False]
female/female.1550.jpg : [False]
female/female.1566.jpg : [False]
female/female.1593.jpg : [ True]
female/female.1594.jpg : [False]
male/male.1514.jpg : [ True]
male/male.1520.jpg : [False]
male/male.1525.jpg : [False]
male/male.1551.jpg : [ True]
male/male.1555.jpg : [False]
male/male.1574.jpg : [ True]
male/male.1594.jpg : [ True]
male/male.1597.jpg : [ True]
male/male.1599.jpg : [ True]

希望这会有所帮助。快乐学习!

【讨论】:

【参考方案2】:

这可能是由于在您获得零的位置缺少缩放。 尝试通过myModel.predict(data) 进行测试,其中 data 是图像数组。如果您没有对图像数组应用缩放,您可能会得到零作为结果。如果你这样做myModel.predict(data/255), 你应该得到你最初拥有的东西,使用ImageDataGenerator(rescale=1/255),其中缩放设置为参数。

如果你解决了这个问题,请告诉我,抱歉我迟到了这个游戏:-)

【讨论】:

以上是关于使用 Keras 构建了一个模型,该模型报告了良好的准确性,但随后无法进行预测的主要内容,如果未能解决你的问题,请参考以下文章

Keras深度学习实战——使用GloVe模型构建单词向量

Keras深度学习实战——使用GloVe模型构建单词向量

Keras深度学习实战——使用长短时记忆网络构建情感分析模型

越来越火的tf.keras模型,这三种构建方式记住了,你就是大佬!!!

问题:模型分类猫和狗(keras)

为图像分类模型绘制混淆矩阵