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

2022-03-01

之前的研究项目虽然小,但是五脏俱全。对项目有一个全面的了解,对于进一步的学习和提升是非常有益的,也是走向更大项目的必由之路。所以还是要从项目入手,通俗易懂的理解和应用是本篇博客的关键。

先忽略三七二十一,列出定义模型和训练模型中的代码:

# 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)

通过观察,聪明人不禁会发现以下问题:

函数可以为每一层的激活值创建,没有任何返回值。既然没有返回值,就说明没有数据流,也就是没有意义的节点; 包含 and 两种类型,而且似乎这两种类型是严格划分的:为什么这么说?在代码中可以看到,学习率就是类型,梯度值就是类型;类在项目中无处不在,包括学习率、梯度值、激活值、变量、损失等,而这些似乎是在深度学习过程中,我们更关心的量,这似乎让人无限遐想。

有了这些发现,我们不禁要问以下问题:

如果不是节点,它在会话中扮演什么角色,有什么作用?一个类包含哪些数据类型,它们是如何划分的?我们可以创建哪些量,除了上述函数之外,类中还包含哪些常用函数?

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

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

为你需要可视化的记录创建量,其实它就相当于一个监视器。您可以监控任何您想监控的人。它附加到您要监控的数量。如果你没有它,你就不能谈论可视化,你也不知道要可视化多少。收集所有 ,如果不聚合,则它们之间没有任何关系,需要在 中逐个运行,既麻烦又麻烦;将采集到的数据写入到指定的文件是不能自己可视化的,保存数据是为了可视化;

表面上,训练模型并获取文件:

总结一下:

model_checkpoint_path: "model.ckpt-1000"
all_model_checkpoint_paths: "model.ckpt-0"
all_model_checkpoint_paths: "model.ckpt-1000"

可以看出,这个文件在中间记录了模型保存的位置。第一行表示最新的模型,其他行是其他保存的模型,按照迭代次数从低到高排列。

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

整个汇总监控数据和模型图都记录在里面。该文件用于可视化。

以上三个模型文件data和index结合起来确定变量,meta是模型网络的结构,和变量的加载有关,加载的时候你会发现data和index是必须的,所以可以只加载变量而不加载图形结构,或者加载所有变量。以下示例是 .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():

你也可以全部加载,例如:

如何保存训练日志启动呢?

只需要–=,注意日志所在文件夹,请在所在目录执行此命令,可以得到:

请使用IE浏览器或其他高级浏览器(,)打开图片中出现的网址::6006

到这里为止,表面上我们对类有了一定的了解,那么就可以回答以上三个问题了。

:类是可视化训练过程和图结构的基础。它相当于一个监视器。无论您将其添加到何处,它都会指示您要监视的位置。该类不执行任何实质性操作。 tf 是这样的。如果会话没有建立,一切都是静态的。当然,类只是监控动态,所以没有实质性的操作。只能说不同的功能有不同的作用和目的,这将在第三个问题中讨论。

:从可视化截图可以看出,类中包含的数据类型有:、图像、图形、、音频。其中前四个出现在这个项目中,只有音频类型没有出现。那么它们是如何划分的呢?很明显是按类型来划分的……代表一个标量,image代表一张图片,graph代表一个网络节点模型图,代表一个变量的直方图,audio代表音频数据,具体内容参考上面的代码,也很简单理解起来,通常是指单个量,比如学习率、损失、AP等,表示统计信息,比如梯度、激活值等。图是通过代码中的sess.graph = tf..(FLAGS ., sess.graph) .注意,除此之外,还有两个统计量,一个是统计权重、偏差和梯度的分布,另一个是,包括T-SNE和PCA。

回答:一般来说,只要符合以上5类就可以创建,但常用且有意义的量就是上面提到的常用量。类中的常用函数也写的不错,但是问题的焦点是很多网络博客,包括一些中文社区,都没有及时更新最新版本的API内容,无意中造成了误导。所以,我们一定要看官方API,请看这里。

粗略的总结是:

tf..(name, , =None, =None) 是单个标量。 tf..(name, , =None, =None) 是任何形状的数字类型。 tf..image(name, , =3, =None, =None)的形状为[, , width, ],其中=1表示灰度,3表示RGB,4表示RGBA。请注意,默认值 3 表示每轮默认显示三张图像。 tf..audio(name, , , =3, =None, =None) 是 3D shape[, , ], 或 2D shape[, ];表示声音类型信号的采样率,大小在[-1.0,1.0]中。

tf..text(name, , =None) 将文本数据转换为类型。 tf..merge(, =None, name=None) 合并内部,其中是类型列表。 tf..( key=tf.., scope=None) 将所有内容组合在一起。 tf..(, sess.graph) 写入文件。 tf..(name, , =None, =None, =None, =None, =None) 序列化任何形状和类型并返回一个类型。

总结:通过上面的测试,其实是一个日志展示系统,所以首先用户需要监控(记录日志)各种类型的单条数据,中间计算图表的时候,把各种类型的数据被聚合并输出到日志文件。然后启动服务,读取这些记录的日志文件,并打开6006端口,实时监控用户在Web上聚合的数据。

人人都说创作需要灵感,哪怕是一些亲情、感动、真诚、善良,这就是生活,如果把工作和学习当成创作,还有什么遗憾?

分类:

技术要点:

相关文章:

© 版权声明
THE END
喜欢就支持一下吧
点赞8赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容