如何将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
相关产品推荐
相关产品推荐

