Python Tensorflow GradientTape不跟踪优化器。是否应用梯度?
我正在学习tensorflow2.0 GradientTape()并测试这段代码,它计算二阶导数d(x-0.01*df(x)/dx)/dx。给定x=3且f(x)=x*x,结果为5.7624。上面的代码得到了正确的答案。 然后我试着换了线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
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]))