사용자 정의 TF 작업에 대한 그래디언트 메서드를 정의하려고합니다. 내가 찾은 대부분의 솔루션은 gist에 기반하여 harpone에 기반한 것 같습니다. GPU에서 실행되지 않는 py_func
을 사용하기 때문에이 방법을 사용하기를 꺼립니다. 나는 또 다른 해결책을 발견 here 그 tf.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과 같은 차별 할 수없는 연산을 가지며 입력을 기반으로 사용자 정의 그라디언트를 정의하고 싶습니다. 내가 도대체 뭘 잘못하고있는 겁니까? 코드에 문제가 없는지
필자가 생각한 것처럼 사용자 그라디언트가'my_op()'함수가 아니라'identity()'op에 연결되어 있다고 생각합니다. – Milad