通俗易懂之Tensorflow summary类 & 初识tensorboard

前面学习的cifar10项目虽小,但却五脏俱全。全面理解该项目非常有利于进一步的学习和提高,也是走向更大型项目的必由之路。因此,summary依然要从cifar10项目说起,通俗易懂的理解并运用summary是本篇博客的关键。

先不管三七二十一,列出cifar10中定义模型和训练模型中的summary的代码:

# Display the training images in the visualizer.
  tf.summary.image(‘images‘, images)
def _activation_summary(x):
  """Helper to create summaries for activations.

  Creates a summary that provides a histogram of activations.
  Creates a summary that measure the sparsity of activations.

  Args:
    x: Tensor
  Returns:
    nothing
  """
  # Remove ‘tower_[0-9]/‘ from the name in case this is a multi-GPU training
  # session. This helps the clarity of presentation on tensorboard.
  tensor_name = re.sub(‘%s_[0-9]*/‘ % TOWER_NAME, ‘‘, x.op.name)
  tf.summary.histogram(tensor_name + ‘/activations‘, x)
  tf.summary.scalar(tensor_name + ‘/sparsity‘, tf.nn.zero_fraction(x))
_activation_summary(conv1)
_activation_summary(conv2)
_activation_summary(local3)
_activation_summary(local4)
_activation_summary(softmax_linear)
def _add_loss_summaries(total_loss):
  """Add summaries for losses in CIFAR-10 model.

  Generates moving average for all losses and associated summaries for
  visualizing the performance of the network.

  Args:
    total_loss: Total loss from loss().
  Returns:
    loss_averages_op: op for generating moving averages of losses.
  """
  # Compute the moving average of all individual losses and the total loss.
  loss_averages = tf.train.ExponentialMovingAverage(0.9, name=‘avg‘)
  losses = tf.get_collection(‘losses‘)
  loss_averages_op = loss_averages.apply(losses + [total_loss])

  # Attach a scalar summary to all individual losses and the total loss; do the
  # same for the averaged version of the losses.
  for l in losses + [total_loss]:
    # Name each loss as ‘(raw)‘ and name the moving average version of the loss
    # as the original loss name.
    tf.summary.scalar(l.op.name +‘ (raw)‘, l)
    tf.summary.scalar(l.op.name, loss_averages.average(l))

  return loss_averages_op
tf.summary.scalar(‘learning_rate‘, lr)
# Add histograms for trainable variables.
  for var in tf.trainable_variables():
    tf.summary.histogram(var.op.name, var)
# Add histograms for gradients.
  for grad, var in grads:
    if grad is not None:
      tf.summary.histogram(var.op.name + ‘/gradients‘, grad)
# Build the summary operation based on the TF collection of Summaries.
summary_op = tf.summary.merge_all()

summary_writer = tf.summary.FileWriter(FLAGS.train_dir, sess.graph)

if step % 100 == 0:
        summary_str = sess.run(summary_op)
        summary_writer.add_summary(summary_str, step)

通过观察,聪明的大家不禁发现以下问题:

  1. 函数_activation_summary可以为每一层激活值创建summary,而无任何返回值,既然没有返回值,也就说明没有数据的流动,也就是并非有意义的节点;
  2. summary类包含histogram和scalar两种类型,而且似乎这两种类型是有严格划分的:为什么这么说呢?代码中可以看到,学习率就是scalar类型,梯度值就是histogram类型;
  3. summary类在cifar10项目中普遍存在,包含学习率、梯度值、激活值、变量、loss等,而这些似乎都是在深度学习过程中,我们比较关心的量,这似乎让人无限遐想。

带着这些发现,我们又不禁产生下列疑问:

  1. summary如果都不是节点,那它在会话中起到什么作用,又执行了什么操作?
  2. summary类包含的数据类型有哪些,它们之间是如何划分的?
  3. 我们可以为哪些量创建summary,除了上述函数,summary类中还包含哪些常见的函数?

带着这些问题,打开官方的tutorial、API教程,这里是中文版。纯粹点说,summary和TensorBoard有关,也就是和tf的可视化有关。

上面列出的代码实际上给我们列出了一个过程,就是使用summary或者可视化tensorboard的过程,具体来说:

  1. 为你需要可视化记录的量创建summary,summary其实就相当于一个监测器,你让它监测谁就监测谁,附加在你想监测的量上,如果没有它,也就无从谈起tensorboard可视化,根本不知道可视化什么量;
  2. 收集汇总图中所有创建的summary,如果不汇总,相互之间就没有关联,需要一个一个在会话中运行,麻烦费事;
  3. 把收集的数据写入指定的文件,summary本身并不能可视化,保存数据则是为了tensorboard的可视化;

再从表面上来看,训练cifar10模型,得到的文件问下:

归纳一下就是:

  • checkpoint文件。打开该文件,内容如下:
model_checkpoint_path: "model.ckpt-1000"
all_model_checkpoint_paths: "model.ckpt-0"
all_model_checkpoint_paths: "model.ckpt-1000"

可见,该文件是记录中间保存模型的位置的,第一行表明最新的模型,其他行是保存的其它模型,随迭代次数从低到高排列。

  • tfevents文件。该文件是保存的summary日志文件,比如cifar10项目是每隔100次进行更新,代码如下:
if step % 100 == 0:
        summary_str = sess.run(summary_op)
        summary_writer.add_summary(summary_str, step)

里面就记录着整个汇总summary监测的数据以及模型图。这个文件是要在tensorboard可视化中要用到的。

  • model data文件。该文件保存了所有训练变量所在迭代次数时的值。比如上面的0和1000次。
  • model index文件。该文件保存了所有训练变量的名称。
  • model meta文件。该文件保存在模型图的结构。

上述三个model文件data和index是结合在一起确定变量的,meta是模型网络的结构,这和变量的加载联系起来,就会发现,加载时data和index是必须的,因此可以只加载变量不加载图结构,或者都加载,下面的例子是cifar10_eval.py中的例子,显然这是属于第一种,只加载了变量没有加载图结构而使用了默认图。

tf.app.flags.DEFINE_string(‘checkpoint_dir‘, ‘cifar10_train/‘,
                           """Directory where to read model checkpoints.""")

def eval_once(saver, summary_writer, top_k_op, summary_op):
  """Run Eval once.

  Args:
    saver: Saver.
    summary_writer: Summary writer.
    top_k_op: Top K op.
    summary_op: Summary op.
  """
  with tf.Session() as sess:
    ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
    if ckpt and ckpt.model_checkpoint_path:
      # Restores from checkpoint
      saver.restore(sess, ckpt.model_checkpoint_path)
      # Assuming model_checkpoint_path looks something like:
      #   /my-favorite-path/cifar10_train/model.ckpt-0,
      # extract global_step from it.
      global_step = ckpt.model_checkpoint_path.split(‘/‘)[-1].split(‘-‘)[-1]
    else:
      print(‘No checkpoint file found‘)
      return
def evaluate():
  """Eval CIFAR-10 for a number of steps."""
  with tf.Graph().as_default():

也可以都加载,例如:

tf.app.flags.DEFINE_string(‘checkpoint_dir‘, ‘cifar10_train/‘,
                           """Directory where to read model checkpoints.""")
ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
saver = tf.train.import_meta_graph(ckpt.model_checkpoint_path +‘.meta‘)
with tf.Session() as sess:
    saver.restore(sess,ckpt.model_checkpoint_path)

那如何用summary保存的训练日志启动tensorboard呢?

只需要tensorboard --logdir=cifar10_train,注意cifar10_train是日志所在的文件夹,同时请在cifar10_train所在目录下执行该命令,可得:

请用IE浏览器,或者其它高级的浏览器(chrome、Firefox)打开图片中出现的网址即可:http://DESKTOP-HMQ55PS:6006

到此为止,在表面上对summary类有了一定的认识,那接下来可以回答上述的三个疑问。

  • summary如果都不是节点,那它在会话中起到什么作用,又执行了什么操作?

:summary类是tensorboard可视化训练过程和图结构的基础,它相当于一个监测器,在哪加就说明想要监测哪,summary类没有执行任何实质性操作,tf就是这样,如果不建立会话启动的话,一切都是静态的,当然,summary类只是监测动态性,因此无实质性操作,只能说不同的函数有不同的功能和目的,这将在第三问探讨。

  • summary类包含的数据类型有哪些,它们之间是如何划分的?

:从tensorboard可视化的截图中可以发现,summary类包含的数据类型有:scalar、image、graph、histogram、audio。其中前四种在本项目中都出现了,只有audio类型没有出现。那它们是如何划分的呢?显然是按照类型划分的......scalar表示标量,image表示图片,graph表示网络节点模型图,histogram表示变量的直方图,audio表示音频数据,具体内容参考上述代码,也很容易明白,scalar通常表示单一的量,例如学习率、loss、AP等,而histogram表示的是统计信息,比如梯度、激活值等。graph通过summary_writer = tf.summary.FileWriter(FLAGS.train_dir, sess.graph)代码中的sess.graph得到。注意除此之外,tensorboard还有两个统计信息,一个是distributions,统计权值、偏置和梯度的分布,另一个是projector,包含T-SNE和PCA。

  • 我们可以为哪些量创建summary,除了上述函数,summary类中还包含哪些常见的函数?

答:通常意义上只要符合上述5类的都可以创建summary,但是常用的有意义的量就上述常见的那些。summary类中常见的函数就上面那些,除此之外的很少遇到,详见API。

人人都说,创作需要灵感,甚至需要一些情愫,感动的、真诚的、又或是善意的,这就是生活,如果我们能把工作和学习当作是创作一样,又有什么遗憾呢?

原文地址:https://www.cnblogs.com/cvtoEyes/p/9022878.html

时间: 2024-10-30 00:47:39

通俗易懂之Tensorflow summary类 & 初识tensorboard的相关文章

初识Tensorboard

1.什么是Tensorboard? PPT设计原则中有这样一条,叫"文不如表,表不如图",可见图表在表达中更为直观.明确.程序设计中也是一样,我们经常用图表来描述程序的结构和流程,本文所述的Tensorboard就是Tensorflow提供的一款强大的可视化工具,可以借助图表更方便地进行Tensorflow程序的理解.调试和优化. 左面的数据流图cool吗?它是Tensorflow官网上给出的demo,下面,本文就结合一个具体的例子,介绍下Tensorboard的基本使用. 2. 如何

TensorFlow基础笔记(9) Tensorboard可视化显示

参考: http://blog.csdn.net/l18930738887/article/details/55000008 import tensorflow as tf import numpy as np def add_layer(inputs, in_size, out_size, n_layer, activation_function=None): # add one more layer and return the output of this layer layer_name

PHP类初识,通用数据库操作类,前端easyui-datagrid,form

实现功能:     左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[新增]按钮,[修改],[删除]按钮禁用,[保存]按钮启用 (3)点击[修改]按钮,[新增],[删除]按钮禁用 难点:通用数据库操作类中insert方法跟update方法 最终效果图: 前端功能不是很完善,按钮之间逻辑还是有点问题,最后补充前端代码 其中Formain.php对前端传值判断,并调用ac

log4php的配置--PHP类初识,通用数据库操作类代码问题

涉及的代码网址:http://www.cnblogs.com/leetao94/p/4690732.html 代码的点评 优点:代码通用性很好,能够根据传入的字段,自动拼接SQL语句缺点:不支持参数绑定,程序鲁棒性差          类变量使用不当,不应使用公用变量.构造函数传入参数过多,容易造成多点故障         代码格式缩进采用双tab制表位         程序未使用logger记录常见故障信息             数据库连接多次创建,未重用连接.getcolumn代码中采用硬

tensorflow summary

定义summary writer = tf.summary.FileWriter(logdir=self.han_config.log_path, graph=session.graph) 1.scalar存储结果 a.先在训练的循环外定义: test_accuracy_summary = tf.summary.scalar('test_accuracy', self.han_model.accuracy) test_loss_summary = tf.summary.scalar('test_

java 类初识

一.定义 成员变量 成员方法 注意: 1.成员变量有默认值,是全局变量 2.成员方法,不需要使用static 3.成员变量的默认值 整型 0 浮点型 0.0 引用数据类型 null 二.使用 1.导包 2.实例化 3.使用 注意: 1.同一目录下的类不需要导包 2.实例化 类 对象 = new 类(); ps: 导包是 import 路径  感觉没有python的导包人性化 例子 1 package cn.wt.day06; 2 3 public class Student { 4 // 成员变

String类初识

package lei; public class TestString { public static void main(String[] args) { String s="郭明明成精说过"; String s1="中国人ok"; System.out.println(s.length()); System.out.println(s1.getBytes().length); System.out.println(s1.charAt(1)); System.o

tensorflow 梯度下降以及summary

# 保证脚本与Python3兼容 from __future__ import print_function import os import tensorflow as tf import numpy as np from utils import createSummaryWriter, generateLinearData, createLinearModel #导入utils def gradientDescent(X, Y, model, learningRate=0.01, maxI

tensorboard及summary data

(新手上路,如果有不对的地方,望指正.另外有没有小伙伴一起学习交流啊?) tensorboard为tensorflow提供了可视化,它的重要性不言而喻. tensorboard是通过读取events files来显示的,events file则包含在图计算时生成的summary data. tf.summary.scalar('mean', mean) tf.summary.histogram('histogram', var) 1.summary data 某个summary操作原型: tf.