TensorFlow系列:TensorBoard可视化网络结构和参数

转自:https://blog.csdn.net/helei001/article/details/51842531

在学习深度网络框架的过程中,我们发现一个问题,就是如何输出各层网络参数,用于更好地理解,调试和优化网络?针对这个问题,TensorFlow开发了一个特别有用的可视化工具包:TensorBoard,既可以显示网络结构,又可以显示训练和测试过程中各层参数的变化情况。本博文分为四个部分,第一部分介绍相关函数,第二部分是代码测试,第三部分是运行结果,第四部分介绍相关参考资料。


一. 相关函数

TensorBoard的输入是tensorflow保存summary data的日志文件。日志文件名的形式如:events.out.tfevents.1467809796.lei-All-Series 或 events.out.tfevents.1467809800.lei-All-Series。TensorBoard可读的summary data有scalar,images,audio,histogram和graph。那么怎么把这些summary data保存在日志文件中呢?


数值如学习率,损失函数用scalar_summary函数。tf.scalar_summary(节点名称,获取的数据)

[python]  view plain  copy
  1. accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  
  2. tf.scalar_summary('accuracy', accuracy)  

各层网络权重,偏置的分布,用histogram_summary函数

[python]  view plain  copy
  1. preactivate = tf.matmul(input_tensor, weights) + biases  
  2. tf.histogram_summary(layer_name + '/pre_activations', preactivate)  

其他几种summary data也是同样的方式获取,只是对应的获取函数名称换一下。这些获取summary data函数节点和graph是独立的,调用的时候也需要运行session。当需要获取的数据较多的时候,我们一个一个去保存获取到的数据,以及一个一个去运行会显得比较麻烦。tensorflow提供了一个简单的方法,就是合并所有的summary data的获取函数,保存和运行只对一个对象进行操作。比如,写入默认路径中,比如/tmp/mnist_logs (by default)

[python]  view plain  copy
  1. merged = tf.merge_all_summaries()  
  2. train_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/train', sess.graph)  
  3. test_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/test')  

SummaryWriter从tensorflow获取summary data,然后保存到指定路径的日志文件中。以上是在建立graph的过程中,接下来执行,每隔一定step,写入网络参数到默认路径中,形成最开始的文件:events.out.tfevents.1467809796.lei-All-Series 或 events.out.tfevents.1467809800.lei-All-Series。

[python]  view plain  copy
  1. for i in range(FLAGS.max_steps):  
  2. if i % 10 == 0:  # Record summaries and test-set accuracy  
  3. summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))  
  4.       test_writer.add_summary(summary, i)  
  5.       print('Accuracy at step %s: %s' % (i, acc))  
  6.     else# Record train set summarieis, and train  
  7.       summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))  
  8.       train_writer.add_summary(summary, i)  

二. 代码测试

[python]  view plain  copy
  1. # Copyright 2015 Google Inc. All Rights Reserved.  
  2. #  
  3. # Licensed under the Apache License, Version 2.0 (the 'License');  
  4. # you may not use this file except in compliance with the License.  
  5. # You may obtain a copy of the License at  
  6. #  
  7. #     http://www.apache.org/licenses/LICENSE-2.0  
  8. #  
  9. # Unless required by applicable law or agreed to in writing, software  
  10. # distributed under the License is distributed on an 'AS IS' BASIS,  
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  12. # See the License for the specific language governing permissions and  
  13. # limitations under the License.  
  14. # ==============================================================================  
  15.   
  16. """A simple MNIST classifier which displays summaries in TensorBoard. 
  17.  
  18.  This is an unimpressive MNIST model, but it is a good example of using 
  19. tf.name_scope to make a graph legible in the TensorBoard graph explorer, and of 
  20. naming summary tags so that they are grouped meaningfully in TensorBoard. 
  21.  
  22. It demonstrates the functionality of every TensorBoard dashboard. 
  23. """  
  24. from __future__ import absolute_import  
  25. from __future__ import division  
  26. from __future__ import print_function  
  27.   
  28. import tensorflow as tf  
  29.   
  30. from tensorflow.examples.tutorials.mnist import input_data  
  31.   
  32.   
  33. flags = tf.app.flags  
  34. FLAGS = flags.FLAGS  
  35. flags.DEFINE_boolean('fake_data'False'If true, uses fake data '  
  36.                      'for unit testing.')  
  37. flags.DEFINE_integer('max_steps'1000'Number of steps to run trainer.')  
  38. flags.DEFINE_float('learning_rate'0.001'Initial learning rate.')  
  39. flags.DEFINE_float('dropout'0.9'Keep probability for training dropout.')  
  40. flags.DEFINE_string('data_dir''/tmp/data''Directory for storing data')  
  41. flags.DEFINE_string('summaries_dir''/tmp/mnist_logs''Summaries directory')  
  42.   
  43.   
  44. def train():  
  45.   # Import data  
  46.   mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True,  
  47.                                     fake_data=FLAGS.fake_data)  
  48.   
  49.   sess = tf.InteractiveSession()  
  50.   
  51.   # Create a multilayer model.  
  52.   
  53.   # Input placehoolders  
  54.   with tf.name_scope('input'):  
  55.     x = tf.placeholder(tf.float32, [None784], name='x-input')  
  56.     image_shaped_input = tf.reshape(x, [-128281])  
  57.     tf.image_summary('input', image_shaped_input, 10)  
  58.     y_ = tf.placeholder(tf.float32, [None10], name='y-input')  
  59.     keep_prob = tf.placeholder(tf.float32)  
  60.     tf.scalar_summary('dropout_keep_probability', keep_prob)  
  61.   
  62.   # We can't initialize these variables to 0 - the network will get stuck.  
  63.   def weight_variable(shape):  
  64.     """Create a weight variable with appropriate initialization."""  
  65.     initial = tf.truncated_normal(shape, stddev=0.1)  
  66.     return tf.Variable(initial)  
  67.   
  68.   def bias_variable(shape):  
  69.     """Create a bias variable with appropriate initialization."""  
  70.     initial = tf.constant(0.1, shape=shape)  
  71.     return tf.Variable(initial)  
  72.   
  73.   def variable_summaries(var, name):  
  74.     """Attach a lot of summaries to a Tensor."""  
  75.     with tf.name_scope('summaries'):  
  76.       mean = tf.reduce_mean(var)  
  77.       tf.scalar_summary('mean/' + name, mean)  
  78.       with tf.name_scope('stddev'):  
  79.         stddev = tf.sqrt(tf.reduce_sum(tf.square(var - mean)))  
  80.       tf.scalar_summary('sttdev/' + name, stddev)  
  81.       tf.scalar_summary('max/' + name, tf.reduce_max(var))  
  82.       tf.scalar_summary('min/' + name, tf.reduce_min(var))  
  83.       tf.histogram_summary(name, var)  
  84.   
  85.   def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):  
  86.     """Reusable code for making a simple neural net layer. 
  87.  
  88.     It does a matrix multiply, bias add, and then uses relu to nonlinearize. 
  89.     It also sets up name scoping so that the resultant graph is easy to read, and 
  90.     adds a number of summary ops. 
  91.     """  
  92.     # Adding a name scope ensures logical grouping of the layers in the graph.  
  93.     with tf.name_scope(layer_name):  
  94.       # This Variable will hold the state of the weights for the layer  
  95.       with tf.name_scope('weights'):  
  96.         weights = weight_variable([input_dim, output_dim])  
  97.         variable_summaries(weights, layer_name + '/weights')  
  98.       with tf.name_scope('biases'):  
  99.         biases = bias_variable([output_dim])  
  100.         variable_summaries(biases, layer_name + '/biases')  
  101.       with tf.name_scope('Wx_plus_b'):  
  102.         preactivate = tf.matmul(input_tensor, weights) + biases  
  103.         tf.histogram_summary(layer_name + '/pre_activations', preactivate)  
  104.       activations = act(preactivate, 'activation')  
  105.       tf.histogram_summary(layer_name + '/activations', activations)  
  106.       return activations  
  107.   
  108.   hidden1 = nn_layer(x, 784500'layer1')  
  109.   dropped = tf.nn.dropout(hidden1, keep_prob)  
  110.   y = nn_layer(dropped, 50010'layer2', act=tf.nn.softmax)  
  111.   
  112.   
  113.   with tf.name_scope('cross_entropy'):  
  114.     diff = y_ * tf.log(y)  
  115.     with tf.name_scope('total'):  
  116.       cross_entropy = -tf.reduce_mean(diff)  
  117.     tf.scalar_summary('cross entropy', cross_entropy)  
  118.   
  119.   with tf.name_scope('train'):  
  120.     train_step = tf.train.AdamOptimizer(  
  121.         FLAGS.learning_rate).minimize(cross_entropy)  
  122.   
  123.   with tf.name_scope('accuracy'):  
  124.     with tf.name_scope('correct_prediction'):  
  125.       correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))  
  126.     with tf.name_scope('accuracy'):  
  127.       accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  
  128.     tf.scalar_summary('accuracy', accuracy)  
  129.   
  130.   # Merge all the summaries and write them out to /tmp/mnist_logs (by default)  
  131.   merged = tf.merge_all_summaries()  
  132.   train_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/train', sess.graph)  
  133.   test_writer = tf.train.SummaryWriter(FLAGS.summaries_dir + '/test')  
  134.   tf.initialize_all_variables().run()  
  135.   
  136.   # Train the model, and also write summaries.  
  137.   # Every 10th step, measure test-set accuracy, and write test summaries  
  138.   # All other steps, run train_step on training data, & add training summaries  
  139.   
  140.   def feed_dict(train):  
  141.     """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""  
  142.     if train or FLAGS.fake_data:  
  143.       xs, ys = mnist.train.next_batch(100, fake_data=FLAGS.fake_data)  
  144.       k = FLAGS.dropout  
  145.     else:  
  146.       xs, ys = mnist.test.images, mnist.test.labels  
  147.       k = 1.0  
  148.     return {x: xs, y_: ys, keep_prob: k}  
  149.   
  150.   for i in range(FLAGS.max_steps):  
  151.     if i % 10 == 0:  # Record summaries and test-set accuracy  
  152.       summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))  
  153.       test_writer.add_summary(summary, i)  
  154.       print('Accuracy at step %s: %s' % (i, acc))  
  155.     else# Record train set summarieis, and train  
  156.       summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))  
  157.       train_writer.add_summary(summary, i)  
  158.   
  159. def main(_):  
  160.   if tf.gfile.Exists(FLAGS.summaries_dir):  
  161.     tf.gfile.DeleteRecursively(FLAGS.summaries_dir)  
  162.   tf.gfile.MakeDirs(FLAGS.summaries_dir)  
  163.   train()  
  164.   
  165. if __name__ == '__main__':  
  166.   tf.app.run()  


三. 运行结果

代码运行

TensorFlow系列:TensorBoard可视化网络结构和参数_第1张图片


生成文件

TensorFlow系列:TensorBoard可视化网络结构和参数_第2张图片


调用TensorBoard可视化运行结果

[python]  view plain  copy
  1. tensorboard --logdir=/tmp/mnist_logs/train/  
TensorFlow系列:TensorBoard可视化网络结构和参数_第3张图片

打开链接 http://0.0.0.0:6006

TensorFlow系列:TensorBoard可视化网络结构和参数_第4张图片


EVENTS是训练参数统计显示,可以看到整个训练过程中,各个参数的变换情况

TensorFlow系列:TensorBoard可视化网络结构和参数_第5张图片


IMAGES输入和输出标签,省略


GRAPH网络结构显示

TensorFlow系列:TensorBoard可视化网络结构和参数_第6张图片

双击进去,可以显示更多的细节,包括右边的列表显示


HISTOGRAM训练过程参数分布情况显示

TensorFlow系列:TensorBoard可视化网络结构和参数_第7张图片


四. 参考资料

如果你想了解更多信息,可以参考一下资料:

https://www.tensorflow.org/versions/r0.9/how_tos/summaries_and_tensorboard/index.html

https://github.com/tensorflow/tensorflow/blob/r0.9/tensorflow/tensorboard/README.md

https://github.com/tensorflow/tensorflow/blob/r0.9/tensorflow/examples/tutorials/mnist/mnist_with_summaries.py

https://www.tensorflow.org/versions/r0.9/how_tos/graph_viz/index.html


你可能感兴趣的:(TensorFlow)