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

TensorFlow Keras中Model.save()是否保存最优模型?

你的判断是否正确?

该判断完全成立。

  • Keras框架下ModelCheckpoint回调的运行逻辑为:每个epoch完成训练、验证流程后,根据预设的监控指标判断是否满足保存条件,满足则将当前时刻的模型副本写入指定的HDF5存储路径,整个保存过程不会修改内存中正在参与训练的model实例的参数。
  • 全部epoch训练结束后,内存中的model实例留存的就是最后一个epoch完成参数更新后的状态,此时直接调用model.save()保存的就是最后一个epoch的模型,和之前回调存储的checkpoint文件完全独立。如果训练结束后没有手动调用load_model()加载checkpoint文件,之前保存的最优模型确实不会被调用。

为什么checkpoint保存的最优模型评分低于最后epoch保存的模型?

这种情况十分常见,不属于异常,通常由以下几类原因导致:

  • 监控指标与评分指标不对齐:如果给ModelCheckpoint配置的监控指标是val_loss,但后续评分用的是准确率、F1值、AUC等其他指标,两类指标并非单调对应关系。例如交叉熵损失的小幅波动可能伴随准确率的反向变化,完全可能出现损失升高但分类准确率提升的情况,这是指标本身的数学特性决定的。
  • 验证集指标的随机波动:10折交叉验证中每一折的验证集样本量有限,验证集计算出的损失值本身存在采样噪声。训练过程中可能出现某一个epoch刚好在当前验证集上拿到更低的损失,但该节点的模型泛化能力并未达到最优,只是碰巧适配了验证集的随机波动,后续模型收敛后在整体评分上表现更好属于正常现象。
  • 配置或评估流程存在疏漏:优先排查两类低级问题:一是ModelCheckpoint的参数配置是否正确,比如是否误将监控指标设为训练集loss而非验证集val_loss,是否写错监控指标名称导致回调实际没有按预期保存最优模型;二是评估两个模型时的推理状态是否一致,比如是否存在评估最后epoch模型时没有切换到推理模式,导致Dropout、BatchNorm层仍处于训练状态,碰巧产出了虚高的评分。
  • 训练轮次设置不足:如果总训练epoch数设置偏小,训练全程没有出现明显的过拟合拐点,模型在验证集上的表现整体处于上升趋势,中途记录的「最低val_loss」只是训练过程中的噪声低点,最后一个epoch的模型泛化能力自然更好。

排查时可将每个epoch的训练集指标、验证集指标全部导出绘制曲线,对应两个模型保存的epoch节点,即可快速定位具体原因。

内容的提问来源于stack exchange,提问作者noam suissa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:54:24