Keras中EarlyStopping未触发时的模型保存行为
问题解答
核心结论
当EarlyStopping未触发(即训练跑完了所有150个epoch)时,你当前代码保存的是最后一轮训练的权重,而非训练过程中loss最优的那个epoch的权重。
原因分析
你设置的restore_best_weights=True参数,仅在EarlyStopping触发(提前终止训练)时生效:此时回调会自动将模型权重恢复到监控指标(这里是loss)最优的epoch状态,之后执行model.save()保存的就是最优权重。
但如果训练顺利跑完所有预设epoch,EarlyStopping未被激活,这个参数不会起作用——模型会保留最后一轮训练结束后的权重,此时model.save()保存的自然是最后一轮的权重。
优化方案(可选)
如果希望无论是否触发早停,都能保存训练过程中loss最优的模型权重,建议搭配ModelCheckpoint回调使用,示例代码如下:
from keras.callbacks import EarlyStopping, ModelCheckpoint es = EarlyStopping(monitor='loss', min_delta=1e-4, patience=10, verbose=True, restore_best_weights=True) mc = ModelCheckpoint('model_best.h5', monitor='loss', save_best_only=True, verbose=True) history = model.fit(ft, steps_per_epoch=len(ft), callbacks=[es, mc], epochs=150, verbose=verbose)
这个方案中,ModelCheckpoint会在每个epoch结束后自动判断当前loss是否为最优,仅保存最优状态的模型,完全不受早停是否触发的影响。
内容的提问来源于stack exchange,提问作者MrT77
相关产品推荐
相关产品推荐

