计算张量流中所有梯度的总和

时间:2018-08-31 20:56:50

标签: tensorflow keras

是否有任何方法可以获取反向传播的所有梯度值?我想计算所有渐变的总和。是否有任何快速的方法来获取并使用tf.summary.salar将其绘制在张量板中?

1 个答案:

答案 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的较新版本中,既可以使用渴望模式也可以使用图表模式。