RandAugment:无搜索的自动数据增强策略

FreeGuideOnline 最新 2026-06-21

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)
>