共计 1933 个字符,预计需要花费 5 分钟才能阅读完成。
传统 GAN 的局限性
传统 GAN 虽然在图像生成上表现出色,但在条件生成任务中存在明显短板。最突出的问题是缺乏对生成内容的精确控制。比如想生成特定数字的手写体,传统 GAN 只能随机输出,无法按需生成 ”7″ 或 ”9″。另一个痛点是模式崩溃(Mode Collapse),生成器会反复输出相似的样本,缺乏多样性。

CGAN 的核心改进
CGAN 通过引入条件变量 y 解决了这些问题。这个 y 可以是类别标签、文本描述甚至其他图像。关键改进在于:
- 生成器和判别器都接收条件信息 y 作为额外输入
- 判别器需要同时判断 ” 图片是否真实 ” 和 ” 是否匹配条件 ”
- 通过条件约束避免了模式崩溃
CGAN vs 其他 GAN 变体
- DCGAN:适合无约束生成,但无法条件控制
- WGAN:改进训练稳定性,但同样缺乏条件输入
- InfoGAN:能发现隐变量,但不如 CGAN 直观可控
条件信息嵌入方式
常见的有两种实现方式:
- 拼接 (Concat):将条件向量与噪声向量直接拼接
- 嵌入 (Embedding):先通过嵌入层转换条件变量
实践中,图像生成任务多采用拼接方式,而文本条件更适合嵌入。
PyTorch 实现详解
下面是一个完整的 CGAN 实现,以 MNIST 手写数字生成为例:
import torch
import torch.nn as nn
# 生成器定义
class Generator(nn.Module):
def __init__(self, latent_dim, num_classes):
super().__init__()
self.label_emb = nn.Embedding(num_classes, num_classes)
self.model = nn.Sequential(nn.Linear(latent_dim + num_classes, 256),
nn.LeakyReLU(0.2),
nn.Linear(256, 512),
nn.LeakyReLU(0.2),
nn.Linear(512, 1024),
nn.LeakyReLU(0.2),
nn.Linear(1024, 784),
nn.Tanh())
def forward(self, z, labels):
# 将噪声 z 和标签嵌入拼接
c = self.label_emb(labels)
x = torch.cat([z, c], dim=1)
return self.model(x)
# 判别器定义
class Discriminator(nn.Module):
def __init__(self, num_classes):
super().__init__()
self.label_emb = nn.Embedding(num_classes, num_classes)
self.model = nn.Sequential(nn.Linear(784 + num_classes, 1024),
nn.LeakyReLU(0.2),
nn.Dropout(0.3),
nn.Linear(1024, 512),
nn.LeakyReLU(0.2),
nn.Dropout(0.3),
nn.Linear(512, 256),
nn.LeakyReLU(0.2),
nn.Dropout(0.3),
nn.Linear(256, 1),
nn.Sigmoid())
def forward(self, x, labels):
x = x.view(x.size(0), -1)
c = self.label_emb(labels)
x = torch.cat([x, c], dim=1)
return self.model(x)
训练技巧与评估
关键超参数设置
- 学习率 :通常设为 0.0002
- Batch Size:不宜过大,64-128 较合适
- 优化器 :Adam 优化器效果最好
评估指标
- FID (Frechet Inception Distance):衡量生成图像与真实图像的分布距离
- IS (Inception Score):评估生成图像的多样性和可识别性
常见问题解决
- 判别器过强 :使用标签平滑 (Label Smoothing)
- 梯度消失 :尝试 WGAN-GP 的梯度惩罚
- 模式崩溃 :增加 mini-batch 判别
进阶应用方向
CGAN 可以扩展到许多有趣的应用:
- 文本到图像生成 :将文本描述作为条件
- 图像翻译 :如将白天照片转为夜景
- 数据增强 :生成特定类别的训练数据
实践建议
对于想快速上手的开发者,推荐使用 Google Colab 环境进行实验。我已经准备了一个包含完整代码的 Notebook,包含以下内容:
- 预处理 MNIST 数据集
- 可视化训练过程
- FID 指标计算实现
通过这篇文章,你应该已经掌握了 CGAN 的核心原理和实现方法。关键是要多实践,从简单数据集开始,逐步调整模型结构和超参数。图像生成是个需要耐心的领域,祝你能训练出令人惊艳的模型!
正文完
发表至: 未分类
近一天内
