【深度学习系列】PaddlePaddle可视化之VisualDL
上篇文章我们讲了如何对模型进行可视化,用的keras手动绘图输出CNN训练的中途结果,本篇文章将讲述如何用PaddlePaddle新开源的VisualDL来进行可视化。在讲VisualDL之前,我们先了解一下常用的Tensorflow的可视化工具---Tensorboard。
Tensorflow的可视化
Tensorboard是Tensorflow自带的可视化模块,我们可以通过Tensorboard直观的查看神经网络的结构,训练的收敛情况等。要想掌握Tensorboard,我们需要知道一下几点:
- 支持的数据形式
- 具体的可视化过程
- 如何对一个实例使用Tensorboard
数据形式
(1)标量Scalars
(2)图片Images
(3)音频Audio
(4)计算图Graph
(5)数据分布Distribution
(6)直方图Histograms
(7)嵌入向量Embeddings
可视化过程
(1)建立一个graph。(2)确定在graph中的不同节点设置summary operations。(3)将(2)中的所有summary operations合并成一个节点,运行合并后的节点。(4)使用tf.summary.FileWriter将运行后输出的数据都保存到本地磁盘中。(5)运行整个程序,并在命令行输入运行tensorboard的指令,打开web端可查看可视化的结果
使用Tensorborad的实例
这里我就不讲的特别详细啦,如果用过Tensorflow的同学其实很好理解,只需要在平时写的程序后面设置summary,tf.summary.scalar记录标量,tf.summary.histogram记录数据的直方图等等,然后正常训练,最后把所有的summary合并成一个节点,存放到一个地址下面,在linux界面输入一下代码:
tensorboard --logdir=‘存放的总summary节点的地址’
然后会出现以下信息:
1 Starting TensorBoard 41 on port 6006 2 (You can navigate to http://127.0.1.1:6006)
将http://127.0.1.1:6006在浏览器中打开,就可以看到web端的可视化了
具体的参数表示的含义可以参照官网的解释
MXNet的可视化
MXNet的可视化之前一直使用mx.viz.plot_network来构建一个神经网络图,但是后来有一位阿里的同学把tensorboard封装在了mxnet里,具体可以参照https://github.com/dmlc/tensorboard,可以对照他写的这篇文章来看Bring TensorBoard to MXNet。
ps:这个功能好像去年年初他们就开始搞了,看到他发的朋友圈才知道没过几个月就上线了,真效率,喜欢mxnet的同学可以尝试一下。
PaddlePaddle的可视化--EventHandler
在PaddlePaddle发布VisualDL之前,我一直是用event_handler来可视化训练的收敛情况。我找了一段之前写的一个类里的小代码来展示如何使用event_handler
1 def start_trainer(self,X_train,Y_train,X_val,Y_val): 2 #获得训练器 3 trainer = self.get_trainer() 4 5 result_lists = [] 6 def event_handler(event): 7 if isinstance(event, paddle.event.EndIteration): 8 if event.batch_id % 10 == 0: 9 print "\nPass %d, Batch %d, Cost %f, %s" % ( 10 event.pass_id, event.batch_id, event.cost, event.metrics) 11 if isinstance(event, paddle.event.EndPass): 12 # 保存训练好的参数 13 with open('params_pass_%d.tar' % event.pass_id, 'w') as f: 14 parameters.to_tar(f) 15 # feeding = ['x','y'] 16 result = trainer.test( 17 reader=val_reader) 18 # feeding=feeding) 19 print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics) 20 21 result_lists.append((event.pass_id, result.cost, 22 result.metrics['classification_error_evaluator'])) 23 24 # 开始训练 25 train_reader = paddle.batch(paddle.reader.shuffle( 26 reador.reader_creator(X_train,Y_train),buf_size=200), 27 batch_size=16) 28 29 val_reader = paddle.batch(paddle.reader.shuffle( 30 reador.reader_creator(X_val,Y_val),buf_size=200), 31 batch_size=16) 32 33 trainer.train(reader=train_reader,num_passes=20,event_handler=event_handler) 34 35 #找到训练误差最小的一次结果 36 best = sorted(result_lists, key=lambda list: float(list[1]))[0] 37 print 'Best pass is %s, testing Avgcost is %s' % (best[0], best[1]) 38 print 'The classification accuracy is %.2f%%' % (100 - float(best[2]) * 100)
trainer = self.get_trainer()不用管,因为之前写的一个函数叫get_trainer,你可以先定义trainer,然后放在这里,后面设一个空列表存放每次训练的结果,我这个代码里叫result_lists,然后定义event_handler函数,在开始训练,这样每次训练的结果都会传入result_lists这个列表里面,最后进行排序,把最优结果放到best里,输出就可以。最后用event_handler_plot画图,输出如下收敛的图:
但是这样不能观察到神经网络在训练过程中的每个神经元的具体变化情况,不如tensorboard的功能多,只能看到我们在训练过程中的loss下降的情况,训练是否收敛等。
PaddlePaddle的新版可视化工具--VisualDL
大概就在上周,1.16日,PaddlePaddle和Echarts团队练手打造了VisualDL可视化工具 ,我试用了以后发现和tensorborad的功能好像!简单说说特性:
- 支持Scaler打点数据展示,可将训练信息以折线图的形式展现出来,方便观察整体趋势,还能在同一个可视化视图中呈现多条折线,方便用户对比分析。
- 支持Image图片展示可轻松查看数据样本的质量,也可以方便地查看训练的中间结果,例如卷积层的输出或者GAN生成的图片。
- 支持Histogram参数分布展示功能,方便用户查看参数矩阵中数值的分布曲线,并随时观察参数数值分布的变化趋势。
- 支持Graph查看深度神经网络的模型结构。
这样一看,其实基本上实现了tensorboard的功能,或者应该简称“Bring TensorBorad To PaddlePaddle”。不知道博客园怎么放gif,具体的图片展示就直接看官网吧
总结
总的来说,Tensorboard是一个非常好的可视化工具,mxnet原来只能可视化神经网络结构图,paddlepaddle原来只能看loss下降的训练收敛图,但是后来mxnet把tensorborad搞进去了,paddlepaddle发布了一个新的工具VisualDL,实现了Tensorborad的功能,还是非常厉害的!大家可以多体验体验,这样就不用像上篇文章手动的去画每个网络结果中间的输出结果图,直接用VisualDL的Image展示就可以了,更加方便我们理解模型,观察模型训练的过程,简单来说,让我们不透明的“炼丹术”变得更加透明清楚了~