回调函数(callbacks)
我们在训练模型的时候,往往会有这样一种状况:明明只需要训练20个迭代就可以收敛,但是由于设置的epochs = 100,之后的80次迭代的任务完全没有意义,而且浪费了大量的时间!
或许有人会说,时刻关注着val_acc就好,但现实是,在实际任务中,每一次的迭代时间有可能长达数百分钟,想要一天到晚盯着模型是不现实的。
这时候,就需要callbacks出场了。
回调函数(callbacks)是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。
简单的说,回调函数可以帮助我们实现各种各样的功能,使得模型的训练过程更加的得心应手,下面就让我根据功能来介绍一些常用的回调函数吧。
- 定期减小学习率
我们都知道,在训练过程中,定期的减小学习率可以使得模型的波动越来越小,进而有利于收敛的效果,ReduceLROnPlateau函数就可以做到这一点。
代码实现:
# 参数:
# monitor:被监测的量
# factor:每次减少学习率的因子,学习率将以lr = lr*factor的形式被减少
# patience:当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发
keras.callbacks.ReduceLROnPlateau(
monitor='val_loss',
factor=0.1,
patience=4,
verbose=1,
)
- 早停
正如之前所说,如果可以在每次迭代后进行判断是否有必要继续进行训练,将有可能减少大量的时间的浪费,EarlyStopping函数就是为此而生。
代码实现:
# 参数:
# monitor:需要监视的量
# patience:当early stop被激活(如发现loss相比上一个epoch训练没有下降),则经过patience个epoch后停止训练。
# verbose:信息展示模式
# mode:‘auto’,‘min’,‘max’之一,在min模式下,如果检测值停止下降则中止训练。在max模式下,当检测值不再上升则停止训练
keras.callbacks.EarlyStopping(
monitor='val_loss',
patience=0,
verbose=0,
mode='auto'
)
- 保存最佳模型
如果我们选择在模型训练结束后进行保存,那就没有办法保证保存的模型是已经收敛的,还是开始发散的,ModelCheckpoint函数可以保证只保存最佳的模型。
代码实现:
# 参数:
# filename:字符串,保存模型的路径
# monitor:需要监视的值
# verbose:信息展示模式,0或1
# save_best_only:当设置为True时,将只保存在验证集上性能最好的模型
ModelCheckpoint(
filepath='chicken_' + str(img_width) + '_ResNet152.h5',
monitor='val_acc',
save_best_only=True,
verbose=1
)
- 可视化
数据可视化一直是帮助我们分析问题的最佳工具。
TensorBoard是TensorFlow提供的可视化工具,该回调函数将日志信息写入TensorBorad,使得你可以动态的观察训练和测试指标的图像以及不同层的激活值直方图。
代码实现:
# 参数:
# log_dir:保存日志文件的地址,该文件将被TensorBoard解析以用于可视化
# histogram_freq:计算各个层激活值直方图的频率(每多少个epoch计算一次),如果设置为0则不计算。
# write_graph: 是否在Tensorboard上可视化图,当设为True时,log文件可能会很大
# write_images: 是否将模型权重以图片的形式可视化
# embeddings_freq: 依据该频率(以epoch为单位)筛选保存的embedding层
# embeddings_layer_names:要观察的层名称的列表,若设置为None或空列表,则所有embedding层都将被观察。
# embeddings_metadata: 字典,将层名称映射为包含该embedding层元数据的文件名,参考这里获得元数据文件格式的细节。如果所有的embedding层都使用相同的元数据文件,则可传递字符串。
keras.callbacks.TensorBoard(
log_dir='./logs',
histogram_freq=0,
write_graph=True,
write_images=False,
embeddings_freq=0,
embeddings_layer_names=None,
embeddings_metadata=None
)
如果已经通过pip安装了TensorFlow,我们可通过下面的命令启动TensorBoard:
tensorboard --logdir=/full_path_to_your_logs
- 编写自己的回调函数
我们可以通过继承keras.callbacks.Callback编写自己的回调函数,回调函数通过类成员self.model访问访问,该成员是模型的一个引用。
好的,这次基本就到这里
keras中文文档中,回调函数相关:
https://keras-cn.readthedocs.io/en/latest/other/callbacks/