使用 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
。如果是这样的话,你可以试试:
其他可能性 => 如果您的 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)
,其中缩放设置为参数。
如果你解决了这个问题,请告诉我,抱歉我迟到了这个游戏:-)
【讨论】:
以上是关于使用 Keras 构建了一个模型,该模型报告了良好的准确性,但随后无法进行预测的主要内容,如果未能解决你的问题,请参考以下文章
Keras深度学习实战——使用长短时记忆网络构建情感分析模型