Tensorborad--> 是Tensorflow的可视化工具,它可以通过Tensorflow程序运行过程中输出的日志文件可视化Tensorflow程序的运行状态。Tensorflow和Tensorborad程序跑在不同的进程中,Tensorboard会自动读取最新的Tensorflow日志文件,并呈现当前Tensorflow程序运行的最新状态。以下的代码地址:https://github.com/pythonAndAI/tensorflow-exercise/tree/master/com/tensorflow/exercise/tensorboard

一、TensorBoard简介

例如定义一个简单的向量加法操作(TB_basis.py)。执行完程序之后,会在path路径底下生成一个文件,在cmd里面运行以下命令:tensorboard -- logdir=path (运行Tensorflow,并将日志的地址指向上面程序日志输出的地址path)

运行以上命令会启动一个服务(http://LAPTOP-PIG9M9R9:6006),这个服务的端口默认为6006,使用--port参数可以改变启动服务的端口。通过浏览器打开http://LAPTOP-PIG9M9R9:6006。会看到一个界面,如下:

在界面的上方,展示的内容是“GRAPHS”,表示图中可视化的内容是Tensorflow的计算图。打开界面会默认进入GRAPHS界面,在该界面中可以看到上面程序Tensorflow计算图的可视化结果。另外有一个“INACTIVE”
选项,点开这个选项可以看到Tensorboard能够可视化的其他内容。比如:IMAGES、AUDIO等。如下图所示:

二、TensorFlow计算图可视化

Tensorboard可视化得到的图不仅是将TensorFlow计算图中的节点和边直接可视化,它会根据每个TensorFlow计算节点的命名空间来整理可视化得到的效果图,使得神经网络的整体结构不会被过多的细节所淹没。除了TensorFlow计算图的结构。Tensorboard还可以展示TensorFlow计算节点上的其他信息。

1. 命名空间

为了更好地组织可视化效果图上的节点。Tensorboard支持通过TensorFlow命名空间来整理可视化效果图上的节点。在Tensorboard的默认视图中,TensorFlow计算图中同一个命名空间下的所有节点会被缩略成一个节点,
只有顶层命名空间中的节点才会被显示在Tensorboard可视化效果图上。Tensorboard通过tf.name_scope函数来管理命名空间。tf.name_scope函数不会影响tf.get_variable()函数定义的变量的命名空间。

1.1. 经过增加命名空间的向量加法可视化

通过对命名空间管理,改进向量相加的代码(TB_scope.py),使得可视化得到的效果图更加清晰。如下:

上图显示了改进后的可视化效果图。和上面的图相比,用于初始化的节点已经被缩略起来了。这样TensorFlow程序中定义的加法运算被清晰地展示了出来。

1.2 mnist训练可视化展示

下图给出了可视化mnist数据集的训练步骤(TB_mnist.py)的可视化:

从上图可以看出,TensorBoard可视化效果图很好地展示了整个神经网络的结构,input节点代表了训练神经网络需要的输入数据,这些输入数据会提供给神经网络的第一层layer1.然后神经网络第一层layer1的结果会被传到第二层layer2,layer2的计算得到前向传播的结果。loss_function节点表示计算损失函数的过程,这个过程既依赖于前向传播的结果来计算交叉熵(layer2到loss_function的边),又依赖于每一层中所定义的变量来计算L2正则化损失(layer1和layer2到loss_function的边)。loss_function的计算结果会提供给神经网络的优化过程,也就是图中train_op所代表的节点。综上所述,通过TensorBoard可视化得到的效果图可以对整个神经网络的网络结构有一个大致了解。

从上图可以发现节点之间有两种不同的边。一种边是通过实线表示的,这个刻画了数据传输,边上箭头方向表达了数据传输的方向。比如layer1和layer2之间的边表示了layer1的输出将会作为layer2的输入。TensorBoard可视化效果图的边上还标注了张量的维度信息。如上可以看出,节点input和layer1之间传输的张量的维度为?x784。这说明了训练时提供的batch大小不是固定的(也就是定义的时候是None),输入层节点的个数为784。当两个节点之间传输的张量多于1时,可视化效果图上将只显示张量的个数。效果图上边的粗细表示的是两个节点之间传输的标量维度的总大小,而不是传输的标量个数。比如layer2和train_step之间虽然传输了6个张量,但其维度都比较小,所以这条边比layer1和moving_average之间的边(只传输了4个张量)还要细。当张量的维度无法确定时,TensorBoard会使用最细的边来表示。比如layer1和layer2之间的边。

TensorBoard可视化效果图上另外一种边是通过虚线表示的。比如上图所示的moving_average和train_step之间的边。虚线表达了计算之间的依赖关系,比如在程序中,通过tf.control_dependencies函数指定了更新参数滑动平均值的操作和通过反向传播更新变量的操作需要同时进行,于是moving_average与train_step之间存在一条虚线。

除了手动的通过TensorFlow中的命名空间来调整TensorBoard的可视化效果图,TensorBoard也会智能地调整可视化效果图上的节点。TensorFlow中部分计算节点会有比较多的依赖关系,如果全部画在一张图上会使可视化得到的效果图非常拥挤。于是TensorBoard将TensorFlow计算图分为了主图(Main Graph)和辅助图(Auxiliary nodes)两部分来呈现的。TensorBoard会自动将连接比较多的节点放在辅助图中,使得主图的结构更加清晰。

除了自动的方式,TensorBoard也支持手工的方式调整可视化结果,如下,右键单击可视化效果图上的节点会弹出一个选项,这个选项可以将节点加入主图或者从主图中删除。左键选择一个节点并点击右边信息框下部的选项也可以完成类似的功能。注意TensorBoard不会保存用户对计算图可视化结果的手工修改,页面刷新之后计算图可视化结果又会回到最初的样子。

2. 节点信息

除了展示TensorFlow计算图的结构,TensorBoard还可以展示TensorFlow计算图上每个节点的基本信息以及运行时消耗的时间和空间。TensorFlow计算节点的运行时间都是非常有用的信息,它可以帮助更加有针对性地优化TensorFlow程序,使得整个程序的运行速度更快。使用TensorBoard可以非常直观地展现所有TensorFlow计算节点在某一次运行时所消耗的时间和内存。

2.1 运行TB_node_information.py程序,并使用这个程序输出的日志启动TensorBoard,这样就可以可视化每个TensorFlow计算节点在某一次运行时所消耗的时间和空间。单击页面左侧的session runs选项,这是会出现一个下拉单,在这个下拉单中会出现所有通过writer.add_run_metadata函数记录的数据。如下图所示,选择一次运行后,TensorBoard左侧的Color栏中Compute time和Memory这两个选项将可以被选择。

                                                

在Color栏中选择Compute time可以看到在这次运行中每个TensorFlow计算节点的运行时间。类似的,选择Memory可以看到这次运行中每个TensorFlow计算节点所消耗的没存。下图展示了在第10000轮迭代时,不同TensorFlow计算节点时间消耗的可视化效果图。图中颜色越深的节点表示时间消耗越大。从图中可以看出,代表训练神经网络的train_step节点消耗的时间是最多的。通过对每一个计算节点消耗时间的可视化,可以很容易地找到TensorFlow计算图上的性能瓶颈,这大大方便了算法优化的工作。在性能调优时,一般会选择迭代轮数较大时的数据(比如下图中第10000轮迭代时的数据)作为不同计算节点时间/空间消耗的标准,因为这样可以减少TensorFlow初始化对性能的影响。

在TensorBoard界面左侧的Color中,除了Compute time和Memory,还有Structure和Device两个选项(XLA还处于测试阶段,这里不做介绍。TPU Compatiblity只在谷歌内部使用,此处也不介绍)。在刚打开TensorBoard页面时,展示的可视化效果图都是使用默认的Structure选项。在这个视图中,灰色的节点表示没有其他节点和它拥有相同结构。如果有两个节点的结构相同,那么它们会被涂上相同的颜色(比如CNN结构中的两个卷积层)。最后,Color栏还可以选择Device选项,这个选项可以根据TensorFlow计算节点运行的机器给可视化效果图上的节点染色。在使用GPU时,可以通过这种方式直观地看到那些计算节点被放到了GPU上。

2.2 当点击TensorBoard可视化效果图中的节点时,界面的右上角会弹出一个信息卡片显示这个节点的基本信息。如下图,当点击的节点为一个命名空间时,TensorBoard展示的信息有这个命名空间内所有计算节点的输入、输出以及依赖关系。虽然属性(attributes)也会展示在卡片中,但是在代表命名空间的属性下不会有任何内容。当Session runs选择了某一次运行时,节点的信息卡片上也会出现这个节点运行所消耗的时间和内存等信息。

2.3 当点击的TensorBoard可视化效果图上的节点对应一个TensorFlow计算节点时,TensorBoard也会展示类似的信息。下图展示了一个TensorFlow计算节点所对应的信息卡片。在TensorBoard页面中,空心的小椭圆对应了TensorFlow计算图上的一个计算节点,而一个矩阵对应了计算图上的一个命名空间。TensorFlow计算节点所对应的信息卡片中的内容和命名空间信息卡片相似,只是TensorBoard可以将TensorFlow计算节点的属性也展示出来。如下,属性栏下显示了选中的计算节点是在什么设备上运行的,以及运行这个计算时的两个参数。

三、监控指标可视化

TensorBoard除了可以可视化TensorFlow的计算图,还可以可视化TensorFlow程序运行过程中各种有助于了解程序运行状态的监控指标。除了GRAPHS以外,TensorBoard界面中还提供了SCALARS、IMAGES、AUDIO、DISTRIBUTIONS、HISTOGRAMS和TEXT六个界面来可视化其他的监控指标。参考代码:TB_monitoring_index.py

3.1 如下图展示了tf.summary.scalar函数生成的所有标量监控信息。和变量的命名空间类似,TensorBoard也会根据监控指标的名称进行分组。输入.*可以查看所有的信息。不过和TensorFlow计算图可视化结果不同的是,SCALARS、IMAGES、AUDIO、TEXT、HISTOGRAMS和DISTRIBUTIONS栏只会对最高层的命名空间进行整合,单击展开后将看到该命名空间下的所有监控指标。

在每一个监控指标的左下角有一个小方框,单击这个方框可以得到放大后的图片。如下图所示,再单击一次这个小方框可以将放大后的图表缩小。在训练神经网络时,通过TensorBoard监控神经网络中变量取值的变化、模型在训练batch上的损失函数大小以及学习率的变化等信息可以更加方便地掌握模型的训练情况。

3.2 如下展示了通过TensorBoard可视化当前轮训练使用的图像信息。通过这个界面可以大致看出数据随机打乱的效果。因为TensorFlow程序和TensorBoard可视化界面可以同时运行,所以TensorBoard上可以实时看到TensorFlow程序中最新使用的训练或者测试图像。

3.3 TensorBoard的DISTRIBUTIONS一栏提供了对张量取值分布的可视化界面。如下图,可以直观地观察到不同层神经网络中参数的取值变化。

3.4 HISTOGRAMS视图可以更加清晰地展示参数取值分布和训练迭代轮数之间的关系。如下图,与DISTRIBUTIONS效果图不同的是,HISTOGRAMS中不同轮数中参数的取值是通过不同的平面来表示的。颜色越深的平面表示迭代轮数越小的取值分布。比如下图中的layer1/biases,最上面的比较尖的平面表示训练一轮之后的bias参数取值分布。因为bias是通过全0矩阵初始化的,于是在第一轮时取值都集中在0附近。最前面比较浅的平面表示迭代轮数较大时的参数取值分布,可以看到bias的取值分布越来越接近平均分布。

在HISTOGRAMS视图左侧有一个“OVERLAY”选项,选择之后可以看到类似下图所示的效果。和默认的OFFSET视图类似,在OVERLAY视图中颜色越深的表示迭代轮数越小。从下图还可以看出,比较尖的曲线看上去颜色比较浅,而比较靠近平均分布的曲线反而比较深。这是因为有更多的曲线靠近平均分布,所以合在一起就比较深了。当把鼠标移到某一条曲线上时这一条曲线就会变黑,而且迭代轮数的信息会显示在鼠标附近。

四、高维向量可视化

4.1 为了更加直观的让大家了解这类embedding向量的效果,TensorBoard提供了PROJECTOR界面来可视化高维向量之间的关系。PROJECTOR界面可以非常方便地可视化多个高维向量之间的关系。比如在图像迁移学习中可以将一组目标问题的图片通过训练好的卷积层得到瓶颈层,这些瓶颈层向量就是多个高维向量。如果在目标问题图像数据集上同一种类的图片在经过卷积层之后得到的瓶颈层向量在空间中比较接近,那么这样迁移学习得到的结果就有可能会更好。类似地,在训练单词向量时,如果语义相近的单词所对应的向量在空间中的距离也比较接近的话,那么自然语言模型的效果也有可能会更好。为了在PROJECTOR中更好地展示MNIST图片信息以及每张图片对应的真实标签,PROJECTOR要求用户准备一个sprite图像(所谓sprite图像就是将一组图片组合成一整张大图片,如下图)和一个tsv文件给出每张图片对应的标签信息(TB_high_dimension_vector.py)。

4.2 生成如上辅助数据之后,下面使用TensorFlow代码生成PROJECTOR所需要的日志文件来可视化MNIST测试数据在最后的输出层向量(TB_high_dimension_vector2.py)。如下图为在迭代10000轮之后使用T-SNE可视化得到的MNIST测试数据在最后输出层的向量(TB_high_dimension_vector2.py)。

在PROJECTOR界面的左上角有三个选项,第一个“FINAL_LOGITS”选项是选择需要可视化的Tensor,这里默认选择的是通过ProjectorConfig中指定的tensor_name,也就是名为FINAL_LOGITS的张量,虽然PROJECTOR也可以可视化里面的其他的向量,但是在这个场景下意义不大。中间的“Label by”选项可以控制当鼠标移到一个向量上时鼠标附近显示的标签。比如这里选定的是“Index”,那么当鼠标移到某个点上之后显示的就是这个点对应的编号。最后“Color by”选项可以指定每一个小图片的背景颜色

如上图,在PROJECTOR界面的左下角提供了不同的高维向量的可视化方法,目前主要支持的就是T-SNE和PCA。无论是T-SNE还是PCA都可以将一个高维向量转化成一个低维向量,并尽量保证转化后向量中的信息不受影响。在PROJECTOR的右侧还提供了高亮功能。如下图展示了搜索所有代表数字3的图片,可以看出所有代表数字3的图片都被高亮标出来了,而且大部分的图片都集中在一个比较小的区域,只有少数离中心区域比较远。通过这种方式可以很快地找到每个类别中比较难分的图片,加速错误案例分析的过程。

tensorflow-TensorBoard的更多相关文章

  1. TensorFlow TensorBoard使用

    摘要: 1.代码例子 2.主要功能内容: 1.代码例子 <TensorFlow实战>使用MLP处理Mnist数据集并TensorBoard上显示 2.主要功能 执行TensorBoard程 ...

  2. tensorflow Tensorboard可视化-【老鱼学tensorflow】

    tensorflow自带了可视化的工具:Tensorboard.有了这个可视化工具,可以让我们在调整各项参数时有了可视化的依据. 本次我们先用Tensorboard来可视化Tensorflow的结构. ...

  3. TensorFlow——TensorBoard可视化

    TensorFlow提供了一个可视化工具TensorBoard,它能够将训练过程中的各种绘制数据进行展示出来,包括标量,图片,音频,计算图,数据分布,直方图等,通过网页来观察模型的结构和训练过程中各个 ...

  4. Tensorflow学习笔记3:TensorBoard可视化学习

    TensorBoard简介 Tensorflow发布包中提供了TensorBoard,用于展示Tensorflow任务在计算过程中的Graph.定量指标图以及附加数据.大致的效果如下所示, Tenso ...

  5. TensorFlow深度学习笔记 Tensorboard入门

    转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 官方教程: https://ww ...

  6. 【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控

    [写在前面] 用Tensorflow(TF)已实现好的卷积神经网络(CNN)模型来训练自己的数据集,验证目前较成熟模型在不同数据集上的准确度,如Inception_V3, VGG16,Inceptio ...

  7. 学习TensorFlow,TensorBoard可视化网络结构和参数

    在学习深度网络框架的过程中,我们发现一个问题,就是如何输出各层网络参数,用于更好地理解,调试和优化网络?针对这个问题,TensorFlow开发了一个特别有用的可视化工具包:TensorBoard,既可 ...

  8. tensorflow 升级到1.9-rc0,tensorboard 报错:TypeError: GetNext() takes exactly 1 argument (2 given)

    Exception in thread Reloader:Traceback (most recent call last):  File "/usr/lib/python2.7/threa ...

  9. 搭建TensorFlow中碰到的一些问题(TensorBoard不是内部或外部指令也不是可运行的程序)~

    一.windows10环境+pip python软件包(最新版)+Pycharm软件(过段时间在弄下CUDA和GPU吧) 直接使用pip指令来安装tensorflow软件(如果很久没有更新pip软件包 ...

  10. 解决Tensorflow源码安装的之后TensorBoard 无法使用的问题

    作者  cnblog 修雨轩陈 我是按照 Tensorflow 下 https://github.com/tensorflow/tensorflow/blob/master/tensorflow/g3 ...

随机推荐

  1. List去重的实现

    List<T> 当T为值类型的时候 去重比较简单,当T为引用类型时,一般根据业务需要,根据T的中几个属性来确定是否重复,从而去重. 查看System.Linq下的Enumerable存在一 ...

  2. .Net Linq与Lambda表达式中GroupBy以多个字段分组

    一.引入 基本上熟悉C#语言的没有不知道Lambda表达式的,其对于数据的处理真的是太方便了.其中分组处理的GroupBy方法在List中的使用非常广泛.正式近期一个功能需求中又遇到了,而且是需要Gr ...

  3. java的设计模式 - 静态工厂方法

    静态工厂方法,也不知道为何叫这个名字.其实也就是一个静态函数,可以替代构造函数用.大名鼎鼎的 guava 就大量使用这种模式,这是非常有用的模式. 比如是 Integer i = Integer.va ...

  4. 《PHP制作个人博客》之四:分类添加及前端导航数据用php动态调取

    大家好,今天我们接着上一节的全栈营销个人博客制作,上一节我们把博客的模板给加载运行起来.今天我们主要讲解后台模板分类的添加,后台导航的添加,及前台导航的动态调用.一个好的博客,导航很重要,导航就像你网 ...

  5. es6之字符串添加的东西

    在es6里边对字符串添加了一些东西! 字符串模板(非常友善) 相信大家之前都遇到过万恶的字符串拼接,真是噩梦,不过之后有了字符串模板之后,再也不用担心字符串拼接会乱了... 之前的字符串拼接 let ...

  6. socket字符流循环截取

    场景:socket 客户端将一个单向链表序列化后发送给服务端,服务端将之解析,重新构建单向链表. Client.cpp //遍历链表,填充到缓冲区 ]) { ListNode* tmp = p; // ...

  7. Win10中Vue.js的安装和项目搭建

    一. 提前准备工作 1.Node.js环境 2.Windows10 3.npm(前端包管理工具) 4.webpack(前端资源加载/打包工具) 二. 开始安装 1..下载并安装Node.js 下载地址 ...

  8. 将CSV文件写入MySQL

    先打开CSV文件查看第一行有哪些字段,然后新建数据库,新建表.(若字段内容很多建议类型text,如果设成char后续会报错) 命令如下: load data infile '路径XXXX.csv' i ...

  9. C# Split的用法,Split分割字符串

    C# Split的用法,Split分割字符串 分割单个字串:string str="来自张三的亲切问候!;string[] strarry=str.Split(new string[] { ...

  10. MongoDB- 简单操作命令

    MongoDB是基于集合操作的数据库 1.进入与退出 mongo / exit 2.库操作 显示所有库: show dbs; 查看当前所在库: db; 切换&使用某个库: use db_nam ...