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

Есть ли способ установить переменную в определенное значение и все же получить ее значение, измененное градиентом в результате работы поезда?

Edit: код исправления

+0

Вы должны минимизировать 'x', а не' x_'. «X_» - это операция назначения, которая может быть вызвана в отдельном вызове 'sess.run' для изменения значения –

+0

@ YaroslavBulatov. Цель состоит в том, чтобы минимизировать x_, который представляет собой не только назначение, но и целую модель. Скажем, 'x_ = large_network (x.assign (const))', и моя цель - оптимизировать 'loss (x_)', но поймать градиент в 'x' –

+0

Если вы хотите сохранить градиент в' x', вы можете сделать что-то вроде 'tf.assign (x, градиент)'. Если вы хотите установить «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())