Как получить градиент потери в переменной TensorFlow?
Функция, за которой я работаю, - это указать, какой градиент данной переменной относится к моей функции ошибки, учитывая некоторые данные.
Один из способов сделать это - посмотреть, насколько изменилась переменная после вызова для тренировки, но, очевидно, это может варьироваться в широких пределах на основе алгоритма обучения (например, было бы почти невозможно сказать что-то вроде RProp) и просто не очень чисто.
Спасибо заранее.
Ответы
Ответ 1
Функция tf.gradients()
позволяет вычислять символьный градиент одного тензора относительно одного или нескольких других тензоров - включая переменные. Рассмотрим следующий простой пример:
data = tf.placeholder(tf.float32)
var = tf.Variable(...) # Must be a tf.float32 or tf.float64 variable.
loss = some_function_of(var, data) # some_function_of() returns a 'Tensor'.
var_grad = tf.gradients(loss, [var])[0]
Затем вы можете использовать этот символический градиент для оценки градиента в некоторой конкретной точке (данных):
sess = tf.Session()
var_grad_val = sess.run(var_grad, feed_dict={data: ...})
Ответ 2
В TensorFlow 2.0 вы можете использовать GradientTape
для достижения этой цели. GradientTape
записывает градиенты любых вычислений, которые происходят в контексте этого. Ниже приведен пример того, как вы можете это сделать.
import tensorflow as tf
# Here goes the neural network weights as tf.Variable
x = tf.Variable(3.0)
with tf.GradientTape() as tape:
# Doing the computation in the context of the gradient tape
# For example computing loss
y = x**2
# Getting the gradient of weight w.r.t loss
dy_dx = tape.gradient(y, x)
print(dy_dx) # Returns 6