如何将Conv2DTranspose输出形状从(None,28,28,1)改为(None,32,32,1)
调整Decoder输出为(None,32,32,1)的解决方案
要让Decoder输出32x32的特征图,核心是调整初始全连接层的输出维度,让Reshape后的特征图尺寸经过两次stride=2的转置卷积后恰好得到32x32。
方法一:修改初始Dense和Reshape层(推荐)
原来的Reshape是7x7,经过两次stride=2的转置卷积后得到7×2×2=28x28。要得到32x32,初始Reshape的尺寸需要是8x8(因为8×2×2=32)。
修改后的代码如下:
# Decoder latent_dim = 2 latent_inputs = keras.Input(shape=(latent_dim,)) # 调整Dense层输出为8*8*64,对应Reshape后的8x8x64 x = layers.Dense(8 * 8 * 64, activation="relu")(latent_inputs) x = layers.Reshape((8, 8, 64))(x) x = layers.Conv2DTranspose(64, 3, activation="relu", strides=2, padding="same")(x) # 输出16x16x64 x = layers.Conv2DTranspose(32, 3, activation="relu", strides=2, padding="same")(x) # 输出32x32x32 decoder_outputs = layers.Conv2DTranspose(1, 3, activation="sigmoid", padding="same")(x) # 输出32x32x1 decoder = keras.Model(latent_inputs, decoder_outputs, name="decoder") decoder.summary()
对应的模型摘要关键层输出会变成:
reshape (Reshape) (None, 8, 8, 64) 0 conv2d_transpose (Conv2DTranspose) (None, 16, 16, 64) 36928 conv2d_transpose_1 (Conv2DTranspose) (None, 32, 32, 32) 18464 conv2d_transpose_2 (Conv2DTranspose) (None, 32, 32, 1) 289
方法二:保留原有结构,新增上采样层
如果不想改动前面的层,可以在最后新增一层上采样+卷积的组合,把28x28的特征图放大到32x32:
# Decoder latent_dim = 2 latent_inputs = keras.Input(shape=(latent_dim,)) x = layers.Dense(7 * 7 * 64, activation="relu")(latent_inputs) x = layers.Reshape((7, 7, 64))(x) x = layers.Conv2DTranspose(64, 3, activation="relu", strides=2, padding="same")(x) x = layers.Conv2DTranspose(32, 3, activation="relu", strides=2, padding="same")(x) # 新增上采样+裁剪,将28x28调整为32x32 x = layers.UpSampling2D(size=(2, 2))(x) # 先放大到56x56 x = layers.Cropping2D(cropping=((12, 12), (12, 12)))(x) # 裁剪到32x32 decoder_outputs = layers.Conv2D(1, 3, activation="sigmoid", padding="same")(x) decoder = keras.Model(latent_inputs, decoder_outputs, name="decoder") decoder.summary()
这种方法的缺点是特征图不是整数倍放大,插值和裁剪操作可能会损失部分特征信息,不如第一种方法规整。
内容的提问来源于stack exchange,提问作者tail
相关产品推荐
相关产品推荐

