2016-10-22 35 views
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()) 

是否有辦法作爲列車運行的結果,將該變量設置爲某個值,然後通過梯度修改其值?

編輯:代碼修復

+0

你應該儘量減少'x',不'x_'。 'x_'是一個賦值操作,可以在單獨的'sess.run'調用中調用以修改值 –

+0

@YaroslavBulatov目標是將x_最小化,它不僅表示賦值,而且表示整個模型。說'x_ = large_network(x.assign(const))',我的目標是優化'loss(x_)',但是捕捉'x'中的漸變。 –

+0

如果你想在'x'中保存漸變,你可以做類似'tf.assign(x,gradient)'。如果你想將'x'設置爲某個值,然後將其最小化,可以運行'tf.assign(x,somevalue)',然後運行'tf.assign_add(x,gradient) –

回答

0

骯髒的這一個黑客:

x = tf.Variable(99.0) 
    const = tf.constant(5.0) 
    x_ = x + tf.stop_gradient(-x) + const # ARGHH 
    opt = tf.train.MomentumOptimizer(learning_rate=0.0001, momentum=0.9) 
    train = opt.minimize(x_) 

    with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    print(x_.eval()) 
    x_original = x.eval() 
    sess.run(train) 
    print(x.eval() - x_original + const.eval())