You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何控制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:58:23