tf.floor
返回无渐变
这意味着floor
操作前的权重不会更新,对吧?
但我仍然需要渐变来更新重量
这不奇怪吗?有时候我们会使用floor
,ceil
...但是他们无法提供渐变或这是正确的行动
以及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
答案 0 :(得分:3)
由于实施原因,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]))