1
Длинный рассказ короткий. Следующий мир кода описывает желаемое поведение т.е. значение переменной изменяется оптимизаторомКак передать градиент в переменную после операции назначения?
x = tf.Variable(5.0)
# x = x.assign(tf.constant(5.0))
opt = tf.train.MomentumOptimizer(learning_rate=0.0001, momentum=0.9)
train_op = opt.minimize(x)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
sess.run(train_op)
print(x.eval()) # => 4.9999 - Desired result
Хотя присвоение значения переменной на ходу считается не градиент достойной работы:
x = tf.Variable(5.0)
x_ = x.assign(tf.constant(5.0))
opt = tf.train.MomentumOptimizer(learning_rate=0.0001, momentum=0.9)
train_op = opt.minimize(x_)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
sess.run(train_op) # => ERROR: No gradients provided for any variable
print(x.eval())
Есть ли способ установить переменную в определенное значение и все же получить ее значение, измененное градиентом в результате работы поезда?
Edit: код исправления
Вы должны минимизировать 'x', а не' x_'. «X_» - это операция назначения, которая может быть вызвана в отдельном вызове 'sess.run' для изменения значения –
@ YaroslavBulatov. Цель состоит в том, чтобы минимизировать x_, который представляет собой не только назначение, но и целую модель. Скажем, 'x_ = large_network (x.assign (const))', и моя цель - оптимизировать 'loss (x_)', но поймать градиент в 'x' –
Если вы хотите сохранить градиент в' x', вы можете сделать что-то вроде 'tf.assign (x, градиент)'. Если вы хотите установить «x» на определенное значение и затем свернуть его, вы можете запустить 'tf.assign (x, somevalue)', а затем запустить 'tf.assign_add (x, gradient)' –