使用Keras回调函数和TensorBoard来检查并监控深度学习模型

引言:介绍在训练过程中如何更好地访问并控制模型内部过程的方法,使用model.fit()或model.fit_generator()在一个大型数据集上启动数十轮的训练,有点类似于扔一个纸飞机,一开始给它一点推力,之后你便再也无法控制其飞行轨迹或着陆点。如果想要避免不好的结果,更好的做法是不用纸飞机,而是用一架无人机可以感知其环境,并将数据发回给操纵者,并且能够基于当前状态自主航行。下面介绍,可以让model.fit的调用从纸飞机变为智能的自主无人机,可以自我反省并动态采取行动。

一:训练过程中将回调函数作用于模型

训练模型时,很多事情无法一开始就预测,尤其不知道需要多少轮才能得到最佳验证损失。前面所有例子都采用这一策略:训练足够多的轮次,这时模型开始过拟合,根据这第一次运行来确定训练所需要的正确轮数,然后使用这个最佳的轮数从头开始再启动一次新的训练。这种方法很浪费时间。

处理这个问题更好地方法是,当观测到验证损失不再改善时就停止训练。这可以使用Keras回调函数来实现。回调函数是在调用fit时传入模型的一个对象(即实现特定方法的类实例),他在训练过程中的不同时间点都会被模型调用。它可以访问关于模型状态和性能的所有可用数据,还可以采取行动:中断训练、保存模型、加载一组不同的权重或改变模型的状态。

回调函数的一些用法示例如下所示:

模型检查点(model checkpointing):在训练过程中的不同时间点保存模型的当前权重。

提前终止(early stopping):如果验证损失不再改善,则中断训练(当然,同时保存在训练过程中得到的最佳模型)

在训练过程中动态调节某些参数值:比如优化器的学习率

在训练过程中记录训练指标和验证指标,或将模型学到的表示可视化(这些表示也在不断更新):Keras进度条就是一个回调函数

Keras.callbacks模块包括很多内置的回调函数,比如:

keras.callbacks.ModelCheckpoint

keras.callbacks.EarlyStopping

keras.callbacks.LearningRateScheduler

keras.callbacks.ReduceLROnPlateau

keras.callbacks.CSVLogger

下面介绍几个实例:

1.ModelCheckpoint与EarlyStopping回调函数

如果监控的目标指标在设定的轮数内不再改啥,可以使用EarlyStoppong回调函数来中断训练。比如,这个回调函数可以在刚开始过拟合的时候就中断训练,从而避免用更少的轮次重新训练模型。这个回调函数常与ModelCheckpoint结合使用,后者可以在训练过程中持续不断地保存模型(你可以选择只保存目前的最佳模型,即一轮结束后具有最佳性能的模型)。

import keras
callbacks_list=[keras.callbacks.EarlyStopping(#如果不再改善就中断训练
    monitor='acc',#监控模型的精度
    patience=1,#如果精度在多于一轮的时间内不再改善,中断训练
    ),keras.callbacks.ModelCheckpoint(#在每轮过后保存当前的权重
    filepath='my_model.h5',#目标模型文件的保存路径
    monitor='val_loss',save_best_only=True)]#如果val_loss没有改善,那么不需要覆盖模型文件。这就可以始终保存在训练过程中见到的最佳模型

model.compile(optimizer='rmsprop',loss='binary_crossentropy',
              metrics=['acc'])#监控精度,所以这应该是模型指标的一部分
model.fit(x,y,epochs=10,batch_size=32,callbacks=callbacks_list,validation_data=(x_val,y_val))#由于回调函数要监控验证损失和验证精度,所以在调用fit时,药传入验证数据

2.ReduceLROnPlateau回调函数

如果验证损失不再改善,你可以使用这个回调函数来降低学习率。在训练过程中如果出现了损失平台(loss plateau),那么增大或减小学习率都是跳出局部最小值的有效策略。下面这个例子使用了ReduceLROnPlateau回调函数。

#ReduceLROnPlateau回调函数
callbacks_list=[keras.callbacks.ReduceLROnPlateau(
    monitor='val_loss',#监控模型的验证损失
    factor=0.1
    patience=10,#如果验证损失在10轮内都没有改善,那么就触发这个回调函数
    )]
model.fit(x,y,epochs=10,batch_size=32,callbacks=callbacks_list,validation_data=(x_val,y_val))#回调函数要监控验证损失,所以在调用时传入验证数据

3.编写自己的回调函数

读者可以自行编写自己的回调函数,如若项目中需要采取特定行动,实现方式是创建keras.callbacks.Callback类的子类。在这里不进行具体介绍,感兴趣的读者可以自行查询,参考《深度学习与python》。

二:TensorBoard简介:TensorFlow的可视化框架

在做研究中,实验过程中我们需要频繁且丰富的反馈信息,从而知道模型内部到底在干什么。比如首先我们有了一个idea,并将其表述为一个实验,用于验证我们的idea,运行这个实验,并处理其生成的信息,这个生成信息会激发我们的下一个idea,随着实验的反复进行,我们的idea越来越强大,越来越精确。

TensorBorad是内置于TensorFlow中的基于浏览器的可视化工具。只有当Keras使用TensorFlow后端时,这一方法才能用于Keras模型。

TensorBoard的主要用途是,在训练过程中帮助你以可视化的方法监控模型内部发生的一切。如果你监控了除模型最终损失之外的更多信息,那么就可以清楚地了解模型做了什么,没做什么,并且能够更快速的取得进展,TensorBoard具有下列部分功能,都在浏览器中实现:

*在训练中以可视化的方式监控指标

*将模型架构可视化

*将激活和梯度的直方图可视化

*以三维的形式研究嵌入

仍然举一个例子,采用IMDB情感分析任务上训练一个一维卷积神经网络。只考虑IMDB词表中的前2000个单词,这样更易于将词嵌入可视化。

import keras
from keras.datasets import imdb
from keras import layers
from keras.preprocessing import sequence
from keras.utils import pad_sequences

max_features=2000
max_len=500

(x_train,y_train),(x_test,y_test)=imdb.load_data(num_words=max_features)
x_train=pad_sequences(x_train,maxlen=max_len)
x_test=pad_sequences(x_test,maxlen=max_len)
model=keras.models.Sequential()
model.add(layers.Embedding(max_features,128,input_length=max_len,name='embed'))#max_features表示数据集中的单词总数,即词典的大小
#128表示每个单词的嵌入向量的大小 input_length表示输入序列的长度,即每个输入文本的最大单词数量,不足的将被填充
#name为Embedding层的名称
model.add(layers.Conv1D(32,7,activation='relu'))
model.add(layers.MaxPool1D(5))
model.add(layers.Conv1D(32,7,activation='relu'))
model.add(layers.GlobalMaxPool1D())
model.add(layers.Dense(1))
model.summary()
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])

在使用TensorBoard之前,我们需要创建一个目录,用于保存它生成的日志文件。用一个TensorBoard回调函数实例来启动训练。这个回调函数会将日志写入硬盘的指定位置。

callbacks=[
    keras.callbacks.TensorBoard(
        log_dir='my_log_dir',#日志文件将被写入这个位置
        histogram_freq=1,#每一轮之后记录激活直方图
        embeddings_freq=1#每一轮之后记录嵌入数据
    )
]
history=model.fit(
    x_train,y_train,
    epochs=2,
    batch_size=128,
    validation_split=0.2,
    callbacks=callbacks
)

现在可以在命令行启动TensorBoard服务器,指示它读取回调函数当前正在写入的日志。在安装TensorFlow时,tensorboard程序应该已经自动安装到计算机里了。然后可以用浏览器打开http://localhost:6006,并查看模型的训练过程。除了训练指标和验证指标的实时图表之外,还可以访问HISTOGRAMS(直方图)标签页,并查看美观的直方图可视化,直方图中是每层的激活值。EMBEDDINGS(嵌入)标签页让你可以查看输入词表中2000个单词的嵌入位置和空间关系,它们都是由第一个Embedding层学到的。因为嵌入空间是128维的,所以TensorBoard会使用你选择的降维算法自动将其降至二维或三维,可选的降维算法有主成分分析和t分布随机近邻嵌入。GRAPHS(图)标签页显示的是Keras模型背后的底层TensorFlow运算图的交互式可视化。

注意,Keras还提供了另一种更简介的方法---keras.utils.plot_model函数,他可以将模型绘制为层组成的图,而不是TensorFlow运算组成的图。使用这个函数需要安装python的pydot库和pydot-ng库和graphviz库。

from keras.utils import plot_model
plot_model(model,to_file='model.png')

这会创建一张PNG图像

 还可以选择在层组成的图片中显示形状信息,只需要在第二行代码处加一个参数show_shapes=True即可。

 有任何问题欢迎私信留言等,一键三连,感谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值