TensorFlow 中的平均池化函数是如何工作的?

问题描述 投票:0回答:1

让我们假设这样的张量:

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。我犯了什么错误?

tensorflow deep-learning neural-network conv-neural-network pooling
1个回答
0
投票

如果您查看文档,AveragePooling2D 您可以看到填充

“相同”导致输入的左/右或上/下均匀填充,使得输出具有与输入相同的高度/宽度维度。

这表示填充可以添加到形状的两侧。这意味着第一个值是:

(1 + 2 + 3 + 6 + 7 + 8)/6

第二个值是

(4 + 5 + 9 + 10)/4

您假设第一个元素从 1 到 4,但图像的两边都有填充。 1 在开头,2 在结尾。因此,第一个值是从 1-3 计算的,第二个值是从 4-5 计算的。

在您的 2x2 情况下,如果需要填充,则只会填充 1 行/列,并且似乎总是在末尾添加。

文档虽然不清楚,所以我不会依赖这种行为。

© www.soinside.com 2019 - 2024. All rights reserved.