据我从tf.nn.conv2d doc理解相同的卷积(无论跨度如何),第一个点积应以(0,0)为中心
但是,如您所见,当步幅为奇数时,波纹管的首个乘积似乎以(1,1)为中心:
在这个玩具例子中


  输入形状为[5,5,1]
  
  滤网形状为[3,3,1,1]
  
  res = tf.nn.conv2d(X,F,步幅= [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)


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

最佳答案

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

在您的步幅= 1的示例中,它需要添加两列,因此它在开头添加了一列,在结尾添加一列(表示每一边的开始,结尾:左,右,上,下)。步幅= 2将执行相同的操作。

但是,对于跨度= 3,只需要添加一列,然后在末尾(右侧和底部)添加一列即可。如果需要添加5列,则会在开头(左侧,顶部)添加2列,在结尾(右侧,底部)添加3列

关于python - 偶数步距和奇数步距之间的tensorflow conv2d差异起始索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44853243/

10-12 17:56