Keras构建CNN图像分类模型时ModelCheckpoint无法保存最优模型问题求助
解决ModelCheckpoint无法获取val_accuracy的问题
嘿,我看了你的代码和遇到的问题,马上就发现了一个很可能的根源——你在model.fit里把validation_steps设置成了和steps_per_epoch一样的stepsPerEpoch,这就是导致第二个epoch开始出现警告的关键!
问题原因拆解
steps_per_epoch是训练集每个epoch需要遍历的步数,计算逻辑是训练集样本数 // batch_size,这个你应该是对的。- 但
validation_steps应该对应验证集的遍历步数,也就是测试集样本数 // batch_size。当你把它设成训练集的步数时,第一个epoch可能刚好把验证集的数据跑完了,但从第二个epoch开始,验证生成器已经没有足够的数据来完成你指定的步数,Keras没法计算完整的val_accuracy,自然就会抛出那个警告,也没法保存最优模型了。
修复步骤
- 先正确计算验证集的步数:
# 计算验证集每个epoch需要跑的步数 val_steps = test_generator.samples // test_generator.batch_size
如果你的测试集样本数不能被batch_size整除,也可以考虑写成val_steps = test_generator.samples // test_generator.batch_size + 1,确保所有验证样本都被用到。
- 修改
model.fit里的validation_steps参数:
history = model.fit( train_generator, steps_per_epoch = stepsPerEpoch, epochs = 15, validation_data=test_generator, validation_steps = val_steps, # 替换成正确的验证步数 callbacks = [ PlotLossesKeras(), checkpoint] )
额外小提示
验证集一般不需要做数据增强(你已经用了单独的test_datagen只做rescale,这点很对),另外可以给test_generator加上shuffle=False,避免验证数据打乱,结果更稳定:
test_generator = test_datagen.flow_from_directory( r"./datasetcrop512/test", target_size=(512,512), batch_size=32, class_mode='categorical', shuffle=False # 验证集建议关闭shuffle )
按这个改完后,应该就能正常计算每个epoch的val_accuracy,ModelCheckpoint也能正常保存最优模型了。
内容的提问来源于stack exchange,提问作者Shubham Agrawal
相关产品推荐
相关产品推荐

