Keras CNN使用预测类给出错误预测

Keras CNN使用预测类给出错误预测,keras,Keras,我仍然处于keras和CNN的学习模式。我觉得我理解基本要点,但执行起来很困难。我创建了一个用于狗/猫图像数据集的顺序分类器。我使用fit_generator获得以下内容(此代码在下面): 1/5纪元 8000/8000[=========================================================================================================1942s 243ms/步长-损耗:0.3658-acc:0.829

我仍然处于keras和CNN的学习模式。我觉得我理解基本要点,但执行起来很困难。我创建了一个用于狗/猫图像数据集的
顺序
分类器。我使用
fit_generator
获得以下内容(此代码在下面):

1/5纪元
8000/8000[=========================================================================================================1942s 243ms/步长-损耗:0.3658-acc:0.8299-val-损耗:0.6998-val-损耗:0.7785]-预计到达时间:24:40-损耗:0.6010-acc:0.6705
纪元2/5
8000/8000[=====================================================================-1829s 229ms/步长-损耗:0.1266-附件:0.9522-val_损耗:0.9218-val_附件:0.7731
纪元3/5
8000/8000[==================================================================-1806s 226ms/步-损耗:0.0689-附件:0.9759-val_损耗:1.2006-val_附件:0.7813
纪元4/5
8000/8000[===========================================================================1936S242ms/步长-损耗:0.0504-acc:0.9830-val_损耗:1.2396-val_acc:0.7748-预计到达时间:18:07-损耗:0.0548-acc:0.9817
纪元5/5
8000/8000[===========================================================================-2259s 282ms/步长-损耗:0.0393-附件:0.9870-val_损耗:1.3916-val_附件:0.7818
用于产生上述结果的代码:

#导入Keras库和包
导入操作系统
从keras.models导入顺序加载模型
从keras.layers导入Conv2D
从keras.layers导入MaxPoolig2D
从keras.layers导入展平
从keras.layers导入稠密
从keras.preprocessing导入图像
从keras.preprocessing.image导入ImageDataGenerator
#建立分类序列神经网络
分类器=顺序()
add(Conv2D(32,(3,3),input_shape=(64,64,3),activation='relu'))
add(MaxPoolig2D(池大小=(2,2)))
添加(展平())
add(稠密(单位=128,激活=relu'))#relu代表校正后的线性单位。它接受实值输入并将其阈值设置为零(将负值替换为零)
#初始化输出层,它应该只包含一个节点
#二元分类。单节点给我们一个猫或狗的二进制输出。
add(稠密(单位=1,激活='sigmoid'))
#编译CNN模型
compile(优化器='adam',loss='binary\u crossentropy',metrics=['accurity'])
#创建图像数据生成器---
#执行图像增强,基本上是合成训练数据
列车数据发生器=图像数据发生器(重缩放=1./255,
剪切范围=0.2,
缩放范围=0.2,
水平(翻转=真)
test_datagen=ImageDataGenerator(重缩放=1./255)
training\u set=来自目录(“training\u set”)的train\u datagen.flow\u,
目标_大小=(64,64),
批次大小=32,
class_模式='binary')
#通过使用测试目录从图像中输入生成的数据,为培训创建测试集
test\u set=test\u datagen.flow\u from\u目录(“test\u set”,
目标_大小=(64,64),
批次大小=32,
class_模式='binary')
#使训练集适合模型
分类器。装配发生器(训练集,
每个历元的步数=8000,
纪元=5,
验证数据=测试集,
验证(步骤=2000)
#保存模型以供进一步使用
save('classifier_v1.h5')
从这里开始,我使用
load\u model
函数调用我的分类器,并尝试在5张图片的测试集上预测狗还是猫。无论我做什么,分类器的结果都是1

从keras.models导入负载模型
从keras.preprocessing导入图像
将numpy作为np导入
分类器=负载模型(“分类器1.h5”)
data\u path=r'C:\Users\aneja\Documents\Python Scripts\CNN\Cats Dogs\test\u 2'
image_list=[x代表os.listdir中的x(数据路径),如果x中的.jpg]
#循环以通过测试图像进行测试
对于图像列表中的jpeg:
#加载测试映像
img=image.load\u img(os.path.join(data\u path,jpeg),target\u size=(64,64))
#处理图像以提取numpy数组
y=image.img_到_数组(img)
x=np。展开尺寸(y,轴=0)
#预测!1=狗0=猫
images=np.vstack([x])
类=分类器。预测类(图像,批量大小=10)
如果类[0][0]==1:
打印({}文件预计为狗。格式(jpeg))
elif类[0][0]==0:
print({}文件被预测为cat.format(jpeg))
其他:
打印('是的,我做错了')

当使用
predict
代替
predict\u类时,我也得到了相同的结果。我希望我离解决方案不会太远,但我担心我从根本上误解了概念。关于为什么我的分类器似乎总是将类分类为1,有人能提供帮助吗?

以下是一些建议:

首先也是最重要的一点是,检查以确保“每个历元的步骤数=8000”和“验证步骤数=2000”实际上是正确的值。根据我的经验,错误的数字会极大地损害模型的性能。大多数人通过以下方式确保这些值是正确的: 发电机系列样品/发电机系列批量尺寸

第二,增加二维层的数量。通常,一个层不足以用于强模型。如果您发现您的计算机无法快速训练您的模型,那么请使用谷歌Colaboratory,一个免费的GPU和基于云的网站,可以让您做到这一点

第三,增加你的测试规模。5张图片不足以让您自信地评估模型的性能

第四,与S.Mohsen sh所说的不同,如果你发现“预测”只返回“1”,那么这意味着你的模型没有经过适当的训练,所以试试我的fi