回调函数是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。
keras中的回调函数是一个类1
keras.callbacks.Callback()
定义新的回调函数必须继承自该类
常用回调函数
ModelCheckpoint
在每个epoch后将模型保存到filepath
1
2 cb_ckpt = keras.callbacks.ModelCheckpoint('./checkpoint/weights.{epoch:02d}-{val_loss:.2f}.h5', monitor='val_loss', verbose=1,
save_best_only=True, save_weights_only=False, mode='auto', period=10)
- python格式化字符串的用法:
weights.{epoch:02d}-{val_loss:.2f}.h5
- mode: ‘auto’, ‘max’, ‘min’之一,在save_best_only=True时,根据monitor监视的值觉得评价best的标准是什么
- period: CheckPoint之间的间隔epoch数
保存的文件中可包含:
- 模型的结构,以便重构该模型
- 模型的权重
- 训练配置(损失函数,优化器等)
- 优化器的状态,以便从上次训练中断的地方开始
重新加载模型1
model = keras.models.load_model(FILE_PATH)
保存模型1
2
3
4
5
6
7
8
9
10
11#只保存权重
model.save_weights('model.h5')
model.load_weights('model.h5')
#只保存结构
json_string = model.to_json()
model = keras.models.model_from_json(json_string)
#保存模型
model.save('model.h5')
model.load('model.h5')
EarlyStopping
当监测值不再改善时,该回调函数将中止训练
1 cb_es = keras.callbacks.EarlyStopping(monitor='val_loss',patience=0,verbose=0,mode='auto')
- monitor:需要监视的量
- patience:当early stop被激活(如发现loss相比上一个epoch训练没有下降),则经过patience个epoch后停止训练。
- verbose:信息展示模式
- mode:‘auto’,‘min’,‘max’之一,在min模式下,如果检测值停止下降则中止训练。在max模式下,当检测值不再上升则停止训练
LearningRateScheduler
可以按照epoch的次数自动调整学习率
1 | keras.callbacks.LearningRateScheduler(schedule) |
- schedule: 函数,该函数以epoch号为参数(从0算起的整数),返回一个新学习率(浮点数)
1 | #学习率指数下降 |
也可以在sgd中直接修改1
sgd = SGD(lr=learning_rate, decay=learning_rate/nb_epoch, momentum=0.9, nesterov=True)
ReduceLROnPlateau
当评价指标不在提升时,减少学习率
当学习停滞时,减少2倍或10倍的学习率常常能获得较好的效果。该回调函数检测指标的情况,如果在patience个epoch中看不到模型性能提升,则减少学习率
1 | keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', epsilon=0.0001, cooldown=0, min_lr=0) |
- factor: 每次学习率减小的因子,lr = lr*factor
- patience: 当patience个epoch模型性能不在提升时,触发此函数
- epsilon: 阈值,用来判断是否进入plateau
- cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作
- min_lr:学习率的下限