共计 1356 个字符,预计需要花费 4 分钟才能阅读完成。
为什么需要数据增强?
刚开始玩 CNN 时,最头疼的就是手头数据太少。记得第一次做医疗影像分类,只有 200 张 X 光片,模型在训练集上能到 95%,但测试集连 70% 都不到——典型的过拟合。数据增强就像给模型开了个 ” 想象力培训班 ”,通过对原始图片做各种变换(旋转、裁剪、调色等),让模型学会抓住本质特征,而不是死记硬背训练样本。

两种增强方式怎么选?
| 类型 | 内存占用 | 计算开销 | 适用场景 |
|---|---|---|---|
| 离线增强 | 高 | 低 | 小数据集 / 增强方式固定 |
| 实时增强 | 低 | 高 | 大数据集 / 需要动态增强 |
个人建议 :新手先用离线增强快速验证想法,等熟悉流程后再切到实时增强。
PyTorch 增强实战
基础增强三板斧
import torchvision.transforms as transforms
# 几何变形组合拳
transform = transforms.Compose([transforms.RandomRotation(30), # 随机旋转±30 度
transforms.RandomResizedCrop(224, scale=(0.8, 1.0)), # 随机缩放裁剪
# 色彩戏法
transforms.ColorJitter(
brightness=0.2, # 亮度抖动 20%
contrast=0.2, # 对比度抖动 20%
saturation=0.2, # 饱和度抖动 20%
hue=0.1 # 色相偏移 10%
),
transforms.ToTensor()])
进阶技巧:MixUp 增强
def mixup_data(x, y, alpha=0.4):
"""
alpha: 控制混合强度的参数
越小 -> 越接近原始图像
越大 -> 混合效果越明显
"""
lam = np.random.beta(alpha, alpha)
batch_size = x.size(0)
index = torch.randperm(batch_size)
mixed_x = lam * x + (1 - lam) * x[index]
y_a, y_b = y, y[index]
return mixed_x, y_a, y_b, lam
新手避坑指南
-
过增强警报 :如果训练 loss 波动剧烈(比如连续 5 个 epoch 的 loss 曲线像心电图),说明增强太猛了,建议把变换幅度参数调小 50% 试试
-
batch_size 与增强的相爱相杀 :
- 大 batch(>64)适合用强增强(如大角度旋转)
-
小 batch(<16)建议用温和增强(小范围色彩抖动)
-
验证集要不要增强 :绝对不要!验证集的作用是模拟真实场景,保持原始数据才能反映真实性能
性能优化小贴士
Compose的顺序很重要:先几何变换再色彩变换,最后转 Tensor,这个顺序能减少计算量 20% 以上- 多 GPU 训练时,建议把增强操作放在 CPU 上完成,否则 GPU 可能因为等待数据增强而闲置
动手实验建议
- 尝试在 CIFAR-10 上对比:只做水平翻转 vs 完整增强组合,准确率能差多少?
- 调整 MixUp 的 alpha 参数(0.1 到 0.9),观察模型鲁棒性的变化
- 用相同的增强策略训练 ResNet18 和 ViT,哪个架构受益更明显?
个人踩坑总结
刚开始总想着增强越多越好,有次同时用了旋转 + 裁剪 + 颜色抖动 + 高斯噪声,结果模型完全学不动。后来明白数据增强就像做菜调料——适量提鲜,过量毁菜。建议从简单增强开始,每加一个新变换都要观察 loss 曲线变化。具体代码可以参考我的 GitHub 仓库(附完整 CIFAR-10 示例)。
正文完
发表至: 未分类
近一天内
