Метод gradient класса GradientTape
Метод gradient класса GradientTape вычисляет градиент
целевой функции по отношению к исходным тензорам, которые были
записаны на ленте с помощью метода watch. Первым параметром
метод принимает целевую функцию (тензор или список тензоров),
вторым - исходный тензор или список тензоров, по которым
вычисляется градиент. Третьим параметром можно передать
необязательный аргумент unconnected_gradients, определяющий
поведение при отсутствии связи между целевой функцией и исходным
тензором.
Метод возвращает тензор градиента той же формы, что и исходный тензор, либо список тензоров, если исходных тензоров было несколько.
Синтаксис
tape.gradient(target, sources, [unconnected_gradients])
Пример
Давайте вычислим градиент функции y = x² по переменной
x в точке 3. Аналитически производная равна
2x, то есть 6:
import tensorflow as tf
x = tf.Variable(3.0)
with tf.GradientTape() as tape:
y = x ** 2
res = tape.gradient(y, x)
print(res)
Результат выполнения кода:
tf.Tensor(6.0, shape=(), dtype=float32)
Пример
Давайте вычислим градиент для тензора, созданного через
tf.constant. Так как константы автоматически не отслеживаются,
нужно явно вызвать метод watch:
import tensorflow as tf
x = tf.constant([1, 2, 3, 4, 5], dtype=tf.float32)
with tf.GradientTape() as tape:
tape.watch(x)
y = x ** 2
res = tape.gradient(y, x)
print(res)
Результат выполнения кода:
tf.Tensor([ 2. 4. 6. 8. 10.], shape=(5,), dtype=float32)
Пример
Давайте вычислим градиенты по нескольким переменным. Передадим в качестве второго параметра список тензоров и получим список градиентов:
import tensorflow as tf
x = tf.Variable(2.0)
y = tf.Variable(3.0)
with tf.GradientTape() as tape:
z = x ** 2 + y ** 3
res = tape.gradient(z, [x, y])
print(res)
Результат выполнения кода:
[<tf.Tensor: shape=(), dtype=float32, numpy=4.0>, <tf.Tensor: shape=(), dtype=float32, numpy=27.0>]
Пример
Давайте вычислим градиент двумерного тензора и убедимся, что форма результата совпадает с формой исходного тензора:
import tensorflow as tf
x = tf.constant([[1, 2, 3], [4, 5, 6]], dtype=tf.float32)
with tf.GradientTape() as tape:
tape.watch(x)
y = tf.reduce_sum(x ** 2)
res = tape.gradient(y, x)
print(res)
Результат выполнения кода:
tf.Tensor(
[[ 2. 4. 6.]
[ 8. 10. 12.]], shape=(2, 3), dtype=float32)
Пример
Давайте вычислим градиент по переменной, не участвующей в
вычислении целевой функции. По умолчанию метод вернет
None:
import tensorflow as tf
x = tf.Variable(2.0)
y = tf.Variable(3.0)
with tf.GradientTape() as tape:
z = x ** 2
res = tape.gradient(z, y)
print(res)
Результат выполнения кода:
None
Пример
Давайте передадим аргумент unconnected_gradients со значением
'zero', чтобы вместо None получить нулевой тензор:
import tensorflow as tf
x = tf.Variable(2.0)
y = tf.Variable(3.0)
with tf.GradientTape() as tape:
z = x ** 2
res = tape.gradient(z, y, unconnected_gradients='zero')
print(res)
Результат выполнения кода:
tf.Tensor(0.0, shape=(), dtype=float32)
Смотрите также
-
класс
GradientTape,
который записывает операции для автоматического дифференцирования -
метод
watch,
который начинает отслеживание тензора на ленте -
метод
jacobian,
который вычисляет матрицу Якоби целевой функции -
метод
reset,
который очищает записи ленты