Tensorboard详解

1. Tensorboard简介

对大部分人而言,深度神经网络就像一个黑盒子,其内部的组织、结构、以及其训练过程很难理清楚,这给深度神经网络原理的理解和工程化带来了很大的挑战。为了解决这个问题,tensorboard应运而生。Tensorboard是tensorflow内置的一个可视化工具,它通过将tensorflow程序输出的日志文件的信息可视化使得tensorflow程序的理解、调试和优化更加简单高效。Tensorboard的可视化依赖于tensorflow程序运行输出的日志文件,因而tensorboard和tensorflow程序在不同的进程中运行。

那如何启动tensorboard呢?下面代码定义了一个简单的用于实现向量加法的计算图。

1.	import tensorflow as tf

2.	# 定义一个计算图,实现两个向量的减法操作

3.	# 定义两个输入,a为常量,b为变量

4.	a=tf.constant([10.0, 20.0, 40.0], name='a')

5.	b=tf.Variable(tf.random_uniform([3]), name='b')

6.	output=tf.add_n([a,b], name='add')

7.	# 生成一个具有写权限的日志文件操作对象,将当前命名空间的计算图写进日志中

8.	writer=tf.summary.FileWriter('/path/to/logs', tf.get_default_graph())

9.	writer.close()

 

在上面程序的8、9行中,创建一个writer,将tensorboard summary写入文件夹/path/to/logs,然后运行上面的程序,在程序定义的日志文件夹/path/to/logs目录下,生成了一个新的日志文件events.out.tfevents.1524711020.bdi-172,如下图1所示。当然,这里的日志文件夹也可以由读者自行指定,但是要确保文件夹存在。如果使用的tensorboard版本比较低,那么直接运行上面的代码可能会报错,此时,可以尝试将第8行代码改为file_writer=tf.train.SummaryWriter('/path/to/logs', sess.graph)

图1 日志目录下生成的events文件路径

接着运行如图2所示命令tensorboard –logdir /path/to/logs来启动服务。

图2 linux下启动tensorboard服务的命令

注意,当系统报错,找不到tensorboard命令时,则需要使用绝对路径调用tensorboard,例如下面的命令形式:

python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory 

图3 tensorflow向量相加程序的计算图的可视化结果

启动tensorboard服务后,在本地浏览器中输入http://188.88.88.88:6006,会看到如上图3所示的界面。注意,由于本节程序是在Linux服务器上运行的,所以需要输入该服务器完整的IP地址(http://188.88.88.88:6006指本实验所使用的服务器IP地址,实际操作时需要修改成实际使用的服务器IP),若tensorflow程序是在本机上运行,则需将上述IP地址http://188.88.88.88:6006替换成localhost。

 

根据上述内容描述,tensorboard的启动过程可以概括为以下几步:

1.创建writer,写日志文件
writer=tf.summary.FileWriter('/path/to/logs', tf.get_default_graph())

2.保存日志文件
writer.close()

3.运行可视化命令,启动服务
tensorboard –logdir /path/to/logs

4.打开可视化界面
通过浏览器打开服务器访问端口http://xxx.xxx.xxx.xxx:6006

注意:tensorboard兼容Google浏览器或Firefox浏览器,对其他浏览器的兼容性较差,可能会提示bug或出现其他性能上的问题。

图4 tensorboard各栏目的默认界面

在这里使用tensorboard1.4.1,较以往版本有很多不同。首先从界面上,此版本的tensorboard导航栏中只显示有内容的栏目,如GRAPHS,其他没有相关数据的子栏目都隐藏在INACTIVE栏目中,点击这些子栏目则会显示一条如图4所示的提示信息,指示使用者如何序列化相关数据。除此之外,在栏目的数量上也有增加,新增了DISTRIBUTIONS、PROJECTOR、TEXT、PR CURVES、PROFILE五个栏目。

Tensorboard的可视化功能很丰富。SCALARS栏目展示各标量在训练过程中的变化趋势,如accuracy、cross entropy、learning_rate、网络各层的bias和weights等标量。如果输入数据中存在图片、视频,那么在IMAGES栏目和AUDIO栏目下可以看到对应格式的输入数据。在GRAPHS栏目中可以看到整个模型计算图结构。在HISTOGRAM栏目中可以看到各变量(如:activations、gradients,weights 等变量)随着训练轮数的数值分布,横轴上越靠前就是越新的轮数的结果。DISTRIBUTIONS和HISTOGRAM是两种不同形式的直方图,通过这些直方图可以看到数据整体的状况。PROJECTOR栏目中默认使用PCA分析方法,将高维数据投影到3D空间,从而显示数据之间的关系。

2. ­­Tensorflow数据流图

从tensorboard中我们可以获取更多,远远不止图3所展示的。这一小节将从计算图结构和结点信息两方面详细介绍如何理解tensorboard中的计算图,以及从计算图中我们能获取哪些信息。

2.1 Tensorflow的计算图结构

如上图3展示的是一个简单的计算图,图结构中主要包含了以下几种元素:

Namespace,表示命名空间

OpNode,操作结点

Constant,常量

Dataflow edge,数据流向边

Control dependency edge,控制依赖边

Reference edge,参考边

除此之外,还有Unconnected series、Connected series、Summary等元素。这些元素构成的计算图能够让我们对输入数据的流向,各个操作之间的关系等有一个清晰的认识。

图5 初始的计算图结构

如上图5,是一个简单的两层全连接神经网络的计算图。仅仅从图5,我们很难快速了解该神经网络的主体数据流关系,因为太多的细节信息堆积在了一起。这还只是一个两层的简单神经网络,如果是多层的深度神经网络,其标量的声明,常量、变量的初始化都会产生新的计算结点,这么多的结点在一个页面上,那其对应的计算图的复杂性,排列的混乱性难以想象。所以我们需要对计算图进行整理,避免主要的计算节点淹没在大量的信息量较小的节点中,让我们能够更好的快速抓住主要信息。通过定义子命名空间,可以达到整理节点、让可视化效果更加清晰的目的。

图6 整理后的计算图结构

如上图6,就是通过定义子命名空间整理结点后的效果。该计算图只显示了最顶层的各命名空间之间的数据流关系,其细节信息被隐藏起来了,这样便于把握主要信息。

图7为加入子命名空间后的部分代码截图。代码中,将输入数据都放在了input命名空间中,还使用了perdition、moving_averages、loss、train等命名空间去整理对应的操作过程。

图7 用命名空间整理计算图的代码截图

图8 手动将节点从主图中移除

除此之外,我们还可以通过手动将不重要的节点从主图中移除来简化计算图,如上图8,右键点击想要移除的节点,会出现“Remove from main graph”按钮,点击该按钮,就可以移除对应节点了。

2.2 结点的信息

Tensorboard除了可以展示整体的计算图结构之外,还可以展示很多细节信息,如结点的基本信息、运行时间、运行时消耗的内存、各结点的运行设备(GPU或者CPU)等。

2.2.1 基本信息

前面的部分介绍了如何将计算图的细节信息隐藏起来,但是有的时候,我们需要查看部分重要命名空间下的节点信息,那这些细节信息如何查看呢?对于节点信息,双击图8中的任意一个命名空间,就会展开对应命名空间的细节图(再次双击就可以收起细节图)。

 

图9 展开input命名空间节点信息图

上图9是input命名空间的展开图,展开图中包含了两个操作节点(x_input和y_input)。除了了解具体包含的操作节点以及其他元素外,我们还可以获取粒度更小的信息。

图10 input命名空间的放大的细节图

图11 命名空间的节点信息

图12 计算节点的基本信息

上图10所示为图9中input命名空间展开图的放大图。观察图10,我们可以了解到输入数据x、y的维度,图中x的向量维度为784维,y为10维,?表示样本数量。本节演示中使用的是mnist数据集,mnist数据集是一个针对图片的10分类任务,输入向量维度是784,这说明可以通过计算图上这些信息,来校验输入数据是否正确。通过左键单击命名空间或者操作节点,屏幕的右上角会显示对应的具体信息。

如上图11中,右上角绿色框标注的部分为命名空间layer2的具体信息。如上图12中,右上角绿色框标注的部分为节点x_input的具体信息。

2.2.2 其他信息

除了节点的基本信息之外,tensorboard还可以展示每个节点运行时消耗的时间、空间、运行的机器(GPU或者CPU)等信息。本小节将详细讲解如何使用tensorboard展示这些信息。这些信息有助于快速获取时间、空间复杂度较大的节点,从而指导后面的程序优化。将2.1节中图7所展示的代码的session部分改成如下所示的程序,就可以将程序运行过程中不同迭代轮数中tensorflow各节点消耗的时间和空间等信息写入日志文件中,然后通过读取日志文件将这些信息用tensorboard展示出来。

1	#创建writer对象
2	writer=tf.summary.FileWriter("/path/to/metadata_logs",\
3	tf.get_default_graph())
4	with tf.Session() as sess:
5	tf.global_variables_initializer().run()
6	for i in range(TRAINING_STEPS):
7	x_batch, y_batch=mnist.train.next_batch(BATCH_SIZE)
8	if i%1000==0:
9	#这里通过trace_level参数配置运行时需要记录的信息,
10	# tf.RunOptions.FULL_TRACE代表所有的信息
11	run_options = tf.RunOptions(\
12	trace_level=tf.RunOptions.FULL_TRACE)
13	#运行时记录运行信息的proto,pb是用来序列化数据的
14	run_metadata = tf.RunMetadata()
15	#将配置信息和记录运行信息的proto传入运行的过程,从而记录运行时每一个节点的时间、空间开销信息
16	_, loss_value, step = sess.run(\
17	[train_op, loss, global_step], \
18	feed_dict={x: x_batch, y_: y_batch},\
19	options=run_options, run_metadata=run_metadata)
20	#将节点在运行时的信息写入日志文件
21	writer.add_run_metadata(run_metadata, 'step %03d' % i)
22	else:
23	_, loss_value, step = sess.run(\
24	[train_op, loss, global_step], \
25	feed_dict={x: xs, y_: ys})
26	writer.close()

运行上面的程序,生成日志文件存储在/path/to/metadata_logs/目录下,启动tensorboard服务,读取日志文件信息,将每一个节点在不同迭代轮数消耗的时间、空间等信息展示出来。

 

图13 选择迭代轮数对应记录页面

如上图13所示,在浏览器中打开可视化界面,进入GRAPHS子栏目,点击Session runs选框,会出现一个下拉菜单,这个菜单中展示了所有日志文件中记录的运行数据所对应的迭代轮数。任意选择一个迭代轮数,页面右边的区域会显示对应的运行数据。

图14 第9000轮迭代时不同计算节点消耗时间的可视化效果图

图15 第9000轮迭代时不同计算节点占有存储的可视化效果图

如上图14所示,选择了第9000轮的运行数据,然后选择Color栏目下的Compute time选项,GRAPHS栏目下就会显示tensorflow程序每个计算节点的运行时间。图中使用颜色的深浅来表示运行时间的长短,颜色深浅对应的具体运行时间可以从页面左侧的颜色条看出。由图14可知,train命名空间运行时所消耗的时间最长,Variable命名空间所消耗的时间比较短,无色表示不消耗时间。

如上图15展示了tensorflow各个节点所占用的空间大小。与衡量运行时所消耗的时间方法类似,使用颜色的深浅来标识所占用内存的大小。颜色条上的数字说明,占用的最大空间为677MB,最小空间为0B。train命名空间占用的存储空间最大。

除了时间和空间指标,tensorboard还可以展示各节点的运行设备(GPU还是CPU)、XLA Cluster、TPU Compatibility等,这些全部都在Color栏目下作为选项供选择。这些指标都是将节点染色,通过不同颜色以及颜色深浅来标识结果的。如下图16,是TPU Compatibility展示图。

图16 第9000轮迭代时不同计算节点的TPU Compatibility效果展示图

1. Tensorflow监控指标可视化

除了GRAPHS栏目外,tensorboard还有IMAGES、AUDIO、SCALARS、HISTOGRAMS、DISTRIBUTIONS、FROJECTOR、TEXT、PR CURVES、PROFILE九个栏目,本小节将详细介绍这些子栏目各自的特点和用法。

1.1 IMAGES

图像仪表盘,可以显示通过tf.summary.image()函数来保存的png图片文件。

1. # 指定图片的数据源为输入数据x,展示的相对位置为[-1,28,28,1]
2. image_shape=tf.reshape(x, [-1, 28, 28,1])
3. # 将input命名空间下的图片放到summary中,一次展示10张
4. tf.summary.image('input', image_shape, 10)

如上面代码,将输入数据中的png图片放到summary中,准备后面写入日志文件。运行程序,生成日志文件,然后在tensorboard的IMAGES栏目下就会出现如下图一所示的内容(实验用的是mnist数据集)。仪表盘设置为每行对应不同的标签,每列对应一个运行。图像仪表盘仅支持png图片格式,可以使用它将自定义生成的可视化图像(例如matplotlib散点图)嵌入到tensorboard中。该仪表盘始终显示每个标签的最新图像。

 

图一 tensorboard中的IMAGES栏目内容展开界面

1.2 AUDIO

音频仪表盘,可嵌入音频的小部件,用于播放通过tf.summary.audio()函数保存的音频。

一个音频summary要存成 的二维字符张量。其中,k为summary中记录的音频被剪辑的次数,每排张量是一对[encoded_audio, label],其中,encoded_audio 是在summary中指定其编码的二进制字符串,label是一个描述音频片段的UTF-8编码的字符串。

仪表盘设置为每行对应不同的标签,每列对应一个运行。该仪表盘始终嵌入每个标签的最新音频。

1.3 SCALARS

Tensorboard 的标量仪表盘,统计tensorflow中的标量(如:学习率、模型的总损失)随着迭代轮数的变化情况。如下图二所示,SCALARS栏目显示通过函数tf.summary.scalar()记录的数据的变化趋势。如下所示代码可添加到程序中,用于记录学习率的变化情况。

1. # 在learning_rate附近添加,用于记录learning_rate
2. tf.summary.scalar('learning_rate', learning_rate)

Scalars栏目能进行的交互操作有:

  • 点击每个图表左下角的蓝色小图标将展开图表
  • 拖动图表上的矩形区域将放大
  • 双击图表将缩小
  • 鼠标悬停在图表上会产生十字线,数据值记录在左侧的运行选择器中。

 

图二 tensorboard中的SCALARS栏目内容展开界面

此外,读者可通过在仪表盘左侧的输入框中,编写正则表达式来创建新文件夹,从而组织标签。

1.4 HISTOGRAMS

Tensorboard的张量仪表盘,统计tensorflow中的张量随着迭代轮数的变化情况。它用于展示通过tf.summary.histogram记录的数据的变化趋势。如下代码所示:

1. tf.summary.histogram(weights, 'weights')

上述代码将神经网络中某一层的权重weight加入到日志文件中,运行程序生成日志后,启动tensorboard就可以在HISTOGRAMS栏目下看到对应的展开图像,如下图三所示。每个图表显示数据的时间“切片”,其中每个切片是给定步骤处张量的直方图。它依据的是最古老的时间步原理,当前最近的时间步在最前面。通过将直方图模式从“偏移”更改为“叠加”,如果是透视图就将其旋转,以便每个直方图切片都呈现为一条相互重叠的线。

图三 tensorboard中的HISTOGRAMS栏目内容展开界面

1.5 DISTRIBUTIONS

Tensorboard的张量仪表盘,相较于HISTOGRAMS,用另一种直方图展示从tf.summary.histogram()函数记录的数据的规律。它显示了一些分发的高级统计信息。

如下图四所示,图表上的每条线表示数据分布的百分位数,例如,底线显示最小值随时间的变化趋势,中间的线显示中值变化的方式。从上至下看时,各行具有以下含义:[最大值,93%,84%,69%,50%,31%,16%,7%,最小值]。这些百分位数也可以看作标准偏差的正态分布:[最大值,μ+1.5σ,μ+σ,μ+0.5σ,μ,μ-0.5σ,μ-σ,μ-1.5σ,最小值],使得从内侧读到外侧的着色区域分别具有宽度[σ,2σ,3σ]。

图四 tensorboard中的DISTRIBUTIONS栏目内容展开界面

1.6 PROJECTOR

嵌入式投影仪表盘,全称Embedding Projector,是一个交互式的可视化工具,通过数据可视化来分析高维数据。例如,读者可在模型运行过程中,将高维向量输入,通过embedding projector投影到3D空间,即可查看该高维向量的形式,并执行相关的校验操作。Embedding projector的建立主要分为以下几个步骤:

1)建立embedding tensor

1. #1. 建立 embeddings
2. embedding_var = tf.Variable(batch_xs, name="mnist_embedding")
3. summary_writer = tf.summary.FileWriter(LOG_DIR)

2)建立embedding projector 并配置

1. config = projector.ProjectorConfig()
2. embedding = config.embeddings.add()
3. embedding.tensor_name = embedding_var.name
4. embedding.metadata_path = path_for_mnist_metadata #'metadata.tsv'
5. embedding.sprite.image_path = path_for_mnist_sprites #'mnistdigits.png'
6. embedding.sprite.single_image_dim.extend([28,28])
7. projector.visualize_embeddings(summary_writer, config)

3)将高维变量保存到日志目录下的checkpoint文件中

1. sess = tf.InteractiveSession()
2. sess.run(tf.global_variables_initializer())
3. saver = tf.train.Saver()
4. saver.save(sess, os.path.join(LOG_DIR, "model.ckpt"), 1)

4)将metadata与embedding联系起来,将 vector 转换为 images,反转灰度,创建并保存 sprite image

1. to_visualise = batch_xs
2. to_visualise = vector_to_matrix_mnist(to_visualise)
3. to_visualise = invert_grayscale(to_visualise)
4. sprite_image = create_sprite_image(to_visualise)
5. plt.imsave(path_for_mnist_sprites,sprite_image,cmap='gray')

5)运行程序,生成日志文件,启动服务,tensorboard中的PROJECTOR栏将展示投影后的数据的动态图,如下图五所示。

图五 tensorboard中的PROJECTOR栏目内容展开界面

Embedding Projector从模型运行过程中保存的checkpoint文件中读取数据,默认使用主成分分析法(PCA)将高维数据投影到3D空间中,也可以设置选择另外一种投影方法,T-SNE。除此之外,也可以使用其他元数据进行配置,如词汇文件或sprite图片。

1.7 TEXT

文本仪表盘,显示通过tf.summary.text()函数保存的文本片段,包括超链接、列表和表格在内的Markdown功能均支持。

1.8 PR CURVES

PR CURVES仪表盘显示的是随时间变化的PR曲线,其中precision为横坐标,recall为纵坐标。如下代码创建了一个用于记录PR曲线的summary。

1. # labels为输入的y, predition为预测的y值
2. # num_thresholds为多分类的类别数量
3. tensorboard.summary.pr_curve(name='foo',
4. predictions=predictions,
5. labels=labels,
6. num_thresholds=11)

 

图六 tensorboard中的PR CURVES栏目内容展开界面

(图片来自tensorboard官方的github项目,链接为:

https://github.com/tensorflow/tensorboard/blob/master/tensorboard/plugins/pr_curve/images/pr_curves_intro.png)

上图六为tensorboard上PR CURVES栏目在有内容时的首页,没有内容时就隐藏在INACTIVE栏目下。

训练模型时,经常需要在查准率和查全率之间权衡,PR曲线能够帮助我们找到这个权衡点。每条曲线都对应一个二分类问题,所以,针对多分类问题,每一个类都会生成一条对应的PR曲线。

1.9 PROFILE

Tensorboard的配置文件仪表盘,该仪表盘上包含了一套TPU工具,可以帮助我们了解,调试,优化tensorflow程序,使其在TPU上更好的运行。

但并不是所有人都可以使用该仪表盘,只有在Google Cloud TPU上有访问权限的人才能使用配置文件仪表盘上的工具。而且,该仪表盘与其他仪表盘一样,都需要在模型运行时捕获相关变量的跟踪信息,存入日志,方可用于展示。

在PROFILE仪表盘的首页上,显示的是程序在TPU上运行的工作负载性能,它主要分为五个部分:Performance Summary、Step-time Graph、Top 10 Tensorflow operations executed on TPU、Run Environment和Recommendation for Next Step。如下图七所示:

 

图七 tensorboard中的PROFILE栏目内容展开界面

(图片来自tensorboard的github项目

https://github.com/tensorflow/tensorboard/blob/master/tensorboard/plugins/profile/docs/overview-page.png

其中,Performance Summary包括以下四项:

1)所有采样步骤的平均步长时间

2)主机空闲时间百分比

3)TPU空闲时间百分比

4)TPU矩阵单元的利用率

Run Environment(运行环境)包括以下五方面:

1)使用的主机数量

2)使用的TPU类型

3)TPU内核的数量

4)训练批次的大小(batch size)

5)作业信息(构建命令和运行命令)

2. 总结

本系列介绍了tensorflow中一个非常重要的工具——tensorboard。Tensorboard是一个可视化工具,它能够以直方图、折线图等形式展示程序运行过程中各标量、张量随迭代轮数的变化趋势,它也可以显示高维度的向量、文本、图片和音频等形式的输入数据,用于对输入数据的校验。Tensorflow函数与tensorboard栏目的对应关系如表1所示。

Tensorboard的可视化功能对于tensorflow程序的训练非常重要,使用tensorboard进行调参主要分为以下几步:

1)校验输入数据

如果输入数据的格式是图片、音频、文本的话,可以校验一下格式是否正确。如果是处理好的低维向量的话,就不需要通过tensorboard校验。

2)查看graph结构

查看各个节点之间的数据流关系是否正确,再查看各个节点所消耗的时间和空间,分析程序优化的瓶颈。

3)查看各变量的变化趋势

在SCALAR、HISTOGRAMS、DISTRIBUTIONS等栏目下查看accuracy、weights、biases等变量的变化趋势,分析模型的性能

4)修改code

根据3)和4)的分析结果,优化代码。

5)选择最优模型

6)用Embedding Projector进一步查看error出处

Tensorboard虽然只是tensorflow的一个附加工具,但熟练掌握tensorboard的使用,对每一个需要对tensorflow程序调优的人都非常重要,它可以显著提高调参工作的效率,帮助我们更快速地找到最优模型。

转载自: 

https://zhuanlan.zhihu.com/p/36946874

https://zhuanlan.zhihu.com/p/37022051

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页