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

使用Keras中EarlyStopping回调时如何获取最优模型?

解决Keras早停后无法获取最优val_acc模型的问题

这问题我之前也碰到过,核心原因其实是两个回调的参数配置没匹配你的需求,咱们一步步来解决:

1. 为什么当前设置会拿到"差一点"的模型?

  • EarlyStopping的默认行为:你设置了patience=0,当val_acc下降时立刻停,但Keras的EarlyStopping默认restore_best_weights=False——也就是说,训练停止时,模型保留的是触发停止的那一轮epoch的权重,而不是之前val_acc最高的那一轮。
  • ModelCheckpoint的监控指标不匹配:你之前用monitor='val_loss',但你关注的是val_acc。val_acc最高的时刻,val_loss不一定是最低的,所以这个回调保存的其实是loss最优的模型,不是你要的acc最优模型。

2. 两种可行的解决方案

方案一:让EarlyStopping自动恢复最优权重

直接给EarlyStopping加上restore_best_weights=True参数,这样训练停止时,模型会自动切换到val_acc最高的那一轮的权重,不用额外加载模型:

from keras.callbacks import EarlyStopping

# 配置早停回调,监控val_acc,patience=0,恢复最优权重
early_stop = EarlyStopping(
    monitor='val_acc',
    patience=0,
    restore_best_weights=True,
    verbose=1  # 可选,打印停止时的提示信息
)

方案二:正确配置ModelCheckpoint保存最优acc模型

如果你更倾向于用模型保存的方式,需要把监控指标改成val_acc,同时设置mode='max'(因为acc是越高越好,loss是越低越好):

from keras.callbacks import ModelCheckpoint

# 配置模型保存回调,只保存val_acc最高的模型
checkpoint = ModelCheckpoint(
    filepath='best_model.h5',
    monitor='val_acc',
    save_best_only=True,
    mode='max',
    verbose=1  # 可选,打印每次保存的提示
)

训练完成后,你需要手动加载这个保存的模型才能拿到最优的那个:

from keras.models import load_model

best_model = load_model('best_model.h5')

3. 训练时的回调使用

你可以把两个回调一起用,既早停又保存最优模型,保险起见:

model.fit(
    x_train, y_train,
    validation_data=(x_val, y_val),
    epochs=100,  # 设置足够大的epochs,让早停来终止训练
    callbacks=[early_stop, checkpoint]
)

这样调整后,不管是直接用训练后的模型(方案一),还是加载保存的文件(方案二),都能拿到val_acc最高的最优模型了。

内容的提问来源于stack exchange,提问作者Mauro Gentile

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:07:36