为什么要对最大池使用相同的填充?

时间:2019-01-22 21:30:14

标签: keras padding

通过the autoencoder tutorial in Keras blog时,我看到作者在卷积自动编码器部分的最大池化层中使用了相同的填充,如下所示。

x = MaxPooling2D((2, 2), padding='same')(x)

有人可以解释这背后的原因吗?对于最大池,我们想减小高度和宽度,但是为什么要在此处使用相同的填充来保持高度和宽度相同呢?

此外,此代码的结果将尺寸减半为2,因此相同的填充似乎无效。

1 个答案:

答案 0 :(得分:1)

来自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

因此,以您的教程示例为例;您的图片尺寸将从28-> 14-> 7-> 4变为4,每个箭头代表合并层。