Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tf层备选方案_Python_Tensorflow - Fatal编程技术网

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处的常数函数,每个整数处都有小孔。在这些位置,你有一个指向下方的狄拉克函数,如果你愿意,就像一个耙子。狄拉克泛函有有限的能量,但没有有限的值

解决这些问题的标准方法是用(至少一次)可微(平滑)的东西“放松”硬地板约束,从而放松问题

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

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

  • 你是说
    floor
    像阶跃函数一样,我可以试着找到一个类似
    \u/-
    的线性函数,这样函数就可以像
    floor
    一样工作了几乎是的,没错。当你在训练时,一定要逐渐增加坡度。我不明白逐渐增加坡度的含义。如果我有这种功能,为什么我需要逐渐增加斜率。或者这个功能是通过培训获得的?谢谢,函数将有一个斜率。如果你从一个几乎垂直的坡度开始,那么除了非常近的坡度外,所有地方的坡度都是零。如果以较大的倾斜开始,则可以轻推输出以使其更接近。然后,可以开始增加坡度,使其更像所需的坡度。你可以在几个时代后改变增加。