В Pytorch мы можем получить доступ к градиенту переменной x
с помощью
z.grad
Что такое тот же синтаксис в Tensorflow 2
. Моя цель - сократить градиент. Вот код Pytorch
if z.grad > 1000:
z.grad = 10
Может ли tensorflow 2 применять те же функции?
Спасибо
Итак, предположим, что в TF2 мы определяем следующие переменные и оптимизатор:
import tensorflow as tf
from tensorflow import keras
opt = tf.keras.optimizers.Adam(learning_rate=0.1)
x = tf.Variable([3.0, 4.0])
y = tf.Variable([1.0, 1.0, 1.0, 1.0])
var_list = [x, y]
Затем мы можем получить градиенты, используя tf.GradientTape()
:
with tf.GradientTape() as tape:
loss = tf.reduce_sum(x ** 2) + tf.reduce_sum(y)
grads = tape.gradient(loss, var_list)
Наконец, мы можем обрабатывать градиенты пользовательской функцией:
def clip_grad(grad):
if grad > 1000:
grad = 10
return grad
processed_grads = [tf.map_fn(clip_grad, g) for g in grads]
opt.apply_gradients(zip(processed_grads, var_list))
Обратите внимание, что вы можете обнаружить, что у оптимизаторов keras есть метод get_gradients
, но он не будет работать с включенным eager execution
, который по умолчанию используется в TF2. Если вы хотите использовать его, вам, возможно, придется писать код в стиле TF1.
@jason Рад помочь, из документов: tape.gradient
вернуть список или вложенную структуру тензоров (или IndexedSlices, или None), по одному для каждого элемента в источниках. Возвращаемая структура такая же, как структура источников, поэтому, если ваш var_list=[x, y, z]
, то grads[1]
является градиентом y
Спасибо за ответ. Предположим, у меня есть много переменных в графе вычислений, таких как
x
, 'y', 'z'. Я только хочу обрезать градиентy
. Любая идея сделать это? Кажется, чтоgrads
— это список. Не знаю, как получить градиентy
вgrads
. Спасибо.