RandAugment:无搜索的自动数据增强策略
python import torch from torchvision import transforms from torchvision.datasets import CIFAR10 from torch.utils.data import DataLoader
定义 RandAugment 变换
class RandAugment: def init(self, N=2, M=9): """ N: 操作数量 M: 统一强度 """ self.N = N self.M = M # 操作列表(14种变换,这里仅为示意,实际实现需映射到 torchvision 操作) self.op_list = [ 'AutoContrast', 'Equalize', 'Rotate', 'Solarize', 'Color', 'Contrast', 'Brightness', 'Sharpness', 'ShearX', 'ShearY', 'TranslateX', 'TranslateY', 'Invert', 'Identity' ]
def __call__(self, img):
# 随机选择 N 个操作(无放回)
ops = random.sample(self.op_list, self.N)
# 对每个操作,以强度 M 执行
for op in ops:
img = self._apply_op(img, op, self.M)
return img
def _apply_op(self, img, op_name, magnitude):
# 根据 op_name 调用对应的 torchvision 函数
# 此处仅给出伪代码,实际需将 magnitude 映射到操作的合理范围
if op_name == 'Rotate':
# magnitude 映射为角度,例如 M * 3 度
angle = magnitude * 3
img = transforms.functional.rotate(img, angle)
elif op_name == 'Color':
# 色彩调整强度映射为 [0.1, 1.9] 等
factor = 0.1 + magnitude * 0.18
img = transforms.functional.adjust_saturation(img, factor)
# ... 其他操作实现
return img
构建数据增强 pipeline
train_transform = transforms.Compose([ transforms.RandomCrop(32, padding=4), transforms.RandomHorizontalFlip(), RandAugment(N=2, M=9), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)) ])
加载数据集
train_dataset = CIFAR10(root='./data', train=True, transform=train_transform, download=True) train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)
> **提示**:PyTorch 官方 `torchvision` 已内置 **RandAugment**,从 `torchvision.transforms` 可直接导入,无需手动实现:
>
> ```python
> from torchvision.transforms import RandAugment
> train_transform = RandAugment(num_ops=2, magnitude=9)
>