转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 官方教程: https://www.tensorflow.org/versions/master/how_tos/graph_viz/index.html
TensorFlow自带的一个强大的可视化工具
这是TensorFlow在MNIST实验数据上得到Tensorboard结果
Event: 展示训练过程中的统计数据(最值,均值等)变化情况Image: 展示训练过程中记录的图像Audio: 展示训练过程中记录的音频Histogram: 展示训练过程中记录的数据的分布图其中,
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()注意这个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
然后在浏览器输入 http://127.0.0.1:6006 就可以访问到tensorboard的结果修改前:
多分支graph修改后:
单分支graph 多用with,进行包裹,这样才好看,正如官网说的,你的summary代码决定了你的图结构不是所有的tensor都有必要记录,但是Variable和placeholder最好都用summary记录一下,也是为了好看由于有了gradient的计算,所以与gradient计算相关的都会被拎出来,下次试一下用其他optimizer我的CNN TensorBoard代码:cnn_board.py
觉得我的文章对您有帮助的话,不妨点个star?