采用与之前 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 环境安装
克隆本仓库:
git clone https://github.com/YemuRiven/stylegan-celeba.git cd stylegan-celeba
安装依赖 (Conda 或 pip 方式均可):
conda env create -f environment.yml conda activate stylegan-celeba
1.3 数据准备
- 从 CelebA 官方地址 下载数据集,放置到
data/
文件夹下,结构类似:
data/CelebA
├── Anno (标注信息)
├── Eval (验证/测试信息)
└── Img
└── img_align_celeba
├── 000001.jpg
├── 000002.jpg
├── ...
- 在运行脚本时,将
--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) 中常见的数值范围之一,简单分析如下:
- 判别器损失 (LossD ≈ 1.2~1.4)
判别器损失在 1~1.5 之间 通常表示判别器在区分真实与生成样本时有一定难度,但并不完全失效,也不完全胜利
如果判别器损失非常低(接近 0),则说明判别器几乎可以轻松区分真假图像,生成器难以更新
如果判别器损失非常高(大于 2~3),则可能说明判别器在训练中“崩溃”或学习不足,无法有效区分真假样本
当前的数值意味着判别器尚能识别差异,但生成器的样本也并非毫无质量可言,两者之间有一定博弈 - 生成器损失 (LossG ≈ 4.2~4.5)
生成器损失的数值通常与所用损失函数 (BCE / MSE / Hinge 等) 以及标签平滑方式有关
需要结合视觉结果判断:若最终生成图像有一定质量,且判别器也无法轻易分辨真假,则这对损失数值可以视为模型达到了某种对抗平衡;但视觉质量仍不理想,因此仍需要在网络结构或超参数上进一步优化
2.2.2 结果查看与可视化
- 查看生成图像
代码设计了 sample_images() 函数,每个 Epoch 都会采样潜在变量并生成图像,保存为 outputs/epoch_{epoch}_samples.png - 模型保存
最终的模型权重会保存为 outputs/D_stylegan.pth 和 outputs/G_stylegan.pth,可用于后续的推理或微调 - 更多可视化
除了在每个 Epoch 保存的示例图像,也写了一个单独的推理脚本 generate.py,生成更多图像,观察其多样性和质量
2.3 新头像生成
运行 generate.py 文件:
生成新的头像:
3 模型分析
3.1 StyleGAN 生成器
在 StyleGAN 中,生成器可拆分为两部分:
- 映射网络 (Mapping Network):将随机噪声 z 映射到中间潜在向量 w
- 合成网络 (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 设计逻辑
- Mapping Network
- 多层 MLP:通过 8 层全连接网络(每层维度与 w_dim 相同)将 z 映射为风格向量 w
- 去除噪声分布相关性:与传统 GAN 不同,StyleGAN 将随机噪声的“风格”影响从原始高斯分布中分离出来,以更灵活地控制生成图像的风格特征
- 合成网络 (Synthesis Network)
- 常量输入 (4×4):用一个可学习的张量作为初始特征图,通过反卷积或上采样逐步增大分辨率
- AdaIN (Adaptive Instance Normalization):在每一层使用 w 来调制特征图,控制诸如纹理、颜色、细节等风格信息
- 逐层上采样:每经过一个合成块 (SynthesisBlock),空间分辨率翻倍(4→8→16→32→64…),通道数逐渐减少,以保持平衡的特征表示
- 激活函数
- 常用 LeakyReLU 或 ReLU;StyleGAN 原文多使用 LeakyReLU
- 映射网络也可用 ReLU/LeakyReLU/ELU 等激活,以便在高维空间捕捉复杂的映射关系
- 输出层
- 最后一层将通道数映射到 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 设计逻辑
- 多层卷积降采样
- 判别器通过多层卷积将输入图像空间分辨率逐步缩小,同时增加特征通道数,最终得到较小空间尺寸但丰富特征表示的特征图
- 每经过一层卷积,图像尺寸减半,最终由 64×64 缩小到 4×4
- 批归一化 (BatchNorm)
- 在卷积层后使用 BatchNorm,有助于稳定训练过程,防止梯度消失或爆炸,并加速收敛
- 激活函数
- 使用 LeakyReLU(0.2) 作为激活函数,能够提供非线性特征表达,并允许少量负值通过,从而缓解梯度消失问题
- 输出层设计
- 最后一层卷积将多通道特征图转换为单通道输出,通过 Sigmoid 映射到 [0,1],代表图像的真实性概率
- 在实现上,通常需要确保最终输出的形状为 (B,1,1,1),以便与真实标签 (B,) 匹配。可以通过全局平均池化或适当调整卷积层参数实现这一目标
3.2.3 小结
在 StyleGAN 的判别器设计中,通过多层卷积网络逐层降低空间尺寸并增加特征通道数,再经过 BatchNorm 和 LeakyReLU 激活,有效捕捉图像的判别特征。最终,通过一层卷积和 Sigmoid 输出单个真实性概率,帮助训练过程中生成器与判别器达到对抗平衡。相比于简单的 DCGAN 判别器,StyleGAN 的判别器结构同样注重特征提取和训练稳定性,但在更高分辨率和复杂度图像生成任务中,可能会加入更多改进模块(如自注意力层)以进一步提高判别效果