【问题标题】:TensorBoard: How to plot histogram for gradients?TensorBoard:如何绘制梯度直方图?
【发布时间】:2016-07-23 10:07:43
【问题描述】:

TensorBoard 具有在会话时绘制张量直方图的功能。我想要训练期间的梯度直方图。

tf.gradients(yvars,xvars) 返回一个渐变列表。

但是,tf.histogram_summary('name',Tensor) 只接受张量,而不接受张量列表。

暂时,我做了一个变通办法。我将所有张量展平为一个列向量并将它们连接起来:

for l in xrange(listlength): col_vec = tf.reshape(grads[l],[-1,1]) g = tf.concat(0,[g,col_vec]) grad_hist = tf.histogram_summary("name", g)

绘制梯度直方图的更好方法是什么?

这似乎是一件很平常的事情,所以我希望 TensorFlow 有一个专门的功能。

【问题讨论】:

标签: python machine-learning tensorflow tensorboard


【解决方案1】:

另一个解决方案(基于this quora answer)是直接从您已经在使用的优化器中访问梯度。

optimizer = tf.train.AdamOptimizer(..)
grads = optimizer.compute_gradients(loss)
grad_summ_op = tf.summary.merge([tf.summary.histogram("%s-grad" % g[1].name, g[0]) for g in grads])
grad_vals = sess.run(fetches=grad_summ_op, feed_dict = feed_dict)
writer['train'].add_summary(grad_vals)

【讨论】:

  • loss 你是指张量、字符串还是函数类型?你也知道在使用tensorflow.keras时如何做同样的事情吗?
【解决方案2】:

按照@user728291 的建议,我可以使用optimize_loss 函数在tensorboard 中查看渐变,如下所示。 optimize_loss的函数调用语法是

optimize_loss(
loss,
global_step,
learning_rate,
optimizer,
gradient_noise_scale=None,
gradient_multipliers=None,
clip_gradients=None,
learning_rate_decay_fn=None,
update_ops=None,
variables=None,
name=None,
summaries=None,
colocate_gradients_with_ops=False,
increment_global_step=True
)

该函数需要global_step,并且依赖于其他一些导入,如下所示。

from tensorflow.python.ops import variable_scope
from tensorflow.python.framework import dtypes
from tensorflow.python.ops import init_ops
global_step = variable_scope.get_variable(  # this needs to be defined for tf.contrib.layers.optimize_loss()
      "global_step", [],
      trainable=False,
      dtype=dtypes.int64,
      initializer=init_ops.constant_initializer(0, dtype=dtypes.int64))

然后替换你的典型训练操作

training_operation = optimizer.minimize(loss_operation)

training_operation = tf.contrib.layers.optimize_loss(
      loss_operation, global_step, learning_rate=rate, optimizer='Adam',
      summaries=["gradients"])

然后为您的摘要添加一个合并语句

summary = tf.summary.merge_all()

然后在每次运行/epoch 结束时的 tensorflow 会话中:

summary_writer = tf.summary.FileWriter(logdir_run_x, sess.graph) 
summary_str = sess.run(summary, feed_dict=feed_dict)
summary_writer.add_summary(summary_str, i)
summary_writer.flush()  # evidently this is needed sometimes or scalars will not show up on tensorboard.

其中logdir_run_x 是每次运行的不同目录。这样,当 TensorBoard 运行时,您可以分别查看每个运行。渐变将位于直方图选项卡下,并带有标签OptimizeLoss。它将所有权重、所有偏差和beta 参数显示为直方图。

更新:使用 tf slim,还有另一种方法也可以工作并且可能更清洁。

optimizer = tf.train.AdamOptimizer(learning_rate = rate)
training_operation = slim.learning.create_train_op(loss_operation, optimizer,summarize_gradients=True)

通过设置summarize_gradients=True(不是默认值),您将获得所有权重的梯度摘要。这些将在 Tensorboard 中的summarize_grads下查看

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多