Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow GradientTape不跟踪优化器。是否应用梯度?_Python_Tensorflow_Gradienttape - Fatal编程技术网

Python Tensorflow GradientTape不跟踪优化器。是否应用梯度?

Python Tensorflow GradientTape不跟踪优化器。是否应用梯度?,python,tensorflow,gradienttape,Python,Tensorflow,Gradienttape,我正在学习tensorflow2.0 GradientTape()并测试这段代码,它计算二阶导数d(x-0.01*df(x)/dx)/dx。给定x=3且f(x)=x*x,结果为5.7624。上面的代码得到了正确的答案。 然后我试着换了线 import tensorflow as tf def f(x): return tf.multiply(x, x) x = tf.Variable([3.]) with tf.GradientTape() as test_tape: te

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

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)

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


python-3.7,tensorflow-2.0.0

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

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