【问题标题】:Plot Gradients of Individual Layers in Tensorboard在 Tensorboard 中绘制各个层的梯度
【发布时间】:2018-07-20 10:02:41
【问题描述】:

我有一个 GCMLE 实验,我想在 tensorflow 中绘制逐层梯度的全局范数。我可以在 tensorflow 中使用所有梯度的全局范数,但我想专门为嵌入绘制梯度。这是我当前的代码

gradients, variables = zip(*train_op.compute_gradients(loss))
tf.summary.scalar("gradients", tf.global_norm(gradients)) 

我也知道我应该能够使用tf.trainable_variables() 获取所有变量,但我不确定分离每一层的最简单方法是什么?我猜我需要知道每个层/变量名称并创建代表感兴趣的特定变量的张量?我认为它需要是这样的:

list_of_embedding_variables = [somehow grab the relevant names from tf.trainable_variables]
embedding_gradients = [g for g,v in zip(gradients, variables) if variables in list_of_embedding_variables]
tf.summary.scalar("embedding_gradients", tf.global_norm(gradients))

因为我将此作为 GCMLE 实验运行,所以我无权访问 sess.run()/print 所有变量名。有没有办法从 GCMLE 实验中查看保存的图表中的 tf.trainable_variables() 列表?或者在 tensorboard 中显示这些变量名?

选项 1

我的一个想法是我应该创建感兴趣变量的集合——例如,如果我的嵌入序列是:

embedding_sequence = tf.contrib.layers.embed_sequence(sequence, 
        vocab_size=n_tokens, embed_dim=word_embedding_size)
tf.add_to_collection("embedding_collection", embedding_sequence)

tf.summary.scalar("embedding_gradients",tf.global_norm(tf.get_collection("embedding_collection")

【问题讨论】:

  • 您是在使用“固定估计器”(如 DNNClassifier)还是自定义估计器(在其中定义自己的 model_fn?
  • 自定义估算器,我在其中定义了自己的 model_fn - 添加“选项 1”作为我认为可能有效的一件事,但它需要我将每一层感兴趣的集合添加到我可以然后用于绘制相关层而无需担心底层变量名称
  • @rhaertel80 我在想我也可以使用 variable_scope's,然后使用 tf.get_variable() 和范围正则表达式来指定感兴趣的层,​​然后绘制相关统计数据。这看起来符合您的建议吗?

标签: python tensorflow tensorboard google-cloud-ml


【解决方案1】:

类似这样的:

        grads_and_vars=train_op.compute_gradients(loss)
        for g, v in grads_and_vars:
            if g is not None:
                #print(format(v.name))
                grad_hist_summary = tf.summary.histogram("{}/grad_histogram".format(v.name), g)
                sparsity_summary = tf.summary.scalar("{}/grad/sparsity".format(v.name), tf.nn.zero_fraction(g))
                train_summary.append(grad_hist_summary)
                train_summary.append(sparsity_summary)
         tf.summary.merge(train_summary)

让我知道这是否有效。

【讨论】:

  • 将试一试——在这种情况下,train_summary 的初始化是什么?
  • train_summary = [] 只是一个包含我所有摘要(准确度、损失等)的数组
  • 将所有这些存储在一个数组中而不是直接将所有这些都存储在 tf.summary.histogram 有什么好处?这在很大程度上是有效的,但仍然好奇你以后如何使用 train_summary 数组?需要添加以满足我的问题标准的唯一更改是您需要获取我尝试使用 tf.variable_scope 实现的特定变量组
  • 您可以一个一个地合并,也可以将一个数组合并在一起。取决于你想要什么。同样对于来自tf.variable_scope 的值,您可以在g(来自grad_vars)中找到它
  • 如果g is None 与梯度 0 相同吗?还是None 是由其他原因引起的?
猜你喜欢
  • 2016-07-23
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
相关资源
最近更新 更多