прототип функции
tf.GradientTape(
persistent=False, watch_accessed_variables=True
)
Описание функции
TensorFlow предоставляет API tf.GradientTape для автоматического дифференцирования, то есть расчета градиента вычислений по отношению к некоторым входным данным (обычно tf.Variable). TensorFlow «записывает» соответствующие операции, выполняемые в контексте tf.GradientTape, на «полосы». Затем TensorFlow вычисляет «записанный» вычисленный градиент, используя дифференцирование обратного режима с использованием полос.
Параметр persist указывает, является ли созданная лента постоянной. Если значение False, метод градиента можно вызвать не более одного раза; если значение True, его можно вызвать несколько раз.
Использование функции
x = tf.Variable(3.0)
with tf.GradientTape() as tape:
y = x**2
После записи некоторых операций используйте GradientTape.gradient(target,sources), чтобы вычислить градиент некоторой цели (обычно потери) относительно некоторого источника (обычно переменной модели).
# dy = 2x * dx
dy_dx = tape.gradient(y, x)
dy_dx.numpy()
Результат 6,0.
Чтобы получить градиент потерь по двум переменным , вы можете передать обе переменные в качестве источников метода градиента. Полосы градиента очень гибки в том, как они передаются по источнику, принимая любую вложенную комбинацию списков или словарей и возвращая структуру градиента таким же образом.
w = tf.Variable(tf.random.normal((3, 2)), name='w')
b = tf.Variable(tf.zeros(2, dtype=tf.float32), name='b')
x = [[1., 2., 3.]]
with tf.GradientTape(persistent=True) as tape:
y = x @ w + b
loss = tf.reduce_mean(y**2)
[dl_dw, dl_db] = tape.gradient(loss, [w, b])
Обычно tf.Variables собираются в tf.Module или один из его подклассов (layers.Layer, keras.Model) для создания контрольных точек и экспорта.
В большинстве случаев вам необходимо рассчитать градиент относительно обучаемых переменных модели. Поскольку все подклассы tf.Module агрегируют свои переменные в свойстве Module.trainable_variables , вычислить эти градиенты можно в несколько строк кода:
layer = tf.keras.layers.Dense(2, activation='relu')
x = tf.constant([[1., 2., 3.]])
with tf.GradientTape() as tape:
# Forward pass
y = layer(x)
loss = tf.reduce_mean(y**2)
# Calculate gradients with respect to every trainable variable
grad = tape.gradient(loss, layer.trainable_variables)