2017-01-21 12 views
1

tf.floorリターンなしグラデーション
これは、floorの操作は更新されません、右ですか?
しかし、私はまだ重みを更新するために勾配が必要です
それは変わっていませんか?時には我々はfloorceilを使用...しかし、彼らは勾配を配信することはできませんか、これは正しい行動
などtf.castで、「ここで勾配戻りなしtf.floorのグラデーションはありません

は勾配を議論する問題#897ではありませんが、私はドン返品なしが良い理由を理解してください

numa = tf.constant(5.3) 
res1 = numa * 2 
res2 = tf.floor(numa *2) 
print tf.gradients(res1, numa) 
# <type 'list'>: [<tf.Tensor 'gradients/mul_grad/Reshape:0' shape=() dtype=float32>] 

print tf.gradients(res2, numa) 
# None 

math_grad.pyを直接変更することはできますか?他の行動が必要ですか?
のようなものを削除math_grad.pyc

@ops.RegisterGradient("Floor") 
def _FloorGrad(_, unused_grad): 
    # return [None] # before 
    return [unused_grad] # I want to modify 

答えて

2

TensorFlowは、実装上の理由0を表すためにNoneを使用します。あなたが訓練したいので、返された勾配が本当の勾配0だったなら、それがあなたを助けるとは思わない。 gradient_override_mapを使用して、Floorの代わりにIdentityの勾配を次のように置き換えることができます。

tf.reset_default_graph() 
x = tf.Variable(10.) 
with tf.get_default_graph().gradient_override_map({"Floor": "Identity"}): 
    x2 = tf.floor(x) 
loss = tf.square(x2) 
opt = tf.train.GradientDescentOptimizer(0.1) 
train_op = opt.minimize(loss) 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 
for i in range(10): 
    print(sess.run([loss, train_op])) 
関連する問題