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 41on port 60062 (You can navigate to http://127.0.1.1:6006)

  将 http://127.0.1.1 在浏览器中打开,就可以看到 Web 端的可视化了




paddlenlp taskflow 抽取 paddlepaddle tensorflow_信息可视化


  具体的参数表示的含义可以参照官网的解释


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

1def start_trainer(self,X_train,Y_train,X_val,Y_val):
 2         #获得训练器
 3         trainer = self.get_trainer()
 45         result_lists = []
 6def event_handler(event):
 7             ifisinstance(event, paddle.event.EndIteration):
 8                 ifevent.batch_id % 10 == 0:
 9                     print "\nPass %d, Batch %d, Cost %f, %s" % (
10event.pass_id, event.batch_id, event.cost, event.metrics)
11ifisinstance(event, paddle.event.EndPass):
12                     # 保存训练好的参数
13                 withopen('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)
2021                 result_lists.append((event.pass_id, result.cost,
22                         result.metrics['classification_error_evaluator']))
2324# 开始训练25         train_reader = paddle.batch(paddle.reader.shuffle(
26                 reador.reader_creator(X_train,Y_train),buf_size=200),
27                 batch_size=16)
2829         val_reader = paddle.batch(paddle.reader.shuffle(
30                 reador.reader_creator(X_val,Y_val),buf_size=200),
31                 batch_size=16)
3233         trainer.train(reader=train_reader,num_passes=20,event_handler=event_handler)
3435#找到训练误差最小的一次结果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 画图,输出如下收敛的图:


paddlenlp taskflow 抽取 paddlepaddle tensorflow_信息可视化_02


  但是这样不能观察到神经网络在训练过程中的每个神经元的具体变化情况,不如 tensorboard 的功能多,只能看到我们在训练过程中的 loss 下降的情况,训练是否收敛等。


PaddlePaddle 的新版可视化工具--VisualDL

  大概就在上周,1.16 日,PaddlePaddle 和 Echarts 团队练手打造了 VisualDL 可视化工具 ,我试用了以后发现和 tensorborad 的功能好像!简单说说特性:

  • 支持 Scaler 打点数据展示,可将训练信息以折线图的形式展现出来,方便观察整体趋势,还能在同一个可视化视图中呈现多条折线,方便用户对比分析。
  • 支持 Image 图片展示可轻松查看数据样本的质量,也可以方便地查看训练的中间结果,例如卷积层的输出或者 GAN 生成的图片。
  • 支持 Histogram 参数分布展示功能,方便用户查看参数矩阵中数值的分布曲线,并随时观察参数数值分布的变化趋势。
  • 支持 Graph 查看深度神经网络的模型结构。

  这样一看,其实基本上实现了 tensorboard 的功能,或者应该简称“Bring TensorBorad To PaddlePaddle”。


总结

  总的来说,Tensorboard 是一个非常好的可视化工具,mxnet 原来只能可视化神经网络结构图,paddlepaddle 原来只能看 loss 下降的训练收敛图,但是后来 mxnet 把 tensorborad 搞进去了,paddlepaddle 发布了一个新的工具 VisualDL,实现了 Tensorborad 的功能,还是非常厉害的!大家可以多体验体验,这样就不用像上篇文章手动的去画每个网络结果中间的输出结果图,直接用 VisualDL 的 Image 展示就可以了,更加方便我们理解模型,观察模型训练的过程,简单来说,让我们不透明的“炼丹术”变得更加透明清楚了~