Преобразование из tf.gradients() в tf.GradientTape() возвращает NonePython

Программы на Python
Ответить
Anonymous
 Преобразование из tf.gradients() в tf.GradientTape() возвращает None

Сообщение Anonymous »

Я переношу часть кода TF1 в TF2. Полный код вы можете посмотреть здесь, строки [155-176]. В TF1 есть строка, которая получает градиенты с учетом потери (число с плавающей запятой) и тензора (m, n).
Изменить: проблема сохраняется
Примечание: код TF2 должен быть совместимым и должен работать внутри tf.function

Код: Выделить всё

g = tf.gradients(-loss, f)  # loss being a float and f being a (m, n) tensor
k = -f_pol / (f + eps)  # f_pol another (m, n) tensor and eps a float
k_dot_g = tf.reduce_sum(k * g, axis=-1)
adj = tf.maximum(
0.0,
(tf.reduce_sum(k * g, axis=-1) - delta)
/ (tf.reduce_sum(tf.square(k), axis=-1) + eps),
)
g = g - tf.reshape(adj, [nenvs * nsteps, 1]) * k
grads_f = -g / (nenvs * nsteps)
grads_policy = tf.gradients(f, params, grads_f)  # params being the model parameters
В коде TF2 я пытаюсь:

Код: Выделить всё

with tf.GradientTape() as tape:
f = calculate_f()
f_pol = calculate_f_pol()
others = do_further_calculations()
loss = calculate_loss()
g = tape.gradient(-loss, f)
Однако я продолжаю получать g = [None], использую ли я Tape.watch(f) или создаю tf.Variable со значением f или даже использую tf.gradients() внутри tf.function, потому что в противном случае он будет жаловаться.

Подробнее здесь: https://stackoverflow.com/questions/663 ... turns-none
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»