Мне было интересно, что делает аргумент output_gradients в функции градиента объекта GradientTape в тензорном потоке. Согласно https://www.tensorflow.org/api_docs/pyt ... e#gradient, эта переменная должна содержать «список градиентов, по одному для каждого дифференцируемого элемента цели».
Ее значение по умолчанию — None. .
Не очень понятно, что именно это делает.
Когда я опускаю аргумент, функция вычисляет якобиан относительно некоторой функции , например z None:
gamma = 1
xi_transform = gpflow.optimizers.natgrad.XiNat()
dL_dmean = gpflow.base._to_constrained(q_mu_grad, q_mu.transform)
dL_dvarsqrt = gpflow.base._to_constrained(q_sqrt_grad, q_sqrt.transform)
with tf.GradientTape(persistent=True, watch_accessed_variables=False) as tape:
tape.watch([q_mu.unconstrained_variable, q_sqrt.unconstrained_variable])
eta1, eta2 = gpflow.optimizers.natgrad.meanvarsqrt_to_expectation(q_mu, q_sqrt)
meanvarsqrt = gpflow.optimizers.natgrad.expectation_to_meanvarsqrt(eta1, eta2)
dL_deta1, dL_deta2 = tape.gradient(
meanvarsqrt, [eta1, eta2], output_gradients=[dL_dmean, dL_dvarsqrt]
)
dtheta_deta1, dtheta_deta2 = tape.gradient(
meanvarsqrt, [eta1, eta2], output_gradients=None
)
return dL_deta1, dL_deta2, dtheta_deta1, dtheta_deta2
X_data = tf.ones(5)
num_latent_gps = 1
static_num_data = X_data.shape[0]
q_sqrt_unconstrained_shape = (num_latent_gps, gpflow.utilities.triangular_size(static_num_data))
num_data = gpflow.Parameter(tf.shape(X_data)[0], shape=[], dtype=tf.int32, trainable=False)
dynamic_num_data = tf.convert_to_tensor(num_data)
mu = np.array([[0.93350756], [0.15833747], [0.23830378], [0.28742445], [0.14999759]])
q_mu = gpflow.Parameter(mu, shape=(static_num_data, num_latent_gps))
q_sqrt = tf.eye(dynamic_num_data, batch_shape=[num_latent_gps])
q_sqrt = gpflow.Parameter(
q_sqrt,
transform=gpflow.utilities.triangular(),
unconstrained_shape=q_sqrt_unconstrained_shape,
constrained_shape=(num_latent_gps, static_num_data, static_num_data),
)
q_mu_grad = q_mu.unconstrained_variable * 0.33
q_sqrt_grad = q_sqrt.unconstrained_variable
dL_deta1, dL_deta2, dtheta_deta1, dtheta_deta2 = natgrad_apply_gradients(q_mu_grad, q_sqrt_grad, q_mu, q_sqrt)
dL_deta1 !== dtheta_deta1 * q_mu_grad
[/code]
Надеюсь, что кто-нибудь знает и заранее спасибо!
Подробнее здесь: https://stackoverflow.com/questions/786 ... e-gradient
Что делает output_gradient в GradientTape().gradient? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение