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 )。
`
下一层(第 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。
归档时间: |
|
查看次数: |
4252 次 |
最近记录: |