【问题标题】:Built a model using Keras that reports good accuracy, but then can't get predict to work使用 Keras 构建了一个模型,该模型报告了良好的准确性,但随后无法进行预测
【发布时间】: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() 结果。

标签: python tensorflow keras generator predict


【解决方案1】:

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

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

其他可能性 => 如果您的 Dataset 是 Balanced,那么当您将类分配给 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])

那么输出将是True和False,其中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),其中缩放设置为参数。

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

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 2020-03-13
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 2020-09-29
      • 1970-01-01
      • 2019-10-23
      相关资源
      最近更新 更多