共计 1527 个字符,预计需要花费 4 分钟才能阅读完成。
背景与痛点
在深度学习模型训练中,数据不足或数据不平衡会导致模型泛化能力差、过拟合等问题。传统的数据增强方法(如旋转、翻转、裁剪等)虽然简单易用,但存在以下局限性:

- 只能生成与原始数据高度相似的样本,多样性有限
- 对于复杂的非线性变换(如风格迁移)无能为力
- 无法针对特定类别进行定向增强,难以解决类别不平衡问题
技术选型:为什么是 CGAN?
CGAN(Conditional GAN)在普通 GAN 的基础上引入了条件控制机制,通过将类别标签作为额外输入,可以定向生成特定类别的数据。相比普通 GAN,CGAN 的优势在于:
- 生成数据的类别可控,适合解决类别不平衡问题
- 生成质量更高,因为判别器可以学习类别相关的特征
- 训练过程更稳定,条件信息提供了额外的监督信号
核心实现
1. PyTorch 搭建 CGAN
以下是 Generator 和 Discriminator 的典型架构:
import torch
import torch.nn as nn
class Generator(nn.Module):
def __init__(self, latent_dim, num_classes, img_shape):
super().__init__()
self.label_emb = nn.Embedding(num_classes, num_classes)
self.model = nn.Sequential(nn.Linear(latent_dim + num_classes, 128),
nn.LeakyReLU(0.2),
nn.Linear(128, 256),
nn.BatchNorm1d(256),
nn.LeakyReLU(0.2),
nn.Linear(256, 512),
nn.BatchNorm1d(512),
nn.LeakyReLU(0.2),
nn.Linear(512, int(torch.prod(torch.tensor(img_shape)))),
nn.Tanh())
self.img_shape = img_shape
def forward(self, z, labels):
# 拼接噪声和条件标签
c = self.label_emb(labels)
x = torch.cat([z, c], 1)
img = self.model(x)
return img.view(img.size(0), *self.img_shape)
2. 关键超参数设置
- 学习率:Generator 和 Discriminator 建议使用不同的学习率(如 0.0002 和 0.0001)
- Batch Size:一般设置在 32-128 之间,太大可能导致模式崩溃
- 噪声维度:通常选择 50-100 维的高斯噪声
性能优化
训练稳定性技巧
- 使用标签平滑(Label Smoothing):将真实标签从 1.0 改为 0.9
- 梯度裁剪(Gradient Clipping):限制判别器的梯度范数
- 交替训练:先训练判别器 k 步,再训练生成器 1 步
评估指标
- FID(Frechet Inception Distance):衡量生成图像与真实图像的特征距离
- IS(Inception Score):同时考虑生成图像的质量和多样性
避坑指南
模式崩溃的识别与解决
- 识别:生成样本多样性急剧下降
- 解决方案:
- 增加噪声维度
- 使用 Mini-batch Discrimination
- 尝试不同的损失函数(如 Wasserstein Loss)
计算资源不足
- 降低图像分辨率
- 使用梯度累积(Gradient Accumulation)
- 尝试轻量级网络架构
生成数据比例
建议生成数据不超过原始数据的 5 -10 倍,并持续监控验证集性能
延伸思考
- 如何量化评估生成数据对最终模型性能的提升?
- 在医疗影像等敏感领域,如何确保生成数据不会引入偏差?
- 能否结合半监督学习,让生成数据提供额外的正则化效果?
正文完
发表至: 未分类
近两天内
