我的一个操作需要整数,但卷积的输出是浮点数
这意味着我需要使用tf.floor
,tf.ceil
,tf.cast
等来处理它。
但是这些操作导致None
渐变,因为像tf.floor
这样的操作不可区分
所以,我尝试过类似下面的内容
第一即可。迂回
out1 = tf.subtract(vif, tf.subtract(vif, tf.floor(vif)))
但是test.compute_gradient_error
的输出是500或0,我不认为这是一个合理的渐变。
第二即可。覆盖楼层的渐变功能
@ops.RegisterGradient("CustomFloor")
def _custom_floor_grad(op, grads):
return [grads]
A, B = 50, 7
shape = [A, B]
f = np.ones(shape, dtype=np.float32)
vif = tf.constant(f, dtype=tf.float32)
# out1 = tf.subtract(vif, tf.subtract(vif, tf.floor(vif)))
with tf.get_default_graph().gradient_override_map({"Floor": "CustomFloor"}):
out1 = tf.floor(vif)
with tf.Session() as sess:
err1 = tf.test.compute_gradient_error(vif, shape, out1, shape)
print err1
test.compute_gradient_error
的输出为500或1,也不起作用。
问题:获取整数并保持反向传播工作正常的方法(值为2.0,5.0就可以了)
答案 0 :(得分:2)
一般来说,用梯度下降来解决离散问题并不是不可取的。您应该能够在某种程度上表达TF中的整数求解器,但您或多或少都会自己表达。
FWIW,地板功能看起来像锯。它的导数是1的常数函数,每个整数都有小孔。在这些位置,你有一个Dirac功能向下,如果你愿意,就像一个耙子。狄拉克函数具有有限的能量但没有有限值。
解决这些问题的规范方法是通过“放松”来解决问题。具有(至少一次)可微分(平滑)的东西的硬地板约束。
有多种方法可以做到这一点。也许最受欢迎的是: