2017-01-21 28 views
1

tf.floor return无梯度
这意味着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使用None表示0实施的原因。因为您想要训练,所以如果退回的渐变为真梯度0,我认为它不会对您有所帮助。您可以使用gradient_override_map来代替梯度Identity op对于Floor如下

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]))