是否有任何方法可以获取反向传播的所有梯度值?我想计算所有渐变的总和。是否有任何快速的方法来获取并使用tf.summary.salar
将其绘制在张量板中?
答案 0 :(得分:2)
您可以使用optimizer.compute_gradients()
(请参阅:https://www.tensorflow.org/api_docs/python/tf/train/Optimizer#compute_gradients)来获得显式梯度张量,该张量将返回(grad,var)对的列表。
这里是一个例子:
# given some optimizer
optimizer = tf.train.AdamOptimizer()
# and some loss
loss = ... some loss ...
# var_list = None, means all variable in the graph
grads_vars = optimizer.compute_gradients(loss=loss, var_list=None)
# OR:
# I prefer to state it explicitly
# if you use tf.keras.Model this is straightforward
grads_vars = optimizer.compute_gradients(loss=loss, var_list=model.variables)
# average the grads
mean_grad = tf.zeros(())
for grad, var in grads_vars:
mean_grad += tf.reduce_mean(grad)
mean_grad /= len(grads_vars)
只需将平均等级放到tf.summary
或者您可以使用tf.GradientTape()
风格(需要新版本的Tensorflow)。
# tfe = tf.contrib.eager
with tfe.GradientTape() as tape:
y_hat = model(x)
loss = tf.losses.mean_squared_error(y, y_hat)
grads = tape.gradient(loss, model.variables)
# average the grads
mean_grad = tf.zeros(())
for grad in grads:
mean_grad += tf.reduce_mean(grad)
mean_grad /= len(grads)
请注意,在Tensorflow tfe.GradientTape
的较新版本中,既可以使用渴望模式也可以使用图表模式。