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