You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,自然就会抛出那个警告,也没法保存最优模型了。

修复步骤

  1. 先正确计算验证集的步数:
# 计算验证集每个epoch需要跑的步数
val_steps = test_generator.samples // test_generator.batch_size

如果你的测试集样本数不能被batch_size整除,也可以考虑写成val_steps = test_generator.samples // test_generator.batch_size + 1,确保所有验证样本都被用到。

  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:27:54