Python 使用Keras构建了一个模型,该模型报告了良好的准确性,但可以';我不能上班

Python 使用Keras构建了一个模型,该模型报告了良好的准确性,但可以';我不能上班,python,tensorflow,keras,generator,predict,Python,Tensorflow,Keras,Generator,Predict,我已经使用Keras/Tensorflow构建了一个神经网络模型,该模型在构建时报告了良好的训练和验证精度(90%-ish)(使用“fit_generator”),并使用测试集上的“evaluate_generator”功能报告了类似的精度。但当我尝试使用该模型生成预测时,无论是使用“predict_generator”还是手动生成单个文件,它都会为每个预测提供“0”的答案。代码如下。我没有经验,非常感谢您的指导。谢谢 from keras.preprocessing.image import

我已经使用Keras/Tensorflow构建了一个神经网络模型,该模型在构建时报告了良好的训练和验证精度(90%-ish)(使用“fit_generator”),并使用测试集上的“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])

这种情况的一种可能性是,您的类可能是不平衡的。如果是这种情况,您可以尝试:

  • 重新平衡数据集:对频率较低的类进行上采样或对频率较高的类进行下采样
  • 调整班级权重:通过为不太频繁的班级设置更高的班级权重,你将促进你的网络培训,以便将更多注意力放在抽样较少的班级上
  • 增加培训时间:在许多情况下,经过较长的培训时间后,网络开始将更多精力集中在频率较低的课程上
其他可能性=>如果您的
数据集
平衡的,那么,当您将类分配给
测试预测
结果时,最后一步就是问题所在。
argmax
方法返回轴上最大值的索引

在这种情况下,它总是0,因为沿着
轴=1
我们只有一个元素(
,索引为0

由于您正在执行
二进制分类
,因此应用
0.5
概率阈值
来分配
。其代码如下所示:

predictedClassIndices = testPredictions > 0.5

for idx, filename in enumerate(filenames):
    print(filename,":",predictedClassIndices[idx])
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]
然后输出将是
True
False
,其中False表示标签的
值=0(女性)
True表示标签的
值=1(男性)
,或者可以是其他方式,如下所示:

predictedClassIndices = testPredictions > 0.5

for idx, filename in enumerate(filenames):
    print(filename,":",predictedClassIndices[idx])
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]

希望这有帮助。学习愉快

这可能是因为在得到零的地方缺少缩放。 尝试使用myModel.predict(data)测试此操作,其中数据是图像数组。如果未对图像阵列应用缩放,则结果可能为零。如果您选择myModel.predict(数据/255), 您应该使用
ImageDataGenerator(rescale=1/255)
获得您最初拥有的内容,其中缩放设置为参数


如果你解决了这个问题,请让我知道,为我迟到道歉:-)

发布
myModel.summary()
结果。