Skip to content

Latest commit

 

History

History
329 lines (278 loc) · 12.4 KB

DataAugmentation.md

File metadata and controls

329 lines (278 loc) · 12.4 KB

数据增强分类实战


本节将基于ImageNet-1K的数据集详细介绍数据增强实验,如果想快速体验此方法,可以参考30分钟玩转PaddleClas(进阶版)中基于CIFAR100的数据增强实验。如果想了解相关算法的内容,请参考数据增强算法介绍

目录

一、参数配置

由于不同的数据增强方式含有不同的超参数,为了便于理解和使用,我们在configs/DataAugment里分别列举了8种训练ResNet50的数据增强方式的参数配置文件,用户可以在tools/run.sh里直接替换配置文件的路径即可使用。此处分别挑选了图像变换、图像裁剪、图像混叠中的一个示例展示,其他参数配置用户可以自查配置文件。

1.1 AutoAugment

AotoAugment的图像增广方式的配置如下。AutoAugment是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(NormalizeImage)之前。

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - AutoAugment:
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''

1.2 RandAugment

RandAugment的图像增广方式的配置如下,其中用户需要指定其中的参数num_layersmagnitude,默认的数值分别是25RandAugment是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(NormalizeImage)之前。

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - RandAugment:
            num_layers: 2
            magnitude: 5
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''

1.3 TimmAutoAugment

TimmAutoAugment的图像增广方式的配置如下,其中用户需要指定其中的参数config_strinterpolationimg_size,默认的数值分别是rand-m9-mstd0.5-inc1bicubic224TimmAutoAugment是在uint8的数据格式上转换的,所以其处理过程应该放在归一化操作(NormalizeImage)之前。

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - TimmAutoAugment:
            config_str: rand-m9-mstd0.5-inc1
            interpolation: bicubic
            img_size: 224
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''

1.4 Cutout

Cutout的图像增广方式的配置如下,其中用户需要指定其中的参数n_holeslength,默认的数值分别是1112。类似其他图像裁剪类的数据增强方式,Cutout既可以在uint8格式的数据上操作,也可以在归一化(NormalizeImage)后的数据上操作,此处给出的是在归一化后的操作。

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
        - Cutout:
            n_holes: 1
            length: 112

1.5 RandomErasing

RandomErasing的图像增广方式的配置如下,其中用户需要指定其中的参数EPSILONslshr1attemptuse_log_aspectmode,默认的数值分别是0.250.021.0/3.00.310Truepixel。类似其他图像裁剪类的数据增强方式,RandomErasing既可以在uint8格式的数据上操作,也可以在归一化(NormalizeImage)后的数据上操作,此处给出的是在归一化后的操作。

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
        - RandomErasing:
            EPSILON: 0.25
            sl: 0.02
            sh: 1.0/3.0
            r1: 0.3
            attempt: 10
            use_log_aspect: True
            mode: pixel

1.6 HideAndSeek

HideAndSeek的图像增广方式的配置如下。类似其他图像裁剪类的数据增强方式,HideAndSeek既可以在uint8格式的数据上操作,也可以在归一化(NormalizeImage)后的数据上操作,此处给出的是在归一化后的操作。

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
        - HideAndSeek:

1.7 GridMask

GridMask的图像增广方式的配置如下,其中用户需要指定其中的参数d1d2rotateratiomode, 默认的数值分别是9622410.50。类似其他图像裁剪类的数据增强方式,GridMask既可以在uint8格式的数据上操作,也可以在归一化(NormalizeImage)后的数据上操作,此处给出的是在归一化后的操作。

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
        - GridMask:
            d1: 96
            d2: 224
            rotate: 1
            ratio: 0.5
            mode: 0

1.8 Mixup

Mixup的图像增广方式的配置如下,其中用户需要指定其中的参数alpha,默认的数值是0.2。类似其他图像混合类的数据增强方式,Mixup是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
      batch_transform_ops:
        - MixupOperator:
            alpha: 0.2

1.9 Cutmix

Cutmix的图像增广方式的配置如下,其中用户需要指定其中的参数alpha,默认的数值是0.2。类似其他图像混合类的数据增强方式,Cutmix是在图像做完数据处理后将每个batch内的数据做图像混叠,将混叠后的图像和标签输入网络中训练,所以其是在图像数据处理(图像变换、图像裁剪)后操作。

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
      batch_transform_ops:
        - CutmixOperator:
            alpha: 0.2

1.10 Mixup与Cutmix同时使用

Mixup``与Cutmix同时使用的配置如下,其中用户需要指定额外的参数prob,该参数控制不同数据增强的概率,默认为0.5

      transform_ops:
        - DecodeImage:
            to_rgb: True
            channel_first: False
        - RandCropImage:
            size: 224
        - RandFlipImage:
            flip_code: 1
        - NormalizeImage:
            scale: 1.0/255.0
            mean: [0.485, 0.456, 0.406]
            std: [0.229, 0.224, 0.225]
            order: ''
        - OpSampler:
            MixupOperator:
              alpha: 0.8
              prob: 0.5
            CutmixOperator:
              alpha: 1.0
              prob: 0.5

二、启动命令

当用户配置完训练环境后,类似于训练其他分类任务,只需要将tools/train.sh中的配置文件替换成为相应的数据增强方式的配置文件即可。

其中train.sh中的内容如下:

python3 -m paddle.distributed.launch \
    --selected_gpus="0,1,2,3" \
    --log_dir=ResNet50_Cutout \
    tools/train.py \
        -c ./ppcls/configs/ImageNet/DataAugment/ResNet50_Cutout.yaml

运行train.sh

sh tools/train.sh

三、注意事项

  • 由于图像混叠时需对label进行混叠,无法计算训练数据的准确率,所以在训练过程中没有打印训练准确率。

  • 在使用数据增强后,由于训练数据更难,所以训练损失函数可能较大,训练集的准确率相对较低,但其有拥更好的泛化能力,所以验证集的准确率相对较高。

  • 在使用数据增强后,模型可能会趋于欠拟合状态,建议可以适当的调小l2_decay的值来获得更高的验证集准确率。

  • 几乎每一类图像增强均含有超参数,我们只提供了基于ImageNet-1k的超参数,其他数据集需要用户自己调试超参数,具体超参数的含义用户可以阅读相关的论文,调试方法也可以参考训练技巧的章节。

四、实验结果

基于PaddleClas,在ImageNet1k数据集上的分类精度如下。

模型 初始学习率策略 l2 decay batch size epoch 数据变化策略 Top1 Acc 论文中结论
ResNet50 0.1/cosine_decay 0.0001 256 300 标准变换 0.7731 -
ResNet50 0.1/cosine_decay 0.0001 256 300 AutoAugment 0.7795 0.7763
ResNet50 0.1/cosine_decay 0.0001 256 300 mixup 0.7828 0.7790
ResNet50 0.1/cosine_decay 0.0001 256 300 cutmix 0.7839 0.7860
ResNet50 0.1/cosine_decay 0.0001 256 300 cutout 0.7801 -
ResNet50 0.1/cosine_decay 0.0001 256 300 gridmask 0.7785 0.7790
ResNet50 0.1/cosine_decay 0.0001 256 300 random-augment 0.7770 0.7760
ResNet50 0.1/cosine_decay 0.0001 256 300 random erasing 0.7791 -
ResNet50 0.1/cosine_decay 0.0001 256 300 hide and seek 0.7743 0.7720

注意

  • 在这里的实验中,为了便于对比,我们将l2 decay固定设置为1e-4,在实际使用中,我们推荐尝试使用更小的l2 decay。结合数据增强,我们发现将l2 decay由1e-4减小为7e-5均能带来至少0.3~0.5%的精度提升。
  • 我们目前尚未对不同策略进行组合并验证效果,这一块后续我们会开展更多的对比实验,敬请期待。