Tensorflow GradientTape не отслеживает optimizer.apply_gradients? - PullRequest
0 голосов
/ 29 марта 2020
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

1 Ответ

0 голосов
/ 31 марта 2020

ОК, я получаю ответ сам. Операция optimizer.apply_gradients не создает узел в Graph, он просто изменяет значение в исходном пространстве памяти, поэтому между x_prime и предыдущими узлами не будет никакой связи. Кроме того, некоторые другие операции или функции также не работают в GradientTape, такие как tf.Varaible (). Assign (), .assign_add (), .assign_sub (), tf.keras.Layers.Layer.set_weights (), .et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...