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())
是否有辦法作爲列車運行的結果,將該變量設置爲某個值,然後通過梯度修改其值?
編輯:代碼修復
你應該儘量減少'x',不'x_'。 'x_'是一個賦值操作,可以在單獨的'sess.run'調用中調用以修改值 –
@YaroslavBulatov目標是將x_最小化,它不僅表示賦值,而且表示整個模型。說'x_ = large_network(x.assign(const))',我的目標是優化'loss(x_)',但是捕捉'x'中的漸變。 –
如果你想在'x'中保存漸變,你可以做類似'tf.assign(x,gradient)'。如果你想將'x'設置爲某個值,然後將其最小化,可以運行'tf.assign(x,somevalue)',然後運行'tf.assign_add(x,gradient) –