tensorflow conv2d偶数和奇数步幅之间的不同起始索引

时间:2017-06-30 19:01:28

标签: python machine-learning tensorflow deep-learning convolution

tf.nn.conv2d doc我对SAME卷积的理解(无论大步)第一个点积应该以(0,0)为中心 虽然你可以看到当步幅是奇数时,第一个点积似乎以(1,1)为中心: 在这个玩具示例中

  

输入形状为[5,5,1]

     

文件管形状是[3,3,1,1]

     

res = tf.nn.conv2d(X,F,strides = [1,x,x,1],padding ='SAME')

迈步1结果:

array([[ 1.49573362,  2.65084887,  2.96818447,  3.04787111,  1.89275599],
   [ 3.1941781 ,  4.47312069,  4.10260868,  4.13415051,  2.85520792],
   [ 2.65490007,  3.41439581,  2.93415952,  3.65811515,  2.89861989],
   [ 2.22547054,  2.98453856,  2.89428496,  3.29111433,  2.53204632],
   [ 0.52702606,  1.16226625,  1.75986075,  2.20483446,  1.56959426]], dtype=float32)

迈步2结果:

array([[ 1.49573362,  2.96818447,  1.89275599],
   [ 2.65490007,  2.93415952,  2.89861989],
   [ 0.52702606,  1.75986075,  1.56959426]], dtype=float32)

迈步3结果:

array([[ 4.47312069,  2.85520792],
   [ 1.16226625,  1.56959426]], dtype=float32)

这是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

正在发生的事情是,如果额外零列(来自填充)的数量为奇数,则tensorflow将在末尾添加列。

在stride = 1的示例中,它需要添加两列,因此它在开头添加一列,在结尾添加一列(意味着每一侧的开头,结尾:左,右,上,下)。 Stride = 2也会这样做。

但是,对于stride = 3,它只需要添加一列,并在末尾(右侧和底部)执行。如果需要添加5列,它将在开头添加2(左,上),在结尾添加3(右,下)