MaxPooling2D 后的图像形状,padding ='same' -- 计算卷积自动编码器中的逐层形状

use*_*777 2 deep-learning keras-layer keras-2

非常简单地,我的问题与在 Keraspadding = 'same'代码中使用时在maxpool 层之后图像大小与输入图像大小不保持相同的问题有关。我正在浏览 Keras 博客:在 Keras 中构建自动编码器。我正在构建卷积自动编码器。自编码器代码如下:

input_layer = Input(shape=(28, 28, 1))
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_layer)
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
x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_layer, decoded)
autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
Run Code Online (Sandbox Code Playgroud)

根据autoencoder.summary(),第一Conv2D(16, (3, 3), activation='relu', padding='same')(input_layer)层之后的图像输出为 28 X 28 X 16,即与输入图像大小相同。这是因为填充是'same'.

在 [49] 中:autoencoder.summary()
(层数由我给出,不在输出中产生)
_______________________________________________________
  层(类型)输出形状参数#   
================================================== ================
1.input_1 (InputLayer) (None, 28, 28, 1) 0         
_______________________________________________________
2.conv2d_1 (Conv2D) (无, 28, 28, 16) 160       
_______________________________________________________
3.max_pooling2d_1 (MaxPooling2 (None, 14, 14, 16) 0         
_______________________________________________________
4.conv2d_2 (Conv2D) (None, 14, 14, 8) 1160      
_______________________________________________________
5.max_pooling2d_2 (MaxPooling2 (None, 7, 7, 8) 0         
_______________________________________________________
6.conv2d_3 (Conv2D) (无, 7, 7, 8) 584       
_______________________________________________________
7.max_pooling2d_3 (MaxPooling2 (None, 4, 4, 8) 0         
_______________________________________________________
8.conv2d_4 (Conv2D) (无, 4, 4, 8) 584       
_______________________________________________________
9.up_sampling2d_1 (UpSampling2 (None, 8, 8, 8) 0         
_______________________________________________________
10.conv2d_5 (Conv2D) (无, 8, 8, 8) 584       
_______________________________________________________
11.up_sampling2d_2 (UpSampling2 (None, 16, 16, 8) 0         
_______________________________________________________
12.conv2d_6 (Conv2D) (None, 14, 14, 16) 1168      
_______________________________________________________
13.up_sampling2d_3 (UpSampling2 (None, 28, 28, 16) 0         
_______________________________________________________
14.conv2d_7 (Conv2D) (无, 28, 28, 1) 145       
================================================== ================

下一层(第 3 层)是,MaxPooling2D((2, 2), padding='same')(x)。summary() 显示该层的输出图像大小为 14 X 14 X 16。但该层中的填充也是'same'. 那么为什么输出图像大小不会保持为带有填充零的 28 X 28 X 16 呢?

此外,当来自其较早层之上的输入形状为 (16 X 16 X 8) 时,尚不清楚在第 12 层之后输出形状如何变为 (14 X 14 X 16 )。

`

lej*_*lot 5

下一层(第 3 层)是 MaxPooling2D((2, 2), padding='same')(x)。summary() 显示该层的输出图像大小为 14 X 14 X 16。但是该层中的填充也是“相同的”。那么为什么输出图像大小不会保持为带有填充零的 28 X 28 X 16 呢?

似乎对填充的作用存在误解。填充只是处理极端情况(在图像边界旁边做什么)。但是你有 2x2 的 maxpooling 操作,在 Keras 中默认步长等于池化大小,所以 stride=2,这将图像大小减半。您需要手动指定 stride=1 以避免这种情况。来自 Keras 文档:

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

步幅:整数,2 个整数的元组,或无。跨越价值观。如果没有,它将默认为 pool_size

对于第二个问题

此外,当来自其较早层之上的输入形状为 (16 X 16 X 8) 时,尚不清楚在第 12 层之后输出形状如何变为 (14 X 14 X 16)。

第 12 层没有指定 padding=same。