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)  # => ERROR: No gradients provided for any variable 
    print(x.eval()) 

: 코드의 다음 평화 이동 변수에 값을 할당하는 것은하지 그라데이션 가치있는 작업으로 간주되는 동안, 즉 변수 값이 최적화

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 

에 의해 수정 동작을 원하는 설명 변수를 특정 값으로 설정하고 열차 운행 결과로 그래디언트로 값을 수정합니까?

편집 : 이것에 대한 코드 수정

+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())