引言
STM32 AFCI方案AI模型中涉及了很多神经网络参数,客户使用自有数据进行训练优化时,需要调整某些参数以及度量模型的性能。方案中使用了mlflow工具对此进行可视化管理,对于熟悉Tensorflow的客户,可能希望使用TensorBoard工具。TensorBoard属于Tensorflow组件,是用于机器学习工作流所需测量和呈现的工具。通过在训练时将监控数据写入文件系统,利用GUI进行分析,或利用Web服务监控对应的文件目录,进而具备远程查看监控评估数据的能力。本文主要关注TensorBoard可视化的模型调试、优化方面的功能,以抛砖引玉,供客户入门参考。
02
TensorBoard
TensorBoard是一组用于数据可视化的GUI工具,包含在开源机器学习库Tensorflow中。TensorBoard的主要功能如下:
跟踪和可视化损失及准确率等指标
可视化模型图(操作和层)
查看权重、偏差或其他张量随时间变化的直方图
显示图片、文字和音频数据
剖析Tensorflow程序
TensorBoard虽是Tensorflow的一部分,也可以独立安装,并可用于Pytorch等其他的框架。其安装命令如下:
> pip install tensorboard
TensorBoard可以在模型端使用,也可以与Web服务及浏览器相互配合,下面将逐步介绍其功能及用法。
1. 通过fit使用TensorBoard Callback
STM32 AFCI模型使用了Tensorflow Keras's Model.fit方法进行训练,可以直接添加 “tf.keras.callback.TensorBoard”回调函数,用于创建和存储日志。TensorBoard回调函数的原型如下:
tf.keras.callbacks.TensorBoard(
log_dir='logs',
histogram_freq=0,
write_graph=True,
write_images=False,
write_steps_per_second=False,
update_freq='epoch',
profile_batch=0,
embeddings_freq=0,
embeddings_metadata=None,
**kwargs
)
我们以下面例子进行说明,下面代码中“histogram_freq=1”使能了直方图计算功能(默认情况下是关闭状态);另外update_freq采用了默认值'epoch',该参数可以采用'batch',即每个batch完成后进行度量数据的记录,也可以直接使用数值,如100,则表示每100个batch完成后进行度量数据的记录;其它参数按字面意思理解即可,我们这里使用了默认值。注意日志可以放在带有时间戳的子目录中(已注释),以便更好地进行对比训练,例子中以SettingX进行标识,代码如下:
#我们这里没有打上时间戳,有需要客户可以考虑
#log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
#Setting01: default setting + Metrics added precision, recall, F1score
# Momentum=0.9, Nesterov=True, BatchSize=256, Epochs=200
# Earlystopping, patience=10
# Learning_rate=0.02, Reduce_lr, factor=0.75, patience=12
# Metrics = ['Accuracy', 'Precision', 'Recall', 'FalsePositives', 'FalseNegatives']
#Setting02: Learning_rate = 0.1
# Momentum=0.9, Nesterov=True, BatchSize=256, Epochs=200
# Earlystopping, patience=10
# Learning_rate=0.1, Reduce_lr, factor=0.75, patience=12
# Metrics=['Accuracy', 'Precision', 'Recall', 'FalsePositives', 'FalseNegatives']
#Setting03: batchsize = 128
# Momentum=0.9, Nesterov=True, BatchSize=256, Epochs=200
# Earlystopping, patience=10
# Learning_rate=0.02, Reduce_lr, factor=0.75, patience=12
# Metrics=['Accuracy', 'Precision', 'Recall', 'FalsePositives', 'FalseNegatives']
#Setting04: Earlystopping patience=15
# Momentum=0.9, Nesterov=True, BatchSize=256, Epochs=200
# Earlystopping, patience=15
# Learning_rate=0.02, Reduce_lr, factor=0.75, patience=12
# Metrics = ['Accuracy', 'Precision', 'Recall', 'FalsePositives', 'FalseNegatives']
from tensorflow.keras.callbacks import TensorBoard
#log_dir = "logs/fit/Setting01_default"
#log_dir = "logs/fit/Setting02_LR0.1"
#log_dir = "logs/fit/Setting03_BS128"
log_dir = "logs/fit/Setting04_ES5"
tensorboard_callback = TensorBoard(log_dir=log_dir, histogram_freq=1)
为了便于介绍,我们这里仅改变少量超参,作为Setting01~Setting04进行对照。然后将tensorboard_callback加入it函数callbacks列表,即可开始模型脚本训练。
2. TensorBoard Scalars在模型调试中的作用
在机器学习过程中需要跟踪与模型性能相关的多个指标,这对于快速发现问题并确定模型是否过度拟合非常重要。使用TensorBoard Scalars可以可视化这些指标及更轻松地调试模型。
我们可以通过命令行或在Jupyter Notebooks中加载TensorBoard。在Notebooks使用%tensorboard命令,在命令行中,运行不带“%”的相同命令。
# Load the TensorBoard extension
%load_ext tensorboard
%tensorboard --logdir logs/fit
调用fit进行模型训练,在产生监控数据记录后,启动TensorBoard Scalars的界面如下图1(刷新则需要点击界面右上角,或设置自动刷新)。
模型指标中,除了度量Accuracy,Loss外,我们在例子中还添加了Precision,Recall,False_Negatives以及False_Positives来丰富指标的测量与比较。较多AFCI客户关注AI检测的精确度Precision,但也可能会关心漏报率(可用1-Recall衡量)。让我们通过下图2来在说明这些指标的含义。
样本全集:TP+FP+FN+TN
TP:样本为正,预测结果为正(预测正确)
FP:样本为负,预测结果为正(预测错误)
TN:样本为负,预测结果为负(预测正确)
FN:样本为正,预测结果为负(预测错误)
准确率(Accuracy):(TP+TN)/(TP+TN+FP+FN)
精准率(Precision):TP/(TP+FP),正确预测为正占全部预测为正的比例
召回率(Recall):TP/(TP+FN),正确预测为正占全部正样本的比例,对于AFCI预测,(1-recall)可以理解为漏报率。False_Negatives,False_Positives为预测错误的样本数,与精准率和Recall高度相关,我们也将其加入到了度量列表,以便观察。
TensorBoard Scalars可以轻松对比在不同超参下这些指标的变化情况。如下图3中对照了使用默认超参、将学习率改为0.1时、将Batch Size改为128时三种不同超参情况下,在训练集上 Precision的比较;下图4中比较了不同超参情况下Accuracy,False_Negatives,False_Positives的变化情况;下图5中比较了默认超参、将学习率改为0.1时两种超参情况下动态学习率的变化过程;下图6中则是比较了默认超参、将学习率改为0.1时两种超参情况下Precision和Recall在训练集上的收敛过程。这些均为各种指标在训练集上不同超参下的比较,当然客户也可以在验证集上进行指标比较,如下图7就是在验证集上的Precision指标对照图,使用TensorBoard工具,我们也可以很方便地进行训练集、验证集上交叉比较指标以进行模型调优。
上面我们介绍了在模型端,用fit方法调用TensorBoard Callback记录监控数据,并使用TensorBoard Scalars进行指标对比。还可以使用其他方法进行监控数据的记录,例如当脚本中使用tf.GradientTape()进行自定义训练循环时,可以使用Tensorflow summary模块,创建写入数据的监控对象类实例,并在需要时通过该实例记录监控数据。这里可以通过tf.summary. create_file_writer创建监控对象类实例,指定监控数据的写入目录的代码如下:
# 创建监控类,监控数据将写入 log_dir 目录
summary_writer = tf.summary.create_file_writer(log_dir)
在相关训练脚本适当位置记录监控数据,代码如下:
with summary_writer.as_default(): # 写入环境
# 当前时间戳 step 上的数据为 loss,写入到名为 train-loss 数据库中
tf.summary.scalar('train-loss', float(loss), step=step)
… …
有了监控数据后,就可以使用TensorBoard Scalars进行指标分析了。有需要的客户可以自行查阅Tensorflow官方summary模块的说明和用法,这里就不再赘述。
3. TensorBoard分布图和直方图
TensorBoard分布图和直方图是跟踪模型数据的一种好方法。使用官方提供的fit回调方法,在训练后TensorBoard上会多出几个选项。让我们转到Distributions分布选项卡,将看到如下图8所示界面。
这组图表显示了构成模型的张量。图中水平轴上显示Epoch数,垂直轴上显示每个张量的值。图上显示了这些张量是如何随着训练的进行而变化。较暗的区域显示值是在某个区域停留了较长时间(未更新)。如果担心模型权重在每个Epoch都没有正确更新,可以使用Ditributions发现问题。
我们在Histograms直方图选项卡上可以看到一组不同的图表,它们以直方图的形式显示模型的张量,如下图9。直方图和分布图的数据来源是相同的,只是从不同的视角、以不同的方式来表示数据的分布情况。Histograms每个图都有多个相互堆叠的直方图,代表训练过的每个Epoch。如图9中所示,使用默认超参情况下我们训练了73个Epochs,显示在图中纵坐标上;横坐标显示模型张量的取值范围,图9中显示的为模型conv_dw_1/bias_0的取值范围。直方图可以立体地自顶至底展示权重和偏置的分布,通过对模型张量数据的观察,便于发现异常,进而增强调试模型的能力。
4.TensorBoard浏览器端的使用
模型训练过程中已经将监控数据写入到了指定的日志目录中。如果需要实时远程查看(比如模型需要连续训练多日时),可以借助于浏览器和Web服务。首先启动TensorBoard Web服务,可以通过在cmd终端运行tensorboard--logdir path指Web服务监控的文件目录path,开启Web服务监控进程,如下图10所示:
此时打开浏览器,输入网址http://localhost:6006(也可以通过IP地址远程访问,具体端口号可能会变动,以命令行提示为准)即可远程监控模型训练进度。如下图11所示:
03
小结
本文结合AFCI方案简单介绍了Tensorflow框架下TensorBoard工具,TensorBoard是用于机器学习工作流所需测量和呈现的一款优秀的数据可视化工具,在文中我们主要介绍了TensorBoardScalars,Distributions,Histograms在模型调试、优化方面的功能,以几个简单的超参数的变化比较了模型指标。在实际操作中,可以调整的参数很多,如AFCI采集数据的帧长、采样率、Layers等,可以通过调整一个或多个参数,然后对一个或多个(Accuracy、Precision、Recall等)模型指标进行对比分析,工具的使用可以有效缩短模型的开发周期。另外TensorBoard还具备定制化Scalars、Images、Audios、Text、Deugger等诸多功能,也可以与其它组件配合,如与Tensorflow Profiler来分析Tensorflow代码的执行情况等。感兴趣的客户可以进一步发掘。
|
|