问题描述
我正在使用keras实现CNN进行图像分类,并且我已经使用.fit_generator()方法来训练模型,直到验证了停止条件为止,我使用了下一个代码:
history_3conv = cnn3.fit_generator(train_data,steps_per_epoch = train_data.n // 98,callbacks = [es,ckpt_3Conv],validation_data = valid_data,validation_steps = valid_data.n // 98,epochs=50)
停止之前的最后两个时期是下一个:
如图所示,最后的训练准确度是0.91。但是,当我使用model.evaluate()
方法评估训练,测试和验证集时,我得到了下一个结果:
所以,我的问题是:为什么我有两个不同的值?
我应该使用evaluate_generator()
吗?还是应该在seed
中修复flow_from_directory()
,知道是否要执行数据扩充,所以我使用了下一个代码:
trdata = ImageDataGenerator(rotation_range=90,horizontal_flip=True)
vldata = ImageDataGenerator()
train_data = trdata.flow(x_train,y_train,batch_size=98)
valid_data = vldata.flow(x_valid,y_valid,batch_size=98)
此外,我知道在fit_generator中设置use_multiprocessing=False
会使我大大减慢训练速度。那么您认为什么是最好的解决方案
解决方法
model.fit()
和model.evaluate()
数据是生成器生成的扩充数据。因此,您的准确性会有一些差异。如果您在model.fit_generator
的{{1}}中使用了非增广的model.evaluate_generator
或training
数据,并且还在validation
或validation
中使用过,准确性没有任何变化。
下面是我运行了一个简单的猫和狗分类程序-
- 验证数据生成器仅具有缩放转换,没有其他增强技术。
- 验证准确性会在时代结束后显示。
- 使用
test
重置验证数据生成器。没必要,因为我们还没有进行任何扩充。 - 使用
validation_data
和fit_generator
评估验证数据的准确性。
在时代结束之后计算出的验证准确性与使用model.evaluate()
和model.evaluate_generator
计算出的准确性相匹配。
代码:
val_data_gen.reset()
输出:
model.evaluate