2017-04-06 11 views
7

より具体的には、tf操作の構成である単純なfpropがあります。 私は、RegisterGradientを使って独自の勾配法でテンソルフロー勾配計算をオーバーライドしたいと考えています。tf操作で構成される操作のカスタム勾配の登録方法

このコードで何が問題になっていますか?

import tensorflow as tf 
from tensorflow.python.framework import ops 

@ops.RegisterGradient("MyopGrad") 
def frop_grad(op, grad): 
    x = op.inputs[0] 
    return 0 * x # zero out to see the difference: 

def fprop(x): 
    x = tf.sqrt(x) 
    out = tf.maximum(x, .2) 
    return out 

a = tf.Variable(tf.constant([5., 4., 3., 2., 1.], dtype=tf.float32)) 
h = fprop(a) 
h = tf.identity(h, name="Myop") 
grad = tf.gradients(h, a) 

g = tf.get_default_graph() 
with g.gradient_override_map({'Myop': 'MyopGrad'}): 
    with tf.Session() as sess: 
     sess.run(tf.initialize_all_variables()) 
     result = sess.run(grad) 

print(result[0]) 

私は、印刷中にすべてゼロを見てみたいが、代わりに私が取得しています:あなたはwith g.gradient_override_map({'Myop': 'MyopGrad'})

の範囲内でOPを定義する必要が

[ 0.2236068 0.25000003 0.28867513 0.35355341 0.5  ] 

答えて

7

はまた、あなたがする必要があります新しいグラデーションにMyopという名前ではなく、Identityをマップします。ここで

は完全なコードは次のとおりです。

import tensorflow as tf 
from tensorflow.python.framework import ops 

@ops.RegisterGradient("MyopGrad") 
def frop_grad(op, grad): 
    x = op.inputs[0] 
    return 0 * x # zero out to see the difference: 

def fprop(x): 
    x = tf.sqrt(x) 
    out = tf.maximum(x, .2) 
    return out 

a = tf.Variable(tf.constant([5., 4., 3., 2., 1.], dtype=tf.float32)) 
h = fprop(a) 

g = tf.get_default_graph() 
with g.gradient_override_map({'Identity': 'MyopGrad'}): 
    h = tf.identity(h, name="Myop") 
    grad = tf.gradients(h, a) 

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    result = sess.run(grad) 

print(result[0]) 

出力:

[ 0. 0. 0. 0. 0.] 
+1

が、これはアイデンティティのOPとないfprop機能のカスタム勾配関数を定義していませんか? xを0で乗算しないと、[5.、4.、3.、2.、1.]は表示されませんが、identity()演算の入力が表示されます。 – Milad

関連する問題