让我们假设这样的张量:
x = tf.constant([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
要应用平均池化函数,我会这样做:
x = tf.reshape(x, [1, 3, 3, 1])
avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(2, 2),strides=(2, 2), padding='same')
avg_pool_2d(x)
结果是:
<tf.Tensor: shape=(1, 2, 2, 1), dtype=float32, numpy=
array([[[[3. ],
[4.5]],
[[7.5],
[9. ]]]], dtype=float32)>
我可以按照上面的逻辑:
(1+2+4+5)/4 = 3
(3+6)/2 = 4.5
(7+8)/2 = 7.5
(9/1) = 9
我认为逻辑如下: 池化过滤器通常位于张量内部以执行池化运算符。但是当整个过滤器不位于张量内时(见下图示例),我们需要指定位于张量内的过滤器元素的数量(
a
)。下图说明了 4 x 3 张量的逻辑,池化过滤器和步长为 2 x 2,填充相同。
然而,并不总是这样。例如,假设以下张量:
y = tf.constant([[1., 2., 3., 4., 5.],
[6., 7., 8., 9., 10.]])
然后,我这样做:
y = tf.reshape(y, [1, 2, 5, 1])
avg_pool_2d = tf.keras.layers.AveragePooling2D(pool_size=(4, 4),strides=(4, 4), padding='same')
avg_pool_2d(y)
结果是这样的:
<tf.Tensor: shape=(1, 1, 2, 1), dtype=float32, numpy=
array([[[[4.5 ],
[7.]]]], dtype=float32)>
如果我想按照第一个例子的逻辑,我希望结果是这样的:
(1+2+3+4+6+7+8+9)/8 = 5
(5+10)/2 = 7.5
我正在使用 TensorFlow 2.8.0。我犯了什么错误?
如果您查看文档,AveragePooling2D 您可以看到填充
“相同”导致输入的左/右或上/下均匀填充,使得输出具有与输入相同的高度/宽度维度。
这表示填充可以添加到形状的两侧。这意味着第一个值是:
(1 + 2 + 3 + 6 + 7 + 8)/6
第二个值是
(4 + 5 + 9 + 10)/4
您假设第一个元素从 1 到 4,但图像的两边都有填充。 1 在开头,2 在结尾。因此,第一个值是从 1-3 计算的,第二个值是从 4-5 计算的。
在您的 2x2 情况下,如果需要填充,则只会填充 1 行/列,并且似乎总是在末尾添加。
文档虽然不清楚,所以我不会依赖这种行为。