共计 1743 个字符,预计需要花费 5 分钟才能阅读完成。
为什么 CIFAR-10 需要数据增强
CIFAR-10 数据集包含 6 万张 32×32 像素的彩色图像,分为 10 个类别。这个尺寸在当今的计算机视觉任务中属于 非常小的输入尺寸,导致两个主要问题:

- 图像信息密度低,细节特征容易被常规卷积操作丢失
- 原始训练集仅 5 万张(每类 5000 张),模型容易记住训练样本(过拟合)
通过数据增强,我们可以:
- 人工扩展数据集多样性
- 强制模型学习更鲁棒的特征
- 模拟现实世界中可能出现的图像变化
基础几何变换增强
1. 随机水平翻转
最常用且计算代价最低的增强方式,特别适合 CIFAR-10 中对称性较强的类别(如飞机、汽车)。在 PyTorch 中实现:
transforms.RandomHorizontalFlip(p=0.5) # 50% 概率执行翻转
2. 随机旋转
对于小尺寸图像,建议限制旋转角度在±15 度以内,避免过多空白区域:
transforms.RandomRotation(degrees=15)
3. 随机裁剪
虽然 CIFAR-10 本身已是 32×32,但先放大再随机裁剪能增加位置变化:
transforms.Compose([transforms.Resize(40), # 先放大
transforms.RandomCrop(32), # 再随机裁剪回原尺寸
transforms.ToTensor()])
色彩空间操作增强
1. 色彩抖动
通过轻微调整亮度、对比度、饱和度和色相模拟光照变化:
transforms.ColorJitter(
brightness=0.2, # 亮度调整幅度
contrast=0.2, # 对比度
saturation=0.2, # 饱和度
hue=0.1 # 色相(注意范围应在[-0.5,0.5]))
2. 灰度化
以一定概率转为灰度图像,增强对颜色变化的鲁棒性:
transforms.RandomGrayscale(p=0.1)
高级混合策略
1. CutMix 增强
将两幅图像的部分区域进行混合,同时调整标签为混合比例:
# 需要自定义实现
class CutMix(object):
def __call__(self, img1, img2):
lam = np.random.beta(1.0, 1.0) # 混合比例
bbx1, bby1, bbx2, bby2 = rand_bbox(img1.size(), lam)
img1[:, bbx1:bbx2, bby1:bby2] = img2[:, bbx1:bbx2, bby1:bby2]
return img1, lam
2. MixUp 增强
线性混合两幅图像和标签:
def mixup_data(x, y, alpha=1.0):
lam = np.random.beta(alpha, alpha)
batch_size = x.size()[0]
index = torch.randperm(batch_size)
mixed_x = lam * x + (1 - lam) * x[index]
return mixed_x, y, y[index], lam
实际应用建议
组合策略示例
train_transform = transforms.Compose([transforms.Resize(40),
transforms.RandomCrop(32),
transforms.RandomHorizontalFlip(),
transforms.ColorJitter(0.1, 0.1, 0.1),
transforms.ToTensor(),
transforms.Normalize(mean, std)
])
显存优化技巧
当 GPU 显存不足时:
- 使用
torchvision.transforms.functional手动实现流水线,避免中间变量 - 减少同时使用的增强种类
- 降低批次大小并增加梯度累积步数
效果对比
| 增强策略 | ResNet-18 准确率 | ViT-Tiny 准确率 |
|---|---|---|
| 无增强 | 89.2% | 85.7% |
| 基础几何变换 | 91.5% (+2.3) | 87.1% (+1.4) |
| 完整增强组合 | 93.8% (+4.6) | 89.3% (+3.6) |
| CutMix+MixUp | 94.1% (+4.9) | 90.2% (+4.5) |
开放性问题
当使用 EfficientNet 等现代化架构时,由于模型本身已经包含了较强的正则化能力,哪些传统的数据增强策略可能会失效?特别对于 CIFAR-10 这样的低分辨率数据集,哪些增强实际上可能带来负面影响?
正文完
