zoukankan      html  css  js  c++  java
  • tensorflow-TensorBoard

    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的图片都被高亮标出来了,而且大部分的图片都集中在一个比较小的区域,只有少数离中心区域比较远。通过这种方式可以很快地找到每个类别中比较难分的图片,加速错误案例分析的过程。

  • 相关阅读:
    关于使用AWS的centos
    MySQL高可用配置(主从复制)
    tomcat+apache+jk
    Zabbix-1.8.14 安装
    centos6.5下,使用虚拟ftp用户
    java小数位-DecimalFormat(转)
    java collection 类图
    log4j详解(转)
    java强软弱虚引用详解(转载)
    Java深入理解文章(转载)
  • 原文地址:https://www.cnblogs.com/bestExpert/p/10678844.html
Copyright © 2011-2022 走看看