偶数和奇数步幅之间的tensorflow conv2d不同起始索引
tensorflow conv2d diffrent start index between even and odd stride
根据 tf.nn.conv2d doc 我对 SAME 卷积的理解(无论步幅如何)第一个点积应该以 (0,0) 为中心
尽管正如您在下面看到的那样,当步幅为奇数时,第一个点积似乎以 (1,1) 为中心:
在这个玩具示例中
input shape is [5,5,1]
filer shape is [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)
这是一个错误还是我遗漏了什么?
发生的事情是,如果额外的零列(来自填充)的数量是奇数,tensorflow 将在末尾添加列。
在您的步幅 = 1 的示例中,它需要添加两列,因此它在开头添加一列,在结尾添加一列(意思是每一边的开头、结尾:左、右、上、下)。 Stride = 2 会做同样的事情。
然而,对于 stride = 3,它只需要添加一列并在最后(右侧和底部)添加。如果需要添加 5 列,它将在开头(左、上)添加 2 列,在末尾(右、下)添加 3 列
根据 tf.nn.conv2d doc 我对 SAME 卷积的理解(无论步幅如何)第一个点积应该以 (0,0) 为中心 尽管正如您在下面看到的那样,当步幅为奇数时,第一个点积似乎以 (1,1) 为中心: 在这个玩具示例中
input shape is [5,5,1]
filer shape is [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)
这是一个错误还是我遗漏了什么?
发生的事情是,如果额外的零列(来自填充)的数量是奇数,tensorflow 将在末尾添加列。
在您的步幅 = 1 的示例中,它需要添加两列,因此它在开头添加一列,在结尾添加一列(意思是每一边的开头、结尾:左、右、上、下)。 Stride = 2 会做同样的事情。
然而,对于 stride = 3,它只需要添加一列并在最后(右侧和底部)添加。如果需要添加 5 列,它将在开头(左、上)添加 2 列,在末尾(右、下)添加 3 列