Tensorflow 2.0 中“Tensor.grad”的等效语法是什么

what is the equivalent sytax for `Tensor.grad` in Tensorflow 2.0

在Pytorch中,我们可以通过

访问变量x的梯度
z.grad

Tensorflow 2 中的相同语法是什么?我的目标是削减渐变。这是 Pytorch 代码

if z.grad > 1000:
    z.grad = 10

tensorflow 2可以应用相同的功能吗?

谢谢

所以在 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 的方式编写代码