繁体   English   中英

Tensorflow GradientTape 不跟踪 optimizer.apply_gradients?

[英]Tensorflow GradientTape does not trace optimizer.apply_gradients?

import tensorflow as tf

def f(x):
    return tf.multiply(x, x)

x = tf.Variable([3.])

with tf.GradientTape() as test_tape:
    test_tape.watch(x)

    with tf.GradientTape() as train_tape:
        train_tape.watch(x)
        fx = f(x)

    gradient = train_tape.gradient(fx, x)  # df(x)/x = d(x^2)/dx = 2x
    x_prime = x.__copy__()  # x' = x
    x_prime = tf.subtract(x_prime, tf.multiply(gradient, 0.01))  # x' = x' - 0.01 * 2x = 0.98x
    fx_prime = f(x_prime)

gradient = test_tape.gradient(fx_prime, x)  # df(x')/dx = df(0.98x)/dx = 1.9208 * x = 5.7624
print(gradient)

我正在学习 tensorflow2.0 GradientTape() 并测试此代码,它计算二阶导数 d(x-0.01*df(x)/dx)/dx。 给定 x = 3 和 f(x) = x*x,结果是 5.7624。 上面的代码得到了正确的答案。 然后我尝试更换线路

x_prime = tf.subtract(x_prime, tf.multiply(gradient, 0.01))

经过

optimizer = tf.optimizers.SGD()
optimizer.apply_gradients(zip([gradient], [x_prime]))

并且得到了错误的答案 5.88,我无法理解并猜测 GradientTape 不跟踪 apply_gradients? 有人知道为什么吗?

python-3.7,tensorflow-2.0.0

好的,我自己得到了答案。 optimizer.apply_gradients 操作不会在 Graph 中生成节点,它只是改变了原始内存空间中的值,因此 x_prime 和之前的节点之间不会有任何联系。 此外,其他一些操作或函数在 GradientTape 中也不起作用,例如 tf.Varaible().assign()、.assign_add()、.assign_sub()、tf.keras.Layers.Layer.set_weights()、.etc。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM