为什么在最大池化中使用相同的填充?

cbn*_*ncs 8 padding keras

在阅读Keras 博客中的自动编码器教程时,我看到作者在卷积自动编码器部分的最大池化层中使用了相同的填充,如下所示。

x = MaxPooling2D((2, 2), padding='same')(x)
Run Code Online (Sandbox Code Playgroud)

有人可以解释这背后的原因吗?使用最大池化,我们想减少高度和宽度,但为什么这里使用相同的填充,保持高度和宽度相同?

此外,此代码的结果将维度减半,因此相同的填充似乎不起作用。

小智 5

来自https://keras.io/layers/convolutional/

“相同”导致填充输入,使得输出与原始输入具有相同的长度。

来自https://keras.io/layers/pooling/

pool_size:整数或 2 个整数的元组,缩小比例的因子(垂直、水平)。(2, 2) 将在两个空间维度上将输入减半。如果只指定了一个整数,则两个维度将使用相同的窗口长度。

那么,首先让我们先问一下为什么要使用填充?在卷积内核上下文中,这很重要,因为我们不想错过位于内核“中心”的每个像素。内核正在寻找的图像边缘/角落可能存在重要行为。所以我们在 Conv2D 的边缘周围填充,结果它返回与输入相同大小的输出。

然而,在 MaxPooling2D 层的情况下,我们出于类似的原因进行填充,但步幅大小受您选择的池化大小的影响。由于您的池化大小为 2,因此每次通过池化层时,您的图像都会减半。

input_img = Input(shape=(28, 28, 1))  # adapt this if using `channels_first` image data format

x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)

# at this point the representation is (4, 4, 8) i.e. 128-dimensional
Run Code Online (Sandbox Code Playgroud)

因此,就您的教程示例而言;您的图像尺寸将从 28->14->7->4 开始,每个箭头代表池化层。