TensorBoard可视化网络结构和参数Tensorboard windows显示空白

Tensorboard显示空白,或者graphs中显示“No graph definition files were found”,在数据正确的前提下,最可能是路径的问题。 Windows 下通过cmd启动tensorboard,采用如下两种方法可以避免路径造成的问题(假设文件在D盘的logs文件夹下): 1.文件夹之间使用 // 分割

>tensorboard --logdir=D://logs

2.将路径直接切换到文件的上一级目录下

>cd D: >tensorboard --logdir=logs 



在学习深度网络框架的过程中,我们发现一个问题,就是如何输出各层网络参数,用于更好地理解,调试和优化网络?针对这个问题,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
  在CODE上查看代码片 派生到我的代码片
  1. accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))  
  2. tf.scalar_summary('accuracy', accuracy)  

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

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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
  在CODE上查看代码片 派生到我的代码片
  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()  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值