问题描述
使用keras搭建模型,训练时验证集上val_acc达到1了,但在测试数据集上面模型还没有完全收敛。由于在ModelCheckpoint的参数设置时设置了仅保留最佳模型,导致无法保存最新的更好的模型。
ModelCheckpoint
-
函数原型
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
-
作用
该回调函数将在每个epoch后保存模型到filepath
-
参数
filename:字符串,保存模型的路径,filepath可以是格式化的字符串,里面的占位符将会被epoch值和传入on_epoch_end的logs关键字所填入。
例如:
filepath = "weights_{epoch:03d}-{val_loss:.4f}.h5"
则会生成对应epoch和验证集loss的多个文件。monitor:需要监视的值,通常为:val_acc 或 val_loss 或 acc 或 loss
verbose:信息展示模式,0或1。为1表示输出epoch模型保存信息,默认为0表示不输出该信息,信息形如:
Epoch 00001: val_acc improved from -inf to 0.49240, saving model to /xxx/checkpoint/model_001-0.3902.h5save_best_only:当设置为True时,将只保存在验证集上性能最好的模型
mode:‘auto’,‘min’,‘max’之一,在save_best_only=True时决定性能最佳模型的评判准则,例如,当监测值为val_acc时,模式应为max,当检测值为val_loss时,模式应为min。在auto模式下,评价准则由被监测值的名字自动推断。
save_weights_only:若设置为True,则只保存模型权重,否则将保存整个模型(包括模型结构,配置信息等)
period:CheckPoint之间的间隔的epoch数
EarlyStopping
-
函数原型
keras.callbacks.EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto')
当监测值不再改善时,该回调函数将中止训练
-
参数
monitor:需要监视的量,通常为:val_acc 或 val_loss 或 acc 或 loss
patience:当early stop被激活(如发现loss相比上patience个epoch训练没有下降),则经过patience个epoch后停止训练。
verbose:信息展示模式
mode:‘auto’,‘min’,‘max’之一,在min模式下,如果检测值停止下降则中止训练。在max模式下,当检测值不再上升则停止训练。
问题解决
-
步骤
1、设置 ModelCheckpoint 的参数filepath = "model_{epoch:03d}-{val_acc:.4f}.h5" #避免文件名称重复 save_best_only=False ,#保存所有模型 save_weights_only=True ,#仅保留权重参数 patience = 10
其他参数都使用默认值。
2、设置 EarlyStopping 的参数
patience = 10, monitor='acc'
其他参数都使用默认值。
3、训练模型
训练过程中,每个epoch都会保存一个模型文件。由于模型文件太多,可以使用TensorBoard查看训练过程中的训练集的 acc 及 loss ,结合 val_acc = 1 就能确定第几个epoch的模型是最佳模型,再根据模型的文件名称就能找到最佳模型。
参考
https://keras-cn.readthedocs.io/en/latest/other/callbacks/