zoukankan      html  css  js  c++  java
  • TensorFlow深度学习笔记 Tensorboard入门

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

    这份教程对应的代码有点过时了,请到我的GitHub获取最新的代码

    TensorFlow自带的一个强大的可视化工具

    功能

    这是TensorFlow在MNIST实验数据上得到Tensorboard结果

    • Event: 展示训练过程中的统计数据(最值,均值等)变化情况
    • Image: 展示训练过程中记录的图像
    • Audio: 展示训练过程中记录的音频
    • Histogram: 展示训练过程中记录的数据的分布图

    原理

    • 在运行过程中,记录结构化的数据
    • 运行一个本地服务器,监听6006端口
    • 请求时,分析记录的数据,绘制

    实现

    在构建graph的过程中,记录你想要追踪的Tensor

    with tf.name_scope('output_act'):
        hidden = tf.nn.relu6(tf.matmul(reshape, output_weights[0]) + output_biases)
        tf.histogram_summary('output_act', hidden)
    

    其中,

    • histogram_summary用于生成分布图,也可以用scalar_summary记录存数值
    • 使用scalar_summary的时候,tag和tensor的shape要一致
    • name_scope可以不写,但是当你需要在Graph中体现tensor之间的包含关系时,就要写了,像下面这样:
    with tf.name_scope('input_cnn_filter'):
        with tf.name_scope('input_weight'):
            input_weights = tf.Variable(tf.truncated_normal(
                [patch_size, patch_size, num_channels, depth], stddev=0.1), name='input_weight')
            variable_summaries(input_weights, 'input_cnn_filter/input_weight')
        with tf.name_scope('input_biases'):
            input_biases = tf.Variable(tf.zeros([depth]), name='input_biases')
            variable_summaries(input_weights, 'input_cnn_filter/input_biases')
    
    • 在Graph中会体现为一个input_cnn_filter,可以点开,里面有weight和biases
    • 用summary系列函数记录后,Tensorboard会根据graph中的依赖关系在Graph标签中展示对应的图结构
    • 官网封装了一个函数,可以调用来记录很多跟某个Tensor相关的数据:
    def variable_summaries(var, name):
        """Attach a lot of summaries to a Tensor."""
        with tf.name_scope('summaries'):
            mean = tf.reduce_mean(var)
            tf.scalar_summary('mean/' + name, mean)
            with tf.name_scope('stddev'):
                stddev = tf.sqrt(tf.reduce_sum(tf.square(var - mean)))
            tf.scalar_summary('sttdev/' + name, stddev)
            tf.scalar_summary('max/' + name, tf.reduce_max(var))
            tf.scalar_summary('min/' + name, tf.reduce_min(var))
            tf.histogram_summary(name, var)
    
    • 只有这样记录国max和min的Tensor才会出现在Event里面
    • Graph的最后要写一句这个,给session回调
    merged = tf.merge_all_summaries()
    

    Session 中调用

    • 构造两个writer,分别在train和valid的时候写数据:
    train_writer = tf.train.SummaryWriter(summary_dir + '/train',
                                                  session.graph)
    valid_writer = tf.train.SummaryWriter(summary_dir + '/valid')
    
    • 这里的summary_dir存放了运行过程中记录的数据,等下启动服务器要用到
    • 构造run_option和run_meta,在每个step运行session时进行设置:
    summary, _, l, predictions = 
        session.run([merged, optimizer, loss, train_prediction], options=run_options, feed_dict=feed_dict)
    
    • 注意要把merged拿回来,并且设置options
    • 在每次训练时,记一次:
    train_writer.add_summary(summary, step)
    
    • 在每次验证时,记一次:
    valid_writer.add_summary(summary, step)
    
    • 达到一定训练次数后,记一次meta做一下标记
    train_writer.add_run_metadata(run_metadata, 'step%03d' % step)
    

    查看可视化结果

    • 启动TensorBoard服务器:
    python安装路径/python TensorFlow安装路径/tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory
    

    注意这个python必须是安装了TensorFlow的python,tensorboard.py必须制定路径才能被python找到,logdir必须是前面创建两个writer时使用的路径

    比如我的是:

    /home/cwh/anaconda2/envs/tensorflow/bin/python /home/cwh/anaconda2/envs/tensorflow/lib/python2.7/site-packages/tensorflow/tensorboard/tensorboard.py --logdir=~/coding/python/GDLnotes/src/convnet/summary
    

    使用python

    强迫症踩坑后记

    • 之前我的cnn代码里有valid_prediction,所以画出来的graph有两条分支,不太清晰,所以只留了train一个分支

    修改前:

    多分支graph

    修改后:

    单分支graph

    • 多用with,进行包裹,这样才好看,正如官网说的,你的summary代码决定了你的图结构
    • 不是所有的tensor都有必要记录,但是Variable和placeholder最好都用summary记录一下,也是为了好看
    • 由于有了gradient的计算,所以与gradient计算相关的都会被拎出来,下次试一下用其他optimizer

    我的CNN TensorBoard代码:cnn_board.py

    参考资料

    觉得我的文章对您有帮助的话,不妨点个star

    土豪可以打赏支持,一分也是爱:

    图片名称
  • 相关阅读:
    Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)
    Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block
    Microsoft Enterprise Library 5.0 系列(八) Unity Dependency Injection and Interception
    Microsoft Enterprise Library 5.0 系列(九) Policy Injection Application Block
    Microsoft Enterprise Library 5.0 系列(三) Validation Application Block (高级)
    软件研发打油诗祝大家节日快乐
    从挖井的故事中想到开发管理中最容易忽视的几个简单道理
    ITIL管理思想的执行工具发布
    管理类软件设计“渔”之演化
    20070926日下午工作流与ITILQQ群 事件管理 讨论聊天记录
  • 原文地址:https://www.cnblogs.com/hellocwh/p/5776795.html
Copyright © 2011-2022 走看看