tf.floor的替代计划

时间:2017-02-13 14:50:57

标签: python tensorflow

我的一个操作需要整数,但卷积的输出是浮点数 这意味着我需要使用tf.floortf.ceiltf.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就可以了)

1 个答案:

答案 0 :(得分:2)

一般来说,用梯度下降来解决离散问题并不是不可取的。您应该能够在某种程度上表达TF中的整数求解器,但您或多或少都会自己表达。

FWIW,地板功能看起来像锯。它的导数是1的常数函数,每个整数都有小孔。在这些位置,你有一个Dirac功能向下,如果你愿意,就像一个耙子。狄拉克函数具有有限的能量但没有有限值。

解决这些问题的规范方法是通过“放松”来解决问题。具有(至少一次)可微分(平滑)的东西的硬地板约束。

有多种方法可以做到这一点。也许最受欢迎的是:

  1. 破解一个看起来像你想要的功能。例如,分段线性函数可以快速向下倾斜,但不能垂直向下倾斜。
  2. 用sigmoids替换步骤功能
  3. 使用过滤器近似值,如果它是时间序列
  4. ,则可以很好地理解