使用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
相关产品推荐
相关产品推荐

