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

news/2024/11/24 19:27:14/

转自: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()  


三. 运行结果

代码运行


生成文件



调用TensorBoard可视化运行结果

[python]  view plain  copy
  1. tensorboard --logdir=/tmp/mnist_logs/train/  


打开链接 http://0.0.0.0:6006



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



IMAGES输入和输出标签,省略


GRAPH网络结构显示


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


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



四. 参考资料

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

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



http://www.ppmy.cn/news/231424.html

相关文章

深度学习基础:卷积与转置卷积、计算量与参数量、argparse库、信息熵(KL散度及交叉熵)、hook机制、top_k和AvgrageMeter函数(持续更新)

深度学习模型基础知识汇总(持续更新) 文章目录 一、卷积和转置卷积1、基本概念2、输出尺寸的计算公式3、nn.Conv2d、nn.ConvTranspose2d的参数k,s,p在图形上的含义,卷积运算过程 二、模型计算量(FLOPs)和参数量(Params)三、python的argparse…

HyperOpt参数优化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/u012735708/article/details/84820101 当我们创建好模型后,还要调整各个模型的参数&a…

机器学习之K近邻法(KNN)

目录 一、基本概念: 二、距离的计算方式: 三、k的选取: 四、特征归一化: 五、交叉验证: 一、基本概念: k近邻算法是一种基本分类和回归方法。这里只讨论分类问题的k近邻法。 k近邻算法,即是给定一个…

python位置参数错误_python – 函数缺少2个必需的位置参数:’x’和’y’

我正在尝试编写一个绘制Spirograph的Python龟程序,我不断收到此错误: Traceback (most recent call last): File "C:\Users\matt\Downloads\spirograph.py", line 36, in main() File "C:\Users\matt\Downloads\spirograph.py", line 16, in main spirog…

Hyperopt 参数优化

翻译自https://districtdatalabs.silvrback.com/parameter-tuning-with-hyperopt Parameter Tuning with Hyperopt –Kris Wright 概述 Hyperopt可以帮助快速进行机器学习模型参数调试。通常情况下有两种类型的参数调试方法,网格搜索(grid search&…

python颜色参数_Python中matplotlib的颜色及线条参数控制示例

用Python画图的时候选色选点都可以直接参考这里的内容,matplotlib中有哪些命名颜色可供用于绘图? 在matplotlib文档中找到一个列表,声明这些是唯一的名称: b: blue g: green r: red c: cyan m: magenta y: yellow k: black w: white 然而,我发现这些颜色也可以使…

python代码设置超参数_超参数调优总结,贝叶斯优化Python代码示例

本文介绍超参数(hyperparameter)的调优方法。 神经网络模型的参数可以分为两类,模型参数,在训练中通过梯度下降算法更新; 超参数,在训练中一般是固定数值或者以预设规则变化,比如批大小(batch size)、学习率(learning rate)、正则化项系数(weight decay)、核函数中的gamma…

参数调优为什么要采样_一文详解超参数调优方法

原标题:一文详解超参数调优方法 ©PaperWeekly 原创 作者|王东伟 单位|Cubiz 研究方向|深度学习 本文介绍超参数(hyperparameter)的调优方法。 神经网络模型的参数可以分为两类: 模型参数,在训练中通过…