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)
Я изучаю tenorflow2.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, тензор потока-2.0.0