【问题标题】:what is the equivalent sytax for `Tensor.grad` in Tensorflow 2.0Tensorflow 2.0 中 `Tensor.grad` 的等效语法是什么
【发布时间】: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


    【解决方案1】:

    所以在 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 的梯度。谢谢。
    • @jason 很高兴提供帮助,来自docstape.gradient 返回张量的列表或嵌套结构(或 IndexedSlices,或无),源中的每个元素一个。返回的结构与源的结构相同,所以如果你的var_list=[x, y, z] 那么grads[1] 是y的梯度
    猜你喜欢
    • 2020-08-12
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多