2017-12-28 9 views
0

사용자 정의 TF 작업에 대한 그래디언트 메서드를 정의하려고합니다. 내가 찾은 대부분의 솔루션은 gist에 기반하여 harpone에 기반한 것 같습니다. GPU에서 실행되지 않는 py_func을 사용하기 때문에이 방법을 사용하기를 꺼립니다. 나는 또 다른 해결책을 발견 heretf.identity() 보이는 더 우아하고 나 GPU에서 실행됩니다 생각합니다. 그러나, 나는 사용자 정의 그라디언트 함수에서 작업의 입력에 액세스하는 데 문제가 있습니다.TensorFlow에서 사용자 지정 그라디언트를 정의 할 때 op 입력 사용

@tf.RegisterGradient('MyCustomGradient') 
def _custom_gradient(op, gradients): 
    x = op.inputs[0] 
    return(x) 

def my_op(w): 
    return tf.pow(w,3) 


var_foo = tf.Variable(5, dtype=tf.float32) 
bar = my_op(var_foo) 


g = tf.get_default_graph() 
with g.gradient_override_map({'Identity': 'MyCustomGradient'}): 
    bar = tf.identity(bar) 
    g = tf.gradients(bar, var_foo) 

with tf.Session() as sess: 

    sess.run(tf.global_variables_initializer()) 
    print(sess.run(g)) 

내가 (이 예에서는 5) 영업 이익 입력을 반환 _custom_gradient()을 기대했지만 대신이 op output x gradient를 반환 할 것 : 여기 내 코드입니다. 내 사용자 정의 my_op은 tf.sign과 같은 차별 할 수없는 연산을 가지며 입력을 기반으로 사용자 정의 그라디언트를 정의하고 싶습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 코드에 문제가 없는지

+0

필자가 생각한 것처럼 사용자 그라디언트가'my_op()'함수가 아니라'identity()'op에 연결되어 있다고 생각합니다. – Milad

답변

2

:

하자 최초의 할 전진 패스 :

var_foo = 5 ->bar = 125 ->tf.identity(bar) = 125

이제하자 backpropagate :

tf.identity(bar)의 그라데이션 인수가 bar 인 경우 사용자 정의에 따라 bar과 같음, 즉 125. var_foo에 대한 bar의 기울기는 var_foo의 제곱의 3 배이며 이는 75입니다. 곱하기, 9375을 얻습니다. 이것은 실제로 코드의 결과입니다.

에는 op의 순방향 값이 들어 있습니다. 이 경우, identity 연산의 순방향 패스는 125입니다.

+0

감사합니다. 나는'my_op' 함수에 대한 사용자 정의 그라디언트를 정의하기를 원했지만 tf.identity에 대해 정의했습니다. 나는 py_func로 돌아 가야만한다고 생각한다. – Milad