【发布时间】:2020-12-24 22:07:55
【问题描述】:
在 Pytorch 中,我们可以通过 x 访问变量的梯度
z.grad
Tensorflow 2 中的相同语法是什么。我的目标是减少渐变。这是 Pytorch 代码
if z.grad > 1000:
z.grad = 10
tensorflow 2 可以应用相同的功能吗?
谢谢
【问题讨论】:
标签: python pytorch tensorflow2.0 gradient
在 Pytorch 中,我们可以通过 x 访问变量的梯度
z.grad
Tensorflow 2 中的相同语法是什么。我的目标是减少渐变。这是 Pytorch 代码
if z.grad > 1000:
z.grad = 10
tensorflow 2 可以应用相同的功能吗?
谢谢
【问题讨论】:
标签: python pytorch tensorflow2.0 gradient
所以在 TF2 中,假设我们定义了以下变量和优化器:
import tensorflow as tf
from tensorflow import keras
opt = tf.keras.optimizers.Adam(learning_rate=0.1)
x = tf.Variable([3.0, 4.0])
y = tf.Variable([1.0, 1.0, 1.0, 1.0])
var_list = [x, y]
然后我们可以使用tf.GradientTape()获取渐变:
with tf.GradientTape() as tape:
loss = tf.reduce_sum(x ** 2) + tf.reduce_sum(y)
grads = tape.gradient(loss, var_list)
最后我们可以通过自定义函数来处理渐变:
def clip_grad(grad):
if grad > 1000:
grad = 10
return grad
processed_grads = [tf.map_fn(clip_grad, g) for g in grads]
opt.apply_gradients(zip(processed_grads, var_list))
请注意,您可能会发现 keras 优化器有 get_gradients 方法,但它不适用于 TF2 中默认启用的 eager execution,如果您想使用它,那么您可能必须以 TF1 方式编写代码
【讨论】:
x、'y'、'z'。我只想剪裁y 的渐变。有什么想法吗? grads 似乎是一个列表。不确定如何在grads 中获取y 的梯度。谢谢。
tape.gradient 返回张量的列表或嵌套结构(或 IndexedSlices,或无),源中的每个元素一个。返回的结构与源的结构相同,所以如果你的var_list=[x, y, z] 那么grads[1] 是y的梯度