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

如何将GAN的输入图像尺寸从32×32扩展至128×128?

适配128×128图像的GAN网络重构方案

原GAN针对32×32图像设计,扩展到128×128的核心是调整生成器的上采样层数和判别器的下采样层数,同时匹配特征通道数的变化,保证空间尺寸与特征维度的连续性。以下是完整重构代码及关键说明:

1. 生成器(Generator)重构

原生成器通过4次转置卷积从1×1噪声生成32×32图像,要得到128×128需增加1次上采样操作,同时调整通道数递减节奏(保持每次转置卷积后特征图尺寸翻倍、通道数减半):

class Generator(Module):
    def __init__(self):
        super().__init__()
        self.gen = Sequential(
            # 输入: (batch_size, 100, 1, 1)
            ConvTranspose2d(in_channels=100, out_channels=1024, kernel_size=4, stride=1, padding=0, bias=False),
            # 输出: (batch_size, 1024, 4, 4)
            BatchNorm2d(1024),
            ReLU(inplace=True),

            ConvTranspose2d(in_channels=1024, out_channels=512, kernel_size=4, stride=2, padding=1, bias=False),
            # 输出: (batch_size, 512, 8, 8)
            BatchNorm2d(512),
            ReLU(inplace=True),

            ConvTranspose2d(in_channels=512, out_channels=256, kernel_size=4, stride=2, padding=1, bias=False),
            # 输出: (batch_size, 256, 16, 16)
            BatchNorm2d(256),
            ReLU(inplace=True),

            ConvTranspose2d(in_channels=256, out_channels=128, kernel_size=4, stride=2, padding=1, bias=False),
            # 输出: (batch_size, 128, 32, 32)
            BatchNorm2d(128),
            ReLU(inplace=True),

            ConvTranspose2d(in_channels=128, out_channels=3, kernel_size=4, stride=2, padding=1, bias=False),
            # 输出: (batch_size, 3, 128, 128)
            Tanh()
        )

    def forward(self, input):
        return self.gen(input)

关键调整:

  • 新增1层转置卷积,将32×32特征图上采样至128×128
  • 初始通道数从512提升至1024,保证深层特征表达能力,后续每层通道数减半
  • 统一使用kernel_size=4, stride=2, padding=1的上采样参数,确保特征图尺寸精确翻倍

2. 判别器(Discriminator)重构

判别器需与生成器对称,增加1次下采样操作,从128×128逐步压缩至1×1,通道数逐层翻倍:

class Discriminator(Module):
    def __init__(self):
        super().__init__()
        self.dis = Sequential(
            # 输入: (batch_size, 3, 128, 128)
            Conv2d(in_channels=3, out_channels=64, kernel_size=4, stride=2, padding=1, bias=False),
            # 输出: (batch_size, 64, 64, 64)
            LeakyReLU(0.2, inplace=True),

            Conv2d(in_channels=64, out_channels=128, kernel_size=4, stride=2, padding=1, bias=False),
            # 输出: (batch_size, 128, 32, 32)
            BatchNorm2d(128),
            LeakyReLU(0.2, inplace=True),

            Conv2d(in_channels=128, out_channels=256, kernel_size=4, stride=2, padding=1, bias=False),
            # 输出: (batch_size, 256, 16, 16)
            BatchNorm2d(256),
            LeakyReLU(0.2, inplace=True),

            Conv2d(in_channels=256, out_channels=512, kernel_size=4, stride=2, padding=1, bias=False),
            # 输出: (batch_size, 512, 8, 8)
            BatchNorm2d(512),
            LeakyReLU(0.2, inplace=True),

            Conv2d(in_channels=512, out_channels=1024, kernel_size=4, stride=2, padding=1, bias=False),
            # 输出: (batch_size, 1024, 4, 4)
            BatchNorm2d(1024),
            LeakyReLU(0.2, inplace=True),

            Conv2d(in_channels=1024, out_channels=1, kernel_size=4, stride=1, padding=0, bias=False),
            # 输出: (batch_size, 1, 1, 1)
            Sigmoid()
        )

    def forward(self, input):
        return self.dis(input)

关键调整:

  • 新增1层卷积下采样,将128×128图像压缩至64×64,后续每层尺寸减半
  • 初始通道数从32提升至64,逐层翻倍,最后通过4×4卷积将4×4特征图压缩为1×1
  • 最后一层使用kernel_size=4, stride=1, padding=0,刚好匹配4×4特征图的尺寸转换

3. 数据与训练适配

  • 确保输入npz文件包含形状为(N, 128, 128, 3)的图像数据,数据转置逻辑保持不变
  • 训练流程完全沿用原代码,仅需注意显存占用:128×128图像显存消耗更高,建议将batch_size调整为16或8
  • 权重初始化函数、优化器参数可保持不变,若训练不稳定可将学习率降至0.0001

内容的提问来源于stack exchange,提问作者Jett t

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:01:40