tf.floor的梯度为None

时间:2017-01-21 14:12:00

标签: python tensorflow

tf.floor返回无渐变
这意味着floor操作前的权重不会更新,对吧? 但我仍然需要渐变来更新重量
这不奇怪吗?有时候我们会使用floorceil ...但是他们无法提供渐变或这是正确的行动 以及tf.cast,渐变返回无

这是一个讨论渐变的问题#897,但我不明白为什么返回None是好的

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

1 个答案:

答案 0 :(得分:3)

由于实施原因,TensorFlow使用None来表示0。如果返回的渐变是真正的渐变0,我认为它不会对你有帮助,因为你想要训练。您可以使用gradient_override_mapIdentity 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]))