Python tf层备选方案
我的一个操作需要整数,但卷积的输出是浮点。Python tf层备选方案,python,tensorflow,Python,Tensorflow,我的一个操作需要整数,但卷积的输出是浮点。 这意味着我需要使用tf.floor,tf.ceil,tf.cast…等来处理它。 但是这些操作会导致None梯度,因为像tf.floor这样的操作是不可微的 所以,我尝试了下面的方法 首先。绕道 out1 = tf.subtract(vif, tf.subtract(vif, tf.floor(vif))) 但是,test.compute\u gradient\u error的输出是500或0,我认为这不是一个合理的梯度 秒。楼层覆盖梯度函数 @op
这意味着我需要使用
tf.floor
,tf.ceil
,tf.cast
…等来处理它。但是这些操作会导致
None
梯度,因为像tf.floor
这样的操作是不可微的
所以,我尝试了下面的方法
首先。绕道
out1 = tf.subtract(vif, tf.subtract(vif, tf.floor(vif)))
但是,test.compute\u gradient\u 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\u gradient\u error
的输出为500或1,也不起作用
问题:一种获得整数并保持反向传播工作良好的方法(2.0、5.0之类的值是可以的)一般来说,用梯度下降法解决离散问题并非不可取。在某种程度上,您应该能够在TF中表达整数解算器,但您或多或少需要自己 FWIW,地板功能看起来像一把锯子。它的导数是1处的常数函数,每个整数处都有小孔。在这些位置,你有一个指向下方的狄拉克函数,如果你愿意,就像一个耙子。狄拉克泛函有有限的能量,但没有有限的值 解决这些问题的标准方法是用(至少一次)可微(平滑)的东西“放松”硬地板约束,从而放松问题 有多种方法可以做到这一点。也许最受欢迎的是:
你是说
floor
像阶跃函数一样,我可以试着找到一个类似\u/-
的线性函数,这样函数就可以像floor
一样工作了几乎是的,没错。当你在训练时,一定要逐渐增加坡度。我不明白逐渐增加坡度的含义。如果我有这种功能,为什么我需要逐渐增加斜率。或者这个功能是通过培训获得的?谢谢,函数将有一个斜率。如果你从一个几乎垂直的坡度开始,那么除了非常近的坡度外,所有地方的坡度都是零。如果以较大的倾斜开始,则可以轻推输出以使其更接近。然后,可以开始增加坡度,使其更像所需的坡度。你可以在几个时代后改变增加。