如何控制GAN模型生成器的输出形状?适配512×512图像需求
问题分析
你的生成器输出宽度为4096而非目标512的根源在于:输入宽128经过5次stride=2的转置卷积后,被连续放大了32倍(2⁵),128×32=4096;而输入高16经过同样5次放大后刚好是512(16×32=512)。要让宽度最终匹配目标尺寸,需要调整网络中宽度方向的缩放倍数,让总缩放从32倍降到4倍(512/128=4)。
解决方案
核心思路是给转置卷积设置非对称的stride,分别控制高度和宽度的放大次数:高度需要5次×2的放大(从16到512),宽度仅需2次×2的放大(从128到512),剩余3次保持宽度不变。
修改后的生成器代码如下:
nn.Sequential( # 第1层:高16→32,宽128→256(双向×2) nn.ConvTranspose2d(8, 16, kernel_size=4, stride=(2, 2), padding=1, bias=False), nn.BatchNorm2d(16), nn.ReLU(True), # 第2层:高32→64,宽256→512(双向×2) nn.ConvTranspose2d(16, 32, kernel_size=4, stride=(2, 2), padding=1, bias=False), nn.BatchNorm2d(32), nn.ReLU(True), # 第3层:高64→128,宽512保持(仅高度×2) nn.ConvTranspose2d(32, 64, kernel_size=4, stride=(2, 1), padding=(1, 2), bias=False), nn.BatchNorm2d(64), nn.ReLU(True), # 第4层:高128→256,宽512保持(仅高度×2) nn.ConvTranspose2d(64, 128, kernel_size=4, stride=(2, 1), padding=(1, 2), bias=False), nn.BatchNorm2d(128), nn.ReLU(True), # 第5层:高256→512,宽512保持(仅高度×2) nn.ConvTranspose2d(128, 3, kernel_size=4, stride=(2, 1), padding=(1, 2), bias=False), nn.Tanh() )
尺寸验证
- 输入:
(8, 16, 128) - 第1层输出:
(16, 32, 256)(高=(16-1)2+4-21=32;宽=(128-1)2+4-21=256) - 第2层输出:
(32, 64, 512)(高=(32-1)2+4-21=64;宽=(256-1)2+4-21=512) - 第3层输出:
(64, 128, 512)(高=(64-1)2+4-21=128;宽=(512-1)1+4-22=512) - 第4层输出:
(128, 256, 512)(高=(128-1)2+4-21=256;宽保持512) - 第5层输出:
(3, 512, 512)(高=(256-1)2+4-21=512;宽保持512)
补充说明
如果不想用非对称padding,也可以将后三层的kernel_size改为(4,3),padding=(1,1),这样宽度计算为(512-1)*1+3-2*1=512,同样能保持宽度不变,代码调整如下:
nn.ConvTranspose2d(32, 64, kernel_size=(4,3), stride=(2,1), padding=(1,1), bias=False),
内容的提问来源于stack exchange,提问作者Mohamed Amine
相关产品推荐
相关产品推荐

