Можно ли использовать функцию TensorFlow tf.gradients()
по частям, то есть вычислить градиент потерь с некоторым тензором и этого тензора с весом, а затем умножить их, чтобы получить исходный градиент от потерь до вес?
Например, пусть W,b
будет некоторым весом, пусть x
будет входом сети, и пусть y0
обозначает метки.
Предположим, что прямой график, например
h=Wx+b
y=tanh(h)
loss=mse(y-y0)
Мы можем вычислить tf.gradients(loss,W)
и затем применить (пропуская некоторые детали) optimizer.apply_gradients()
, чтобы обновить W
.
Затем я пытаюсь извлечь промежуточный тензор, используя var=tf.get_default_graph().get_tensor_by_name(...)
, а затем вычисляю два градиента: g1=tf.gradients(loss,var)
и g2=tf.gradients(var,W)
.
Тогда я бы по правилу цепочки ожидал, что размеры g1
и g2
сработают, так что я могу в некотором смысле написать g=g1*g2
и получить обратно tf.gradients(loss,W)
.
К сожалению, это не тот случай. Размеры неверны. Размеры каждого градиента будут такими же, как у переменной w.r.t, поэтому между первым градиентом и вторым не будет соответствия. Чего мне не хватает, и как я могу это сделать?
Спасибо.