非正方形输入的CNN autoencoder输出形状不匹配问题咨询
CNN Autoencoder非正方形输入问题解答
1. Autoencoder是否强制要求输入为正方形?
Autoencoder完全不强制输入为正方形,只要编解码流程的维度变换逻辑匹配,任意长宽比的输入都可以正常运行。
2. 形状不匹配报错原因及修复方案
报错原因
输出维度(16, 800, 24, 1)和输入维度(16, 800, 20, 1)不匹配的核心原因是20这个宽度维度无法被3次2倍池化整除:
- 编码器三次2倍池化过程中,宽度维度变化为:20 → 10 → 5 → 3(2*2池化+same padding会对非整除的维度向上取整,5/2向上取整为3)
- 解码器三次2倍上采样过程中,宽度维度变化为:3 → 6 →12 →24,最终比原输入宽度多了4个像素,触发报错。
修复方案
可根据业务需求选择以下任意一种方案:
方案1:新增裁剪层对齐维度
在最后一次上采样之后、输出层之前增加裁剪层,切掉多余的4个宽度像素,是改动最小的方案:
# 首先导入裁剪层 from keras.layers import Cropping2D # 原有解码器最后部分代码 conv2_3 = Conv2D(16, (3, 3), activation='relu', padding='same')(up2) up3 = UpSampling2D((2, 2))(conv2_3) # 新增裁剪层,仅裁剪宽度方向最后4个像素,高度方向不裁剪 crop = Cropping2D(cropping=((0, 0), (0, 4)))(up3) r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(crop)
方案2:调整输入维度为2的整数次幂
将输入的宽度维度从20调整为32(或其他2的整数次幂数值),三次池化上采样后可以完美对齐:
- 编码器宽度变化:32→16→8→4
- 解码器宽度变化:4→8→16→32,和输入完全匹配
方案3:减少一组池化+上采样层
删除第三次池化和对应的第三次上采样,两次2倍变换即可对齐20的宽度:
- 编码器宽度变化:20→10→5
- 解码器宽度变化:5→10→20,和输入完全匹配
内容的提问来源于stack exchange,提问作者AMA
相关产品推荐
相关产品推荐

