Функция tf.GradientTape

прототип функции

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)

おすすめ

転載: blog.csdn.net/weixin_49346755/article/details/127400259