深度生成模型(六)——GAN 简单项目实战 StyleGAN on CelebA

发布于:2025-03-09 ⋅ 阅读:(11) ⋅ 点赞:(0)

采用与之前 VAE 相同的脚本架构,VAE 项目开源地址:VAE-on-CelebA
使用 PyTorch 实现了一个简化版的 StyleGAN 模型,对 CelebA 数据集进行训练,并生成新的人脸图像
StyleGAN 项目开源地址:stylegan-celeba

1 README

本项目使用 PyTorch 对 CelebA 数据集进行训练,构建一个简化版的 StyleGAN 模型,并生成新的头像图像

1.1 特性

  • 使用简化版 StyleGAN 架构,包括映射网络 (Mapping Network) 与合成网络 (Synthesis Network)
  • 对 CelebA 数据进行预处理、裁剪与归一化
  • 训练完成后可从标准正态分布采样,生成多样化的新头像

1.2 环境安装

  1. 克隆本仓库:

    git clone https://github.com/YemuRiven/stylegan-celeba.git
    cd stylegan-celeba
    
  2. 安装依赖 (Conda 或 pip 方式均可):

    conda env create -f environment.yml
    conda activate stylegan-celeba
    

1.3 数据准备

  1. CelebA 官方地址 下载数据集,放置到 data/ 文件夹下,结构类似:
data/CelebA
   ├── Anno        (标注信息)
   ├── Eval        (验证/测试信息)
   └── Img
      └── img_align_celeba
         ├── 000001.jpg
         ├── 000002.jpg
         ├── ...
  1. 在运行脚本时,将 --data_path 参数设置为图像所在目录

1.4 运行项目

训练 StyleGAN 模型:

python main.py --data_path ./data/CelebA/img_align_celeba --epochs 30 --batch_size 32

生成新头像:

python generate.py

2 更多分析演示

2.1 目录结构

项目目录结构以及脚本作用分别如下:

stylegan-celeba
├── README.md
├── environment.yml         # Conda 环境文件
├── main.py                 # 核心训练脚本,包含训练循环、损失函数定义、以及推理生成示例
├── generate.py         # 使用解码器生成新的头像
├── models
	│── stylegan.py             # 定义了一个简单的 VAE 模型,包括编码器、解码器和重参数化等关键逻辑
├── utils
	│── dataset.py         # 主要负责数据集的加载与预处理操作,如裁剪、缩放、归一化等
├── outputs                # 训练输出目录(保存模型、生成图像等)

在这里插入图片描述

2.2 模型训练

训练过程:控制台会输出每个 epoch 的LossD 和 LossG
在这里插入图片描述

2.2.1 训练日志分析

在 第 30 个 Epoch 的后几个批次中,判别器 (D) 和生成器 (G) 的损失分别在如下区间:
LossD 约为 1.2~1.4
LossG 约为 4.2~4.5
这是在使用典型的对抗式训练 (GAN) 中常见的数值范围之一,简单分析如下:

  1. 判别器损失 (LossD ≈ 1.2~1.4)
    判别器损失在 1~1.5 之间 通常表示判别器在区分真实与生成样本时有一定难度,但并不完全失效,也不完全胜利
    如果判别器损失非常低(接近 0),则说明判别器几乎可以轻松区分真假图像,生成器难以更新
    如果判别器损失非常高(大于 2~3),则可能说明判别器在训练中“崩溃”或学习不足,无法有效区分真假样本
    当前的数值意味着判别器尚能识别差异,但生成器的样本也并非毫无质量可言,两者之间有一定博弈
  2. 生成器损失 (LossG ≈ 4.2~4.5)
    生成器损失的数值通常与所用损失函数 (BCE / MSE / Hinge 等) 以及标签平滑方式有关
    需要结合视觉结果判断:若最终生成图像有一定质量,且判别器也无法轻易分辨真假,则这对损失数值可以视为模型达到了某种对抗平衡;但视觉质量仍不理想,因此仍需要在网络结构或超参数上进一步优化

2.2.2 结果查看与可视化

  1. 查看生成图像
    代码设计了 sample_images() 函数,每个 Epoch 都会采样潜在变量并生成图像,保存为 outputs/epoch_{epoch}_samples.png
  2. 模型保存
    最终的模型权重会保存为 outputs/D_stylegan.pth 和 outputs/G_stylegan.pth,可用于后续的推理或微调
  3. 更多可视化
    除了在每个 Epoch 保存的示例图像,也写了一个单独的推理脚本 generate.py,生成更多图像,观察其多样性和质量
    在这里插入图片描述

2.3 新头像生成

运行 generate.py 文件:
在这里插入图片描述
生成新的头像:
在这里插入图片描述

3 模型分析

3.1 StyleGAN 生成器

在 StyleGAN 中,生成器可拆分为两部分:

  1. 映射网络 (Mapping Network):将随机噪声 z 映射到中间潜在向量 w
  2. 合成网络 (Synthesis Network):从 w 出发,通过逐层上采样与特征调制(AdaIN 等)来生成最终图像

简化版的 StyleGAN 生成器主要流程如下所示:

层 (类型) 输入形状 输出形状 参数说明 作用
随机噪声 ( z ) B×nz B×nz 维度 ( nz ) (如 100),服从 (\mathcal{N}(0,I)) 初始噪声向量,提供随机性
Mapping Network B×nz B×w_dim 8 层 MLP,每层宽度 ( w_dim ) (如 512) 将 ( z ) 转换为中间潜在向量 ( w ),去除噪声分布不必要因素
常量输入 (const_input) - B×C×4×4 Learnable 参数 (C 通道,如 512),形状 (1, C, 4, 4) 作为初始特征图,在合成网络中不断上采样
Synthesis Network (B×w_dim) + (B×C×4×4) B×3×64×64 (示例分辨率) 多层转置卷积 / 上采样 + AdaIN 调制 逐层扩展特征图空间分辨率,并使用 AdaIN 融合 ( w ) 信息
输出 (Tanh / …) B×3×64×64 B×3×64×64 - 将像素值限制在 ([-1,1]) 或其他范围,输出最终图像

3.1.1 参数说明

  • B:批大小(batch size)
  • nz:随机噪声向量维度(例如 100)
  • w_dim:映射网络输出向量的维度(如 512),常比 nz 更大,以实现更灵活的风格调制
  • 常量输入 (const_input):StyleGAN 在合成网络的初始层使用一个可学习的 4×4 特征图,而非直接将 z reshape 成特征图
  • AdaIN / 调制卷积:在合成网络的每一层,使用映射网络输出的 w 来调制特征图,控制纹理、颜色等风格信息。
  • 输出通道数 (3):表示生成 RGB 图像;若是灰度图可设为 1
  • 分辨率 (64×64):实际可到 1024×1024

3.1.2 设计逻辑

  1. Mapping Network
  • 多层 MLP:通过 8 层全连接网络(每层维度与 w_dim 相同)将 z 映射为风格向量 w
  • 去除噪声分布相关性:与传统 GAN 不同,StyleGAN 将随机噪声的“风格”影响从原始高斯分布中分离出来,以更灵活地控制生成图像的风格特征
  1. 合成网络 (Synthesis Network)
  • 常量输入 (4×4):用一个可学习的张量作为初始特征图,通过反卷积或上采样逐步增大分辨率
  • AdaIN (Adaptive Instance Normalization):在每一层使用 w 来调制特征图,控制诸如纹理、颜色、细节等风格信息
  • 逐层上采样:每经过一个合成块 (SynthesisBlock),空间分辨率翻倍(4→8→16→32→64…),通道数逐渐减少,以保持平衡的特征表示
  1. 激活函数
  • 常用 LeakyReLU 或 ReLU;StyleGAN 原文多使用 LeakyReLU
  • 映射网络也可用 ReLU/LeakyReLU/ELU 等激活,以便在高维空间捕捉复杂的映射关系
  1. 输出层
  • 最后一层将通道数映射到 3(RGB),并可用 Tanh 将像素值限制在 [−1,1];也有实现用无激活或 clip
  • 若想与图像预处理对应,可选择不同的归一化策略

3.1.3小结

在 StyleGAN 中,生成器的设计理念是先通过 Mapping Network 将噪声 z 转化为更解耦、可控的风格向量 w,再在 Synthesis Network 中通过 常量输入 + 上采样 + AdaIN 来逐层生成高分辨率图像。相比传统基于噪声直接上采样的 GAN,这种设计能够带来更灵活的风格控制,并在脸部生成等任务上取得优秀效果
若要进一步提升生成质量,可以:

  • 加深网络结构(更多上采样阶段、更大特征图基数)
  • 使用更复杂的调制(StyleGAN2 中的调制卷积、噪声注入等)
  • 调整分辨率(从 64×64 升级到 256×256、1024×1024);
  • 增加正则化或其他训练技巧(如权重归一化、路径长度正则等)

3.2 StyleGAN 判别器

StyleGAN并非只有生成器,它依然遵循GAN的基本框架,包含生成器(Generator)判别器(Discriminator) 两部分。生成器的创新是StyleGAN的核心亮点,但判别器的设计同样对训练效果至关重要
在 StyleGAN 中,判别器主要用于对输入图像进行真伪判别,即判断图像是真实图像还是生成器生成的假图像。判别器通常采用一系列卷积层来逐渐缩小图像空间分辨率,同时增加特征通道数,最终输出一个标量表示图像的真实性概率。简化版判别器的主要结构如下所示(输入图像尺寸 64×64):

层 (类型) 输入形状 输出形状 参数说明 作用
Conv2d(image_channels, ndf, k=4, s=2, p=1) B×3×64×64 B×ndf×32×32 卷积核=4×4, 步幅=2, 填充=1 提取初始特征,降维
LeakyReLU(0.2) B×ndf×32×32 B×ndf×32×32 - 非线性激活,防止梯度消失
Conv2d(ndf, ndf×2, k=4, s=2, p=1) B×ndf×32×32 B×(ndf×2)×16×16 卷积核=4×4, 步幅=2, 填充=1 扩展特征维度,进一步降采样
BatchNorm2d(ndf×2) B×(ndf×2)×16×16 B×(ndf×2)×16×16 - 稳定训练,归一化
LeakyReLU(0.2) B×(ndf×2)×16×16 B×(ndf×2)×16×16 - 非线性激活
Conv2d(ndf×2, ndf×4, k=4, s=2, p=1) B×(ndf×2)×16×16 B×(ndf×4)×8×8 卷积核=4×4, 步幅=2, 填充=1 进一步提取高阶特征,降采样
BatchNorm2d(ndf×4) B×(ndf×4)×8×8 B×(ndf×4)×8×8 - 归一化
LeakyReLU(0.2) B×(ndf×4)×8×8 B×(ndf×4)×8×8 - 非线性激活
Conv2d(ndf×4, ndf×8, k=4, s=2, p=1) B×(ndf×4)×8×8 B×(ndf×8)×4×4 卷积核=4×4, 步幅=2, 填充=1 提升特征表达力,继续降采样
BatchNorm2d(ndf×8) B×(ndf×8)×4×4 B×(ndf×8)×4×4 - 归一化
LeakyReLU(0.2) B×(ndf×8)×4×4 B×(ndf×8)×4×4 - 非线性激活
Conv2d(ndf×8, 1, k=4, s=1, p=0) B×(ndf×8)×4×4 B×1×1×1 卷积核=4×4, 步幅=1, 无填充 将特征映射到单个得分,输出判别结果
Sigmoid B×1×1×1 B×1×1×1 - 将输出映射到 [0,1] 区间,作为真实性概率

3.2.1 参数说明

  • B:批大小,表示一次输入的图像数量。
  • 图像输入尺寸:输入尺寸为 64×64,在更高分辨率任务中尺寸会更大
  • ndf:判别器的基础特征图数,决定了卷积层中输出通道数的起始值,通常设置为 64;后续层依次为 64, 128, 256, 512 等
  • 卷积参数 (k, s, p):每层卷积核均设置为 4×4,步幅为 2,填充为 1,这样可以将空间尺寸逐层缩小一半(例如 64 → 32 → 16 → 8 → 4)
  • BatchNorm:用于归一化中间特征,有助于提高训练稳定性
  • LeakyReLU(0.2):激活函数,避免梯度消失问题
  • Sigmoid:将最终输出映射到 [0,1] 范围,作为图像真实度的概率输出

3.2.2 设计逻辑

  1. 多层卷积降采样
  • 判别器通过多层卷积将输入图像空间分辨率逐步缩小,同时增加特征通道数,最终得到较小空间尺寸但丰富特征表示的特征图
  • 每经过一层卷积,图像尺寸减半,最终由 64×64 缩小到 4×4
  1. 批归一化 (BatchNorm)
  • 在卷积层后使用 BatchNorm,有助于稳定训练过程,防止梯度消失或爆炸,并加速收敛
  1. 激活函数
  • 使用 LeakyReLU(0.2) 作为激活函数,能够提供非线性特征表达,并允许少量负值通过,从而缓解梯度消失问题
  1. 输出层设计
  • 最后一层卷积将多通道特征图转换为单通道输出,通过 Sigmoid 映射到 [0,1],代表图像的真实性概率
  • 在实现上,通常需要确保最终输出的形状为 (B,1,1,1),以便与真实标签 (B,) 匹配。可以通过全局平均池化或适当调整卷积层参数实现这一目标

3.2.3 小结

在 StyleGAN 的判别器设计中,通过多层卷积网络逐层降低空间尺寸并增加特征通道数,再经过 BatchNorm 和 LeakyReLU 激活,有效捕捉图像的判别特征。最终,通过一层卷积和 Sigmoid 输出单个真实性概率,帮助训练过程中生成器与判别器达到对抗平衡。相比于简单的 DCGAN 判别器,StyleGAN 的判别器结构同样注重特征提取和训练稳定性,但在更高分辨率和复杂度图像生成任务中,可能会加入更多改进模块(如自注意力层)以进一步提高判别效果


网站公告

今日签到

点亮在社区的每一天
去签到