ModelCheckpoint通过设置monitor、mode和save_best_only可保存验证集最优模型;EarlyStopping配合使用可自动停机,需注意nan处理及多指标复合逻辑需自定义回调。

如何用 ModelCheckpoint 保存验证集最优模型
直接用 ModelCheckpoint 就能实现“验证集最优时保存”,它本身不触发停机,但它是后续停机逻辑的基础。关键不是写新回调,而是配对使用 monitor 和 mode 参数。
-
monitor='val_loss'是最常用选择;若用准确率,必须写成monitor='val_accuracy'(注意不是val_acc,后者在 TF 2.10+ 已弃用) -
mode='min'对应val_loss,mode='max'对应val_accuracy,写反会导致永远不保存 -
save_best_only=True必须设为True,否则每次 epoch 都覆盖保存,无法锁定最优 - 文件路径建议用
filepath='best_model.h5'或带时间戳的动态路径,避免被意外覆盖
怎么让训练在验证指标不再提升时自动停止
停机靠 EarlyStopping,它和 ModelCheckpoint 通常一起用,但两者独立工作:一个管保存,一个管停机。
-
monitor必须和ModelCheckpoint保持一致,比如都用'val_loss',否则判断依据错位 -
patience设为 3–5 比较稳妥;设太小(如 1)容易早停,设太大(如 20)浪费算力 -
restore_best_weights=True很重要——它会让模型权重回滚到monitor最优的那个 epoch,而不是最后一步的权重 - 如果验证集指标震荡剧烈,可加
min_delta=1e-4,避免微小波动触发停机
为什么 val_loss 突然变 nan 会导致停机失效
EarlyStopping 默认把 nan 当作“未改善”,不会触发停机,反而可能继续训练直到崩溃。这不是 bug,是设计行为。
- 在回调列表里把
EarlyStopping放在ModelCheckpoint后面,能让 checkpoint 先尝试保存nan值(虽然通常失败),便于排查 - 更可靠的做法是自定义一个轻量回调检测
nan:class NanMonitor(tf.keras.callbacks.Callback): def on_batch_end(self, batch, logs=None): if logs and (np.isnan(logs.get('val_loss')) or np.isinf(logs.get('val_loss'))): print('NaN detected in val_loss, stopping.') self.model.stop_training = True - 训练前检查数据标签是否全为同一类、学习率是否过大(>1e-2 常见于小数据集)、损失函数是否匹配任务(如用
sparse_categorical_crossentropy却传了 one-hot 标签)
多个验证指标下如何定义“最优”
TensorFlow 原生回调只支持单指标监控。想同时看 val_loss 和 val_f1_score 并设定复合条件?得自己写回调。
立即学习“Python免费学习笔记(深入)”;
- 继承
tf.keras.callbacks.Callback,重写on_epoch_end - 用
logs['val_loss']和logs['val_f1_score']取值,按业务逻辑判断(例如:loss 0.9 才算达标) - 手动控制
self.model.stop_training = True,并用self.model.save()保存模型(注意路径和格式) - 别忘了在
__init__里初始化状态变量,比如self.best_f1 = 0.0,否则跨 epoch 无法比较
复合逻辑越复杂,越容易漏掉 restore_best_weights 的等效处理——原生 EarlyStopping 的这个功能得自己手写回滚逻辑。


















