TensorBoard是通过一些操作将数据记录到文件中,然后读取文件来完成作图的,关键的几个步骤如下。
(1)汇总(Summary):在定义计算图时,在适当的位置加上一些汇总操作。
(2)合并(Merge):在训练时可能加了多个汇总操作,需要使用 tf.summary.merge_all将这些汇总操作合并成一个操作,由它来产生所有的汇总数据。
(3)运行(Run):在没有运行时,操作是不会执行的,仅仅是定义了一下,在运行(开始训练)时,需要通过 tf.summary.FileWrite()指定一个目录,告诉程序把产生的文件放到哪儿,然后在运行时使用add_summary()来将某一步的汇总数据记录到文件中。
当训练完成后,在命令行使用 tensorboard--logdir=path/to/log-directory 来启动TensorBoard,按照提示在浏览器打开页面,注意把 path/to/log-directory 替换成上述步骤(3)中指定的目录。
典型的TensorFlow图可以拥有成千上万个节点,太多的节点导致无法轻松查看,甚至可以使用标准图形工具进行布局。为了简化,可以限定变量名称,并且可视化工具使用该信息来定义图中节点上的层次结构。默认情况下,仅显示此层次结构的顶部。下面是一个示例,它定义了hidden名称范围内的三个操作:
这将产生以下三个操作名称:hidden/alpha、hidden/weights、hidden/biases,默认情况下,可视化工具将这三个节点全部折叠成标记的节点 hidden。额外的细节不会丢失。可以双击,或者单击右上角“+”展开节点,然后会看到三个子节点 alpha、weights 和biases。这里以一个简单的计算图为实例,如图4-1所示。
图4-1 一个简单的计算图
通过名称域把节点分组得到可读性高的图表是很关键的。在构建一个模型时,名称域可以用来控制可视化结果。名称域越好,可视性就越好。TensorFlow图表有两种连接关系:数据依赖和控制依赖。数据依赖显示两个操作之间的tensor流程,用实心箭头指示;控制依赖用点线表示。在已展开的视图中,除了用点线连接的 CheckNumerics和control_dependency,所有连接都是数据依赖的。其中结构图的符号、名称及意义如表4-1所示。
表4-1 结构图符号、名称及意义
TensorFlow日志生成函数与TensorBoard界面栏的对应关系如表4-2所示。
表4-2 TensorFlow日志生成函数与TensorBoard界面栏的对应关系
TensorBoard使用以tf_events为后缀的文件类型(events文件)来记录训练过程中的各种事件并存储在指定的日志目录中。在该文件中,可以记录与展示以下数据形式。
(1)标量:存储和显示诸如学习率、损失等单个值的变化趋势。
(2)图片:对于输入是图像的模型,显示某一步输入到模型的图像。
(3)音频:显示可播放的音频。
(4)计算图:显示代码中定义的计算图,也可以显示包括每个节点的计算时间、内存使用等情况。
(5)数据分布:显示模型参数随迭代次数的变化情况。
(6)直方图:显示模型参数随迭代次数的变化情况。
(7)嵌入向量:在3D或者2D图中展示高维数据。
(8)文本:显示保存的一小段文字。