Deep learning 使用padding='same'-在卷积自动编码器中逐层计算MaxPoolig2D后的图像形状

Deep learning 使用padding='same'-在卷积自动编码器中逐层计算MaxPoolig2D后的图像形状,deep-learning,keras-layer,keras-2,Deep Learning,Keras Layer,Keras 2,非常简单地说,我的问题是,当我在Keras代码中使用padding='same'时,在maxpool层之后,图像大小与输入图像大小不保持相同。我正在浏览Keras博客:。我正在建立卷积自动编码器。自动编码器代码如下所示: input_layer = Input(shape=(28, 28, 1)) x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_layer) x = MaxPooling2D((2, 2), padd

非常简单地说,我的问题是,当我在Keras代码中使用padding='same'时,在maxpool层之后,图像大小与输入图像大小不保持相同。我正在浏览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')
根据autoencoder.summary,第一个Conv2D16,3,3激活后的图像输出为28 X 28 X 16,即与输入图像大小相同。这是因为填充是“相同的”

下一层第3层是MaxPooling2D2,2,padding='same'x。摘要显示该层的输出图像大小为14 X 14 X 16。但这一层的填充也是“相同的”。那么,为什么输出图像大小不保持为28 X 28 X 16,并带有填充零

此外,当输入形状来自其早期层的上方为16 X 16 X 8时,第12层之后的输出形状如何更改为14 X 14 X 16尚不清楚

`

下一层第3层是MaxPooling2D2,2,padding='same'x。摘要显示该层的输出图像大小为14 X 14 X 16。但这一层的填充也是“相同的”。那么,为什么输出图像大小不保持为28 X 28 X 16,并带有填充零

对填充物的作用似乎存在误解。填充只考虑图像边界附近的角点情况。但是您有2x2 maxpooling操作,在Keras中,默认步幅等于池大小,因此步幅=2,这是图像大小的一半。您需要手动指定步幅=1以避免出现这种情况。来自Keras文件:

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

步长:整数、2个整数的元组或无。跨越价值观。如果没有,它将默认为池大小

关于第二个问题

此外,当输入形状来自其早期层的上方为16 X 16 X 8时,第12层之后的输出形状如何更改为14 X 14 X 16尚不清楚


第12层没有指定相同的填充

下一层第3层是MaxPooling2D2,2,padding='same'x。摘要显示该层的输出图像大小为14 X 14 X 16。但这一层的填充也是“相同的”。那么,为什么输出图像大小不保持为28 X 28 X 16,并带有填充零

对填充物的作用似乎存在误解。填充只考虑图像边界附近的角点情况。但是您有2x2 maxpooling操作,在Keras中,默认步幅等于池大小,因此步幅=2,这是图像大小的一半。您需要手动指定步幅=1以避免出现这种情况。来自Keras文件:

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

步长:整数、2个整数的元组或无。跨越价值观。如果没有,它将默认为池大小

关于第二个问题

此外,当输入形状来自其早期层的上方为16 X 16 X 8时,第12层之后的输出形状如何更改为14 X 14 X 16尚不清楚


第12层没有指定padding=same。

第12层没有指定padding=same。你知道为什么吗?我知道它会生成正确的输出形状,但是您如何提前知道哪些UpSampling2D层应该具有相同的填充,哪些不应该?如果事先不知道中的层数,我就不清楚了。第12层没有指定padding=same。你知道为什么吗?我知道它会生成正确的输出形状,但是您如何提前知道哪些UpSampling2D层应该具有相同的填充,哪些不应该?在这种情况下,层的数量事先不知道,这是不清楚的我。 In [49]: autoencoder.summary() (Numbering of layers is given by me and not produced in output) _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= 1.input_1 (InputLayer) (None, 28, 28, 1) 0 _________________________________________________________________ 2.conv2d_1 (Conv2D) (None, 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) (None, 7, 7, 8) 584 _________________________________________________________________ 7.max_pooling2d_3 (MaxPooling2 (None, 4, 4, 8) 0 _________________________________________________________________ 8.conv2d_4 (Conv2D) (None, 4, 4, 8) 584 _________________________________________________________________ 9.up_sampling2d_1 (UpSampling2 (None, 8, 8, 8) 0 _________________________________________________________________ 10.conv2d_5 (Conv2D) (None, 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) (None, 28, 28, 1) 145 =================================================================