自动数据增广论文笔记 | AutoAugment: Learning Augmentation Strategies from Data

news2024/9/9 5:26:36

谷歌大脑出品
paper: https://arxiv.org/abs/1805.09501
这里是个论文的阅读心得,笔记,不等同论文全部内容

文章目录

  • 一、摘要
    • 1.1 翻译
    • 1.2 笔记
  • 二、(第3部分)自动增强:直接在感兴趣的数据集上搜索最佳增强策略
    • 2.1 翻译
    • 2.2 笔记
  • 三、跳出论文,转入应用——timm包
    • 3.1 timm包的自动增强搜索策略
    • 3.2 随机增强参数解释
    • 3.3 策略增强的imagenet官方给的参数注释
    • 3.4 数据增强效果实验

一、摘要

1.1 翻译

数据增强是提高现代图像分类器准确率的一种有效技术。然而,当前的数据增强实现是手工设计的。在本文中,我们描述了一个称为AutoAugment的简单过程,用于自动搜索改进的数据增强策略。在我们的实现中,我们设计了一个搜索空间,其中一个策略由许多子策略组成,其中一个子策略是为每个mini-batch中的每个图像随机选择的。子策略由两个操作组成,每个操作都是一个图像处理函数,如平移、旋转或剪切,以及应用这些函数的概率和大小。

我们使用搜索算法来找到最佳策略,使神经网络在目标数据集上产生最高的验证精度。我们的方法在CIFAR-10、CIFAR-100、SVHN和ImageNet上达到了最先进的精度(不需要额外的数据)。在ImageNet上,我们获得了83.5%的Top-1准确率,比之前83.1%的记录提高了0.4%。在CIFAR-10上,我们实现了1.5%的错误率,比以前的核心状态好0.6%。我们发现增强策略在数据集之间是可转移的。在ImageNet上学习的策略可以很好地转移到其他数据集上,例如Oxford Flowers、Caltech-101、Oxford- iit Pets、FGVC Aircraft和Stanford Cars。

1.2 笔记

主要陈述了自动数据增广的概念,这里比较重要的,我比较感兴趣的是搜索算法来找到最佳策略,结合第一段,也就是作者提出一个搜索空间,一个策略分解为多个子策略,子策略也是随机生成,而且每个子策略有2个数据增强的方法,然后搜索出最佳的子策略,然后表现在各大数据集上效果不错,转移到其他数据集也可以。

这里我比较好奇,如何去搜索最佳的策略?所以往下直接看方法。

二、(第3部分)自动增强:直接在感兴趣的数据集上搜索最佳增强策略

2.1 翻译

我们将寻找最佳增强策略的问题表述为一个离散搜索问题(参见图1)。我们的方法由两个部分组成:搜索算法和搜索空间。在高层次上,搜索算法(作为控制器RNN实现)对数据增强策略S进行采样,该策略包含要使用的图像处理操作、在每个批处理中使用该操作的概率以及操作的大小等信息。我们方法的关键是策略S将用于训练具有固定架构的神经网络,其验证精度R将被发送回更新控制器。由于R不可微,控制器将通过策略梯度方法进行更新。在下一节中,我们将详细描述这两个组件。在这里插入图片描述
图1:概述我们使用搜索方法(例如,强化学习)来搜索更好的数据增强策略的框架。控制器RNN从搜索空间预测增强策略。具有固定架构的子网络被训练到收敛,达到精度R。奖励R将与策略梯度方法一起使用来更新控制器,以便它可以随着时间的推移生成更好的策略。

搜索空间细节:在我们的搜索空间中,一个策略由5个子策略组成,每个子策略由顺序应用的两个图像操作组成。此外,每个操作还与两个超参数相关联:1)应用该操作的概率,以及2)操作的幅度。图2显示了在我们的搜索空间中具有5个子策略的策略示例。第一个子策略指定ShearX的顺序应用程序,然后是Invert。这个应用ShearX的概率为0.9,当应用时,其大小为7(满分为10)。然后我们以0.8的概率应用Invert。反相操作不使用幅度信息。我们强调这些操作是按照指定的顺序进行的。
在这里插入图片描述
图2:在SVHN上发现的策略之一,以及如何使用它来生成增强数据给定用于训练神经网络的原始图像。该策略有5个子策略。对于小批处理中的每个图像,我们均匀随机地选择一个子策略来生成变换后的图像来训练神经网络。每个子策略由2个操作组成,每个操作与两个数值相关联:调用操作的概率和操作的大小。有可能调用某个操作,因此该操作可能不会应用到该小批处理中。但是,如果施加,则以固定的幅度施加。我们通过展示如何在不同的小批量中对一个图像进行不同的转换来强调应用子策略的随机性,即使使用相同的子策略。正如文中所解释的,在SVHN上,AutoAugment更经常地选择几何变换。可以看出为什么在SVHN上通常选择反转操作,因为图像中的数字对于该变换是不变的。

我们在实验中使用的操作来自PIL,一个流行的Python图像库为了通用性,我们考虑PIL中所有函数接受图像作为输入和输出一个图像。我们还使用了另外两种很有前景的增强技术:Cutout[12]和samplep播[24]。我们搜索的操作是ShearX/Y, TranslateX/Y, Rotate, AutoContrast, Invert, Equalize, solalize, Posterize, Contrast, Color, Brightness, sharpening, cutout [12], Sample Pairing [24].总的来说,我们在搜索空间中有16项操作。每个操作还附带一个默认的幅度范围,这将在第4节中更详细地描述。我们将震级范围离散为10个值(均匀间隔),这样我们就可以使用离散搜索算法来找到它们。同样,我们也将应用该操作的概率离散为11个值(均匀间隔)。在(16×10×11)2种可能性的空间中查找每个子策略成为一个搜索问题。然而,我们的目标是同时找到5个这样的子政策,以增加多样性。有5个子策略的搜索空间大约有(16×10×11)10≈2.9×1032种可能性。

我们使用的16个操作及其默认值范围如附录中的表1所示。注意,在我们的搜索空间中没有显式的“Identity”操作;这个操作是隐式的,可以通过调用一个概率设置为0的操作来实现。
在这里插入图片描述
控制器在搜索过程中可以选择的所有图像转换的列表。此外,控制器在搜索每个操作期间可以预测的幅度值如第三列所示(对于图像大小为331x331)。有些变换不使用幅度信息(例如逆变和均衡)。

搜索算法细节: 我们在实验中使用的搜索算法使用了强化学习,灵感来自[71,4,72,5]。搜索算法由两个部分组成:控制器(递归神经网络)和训练算法(邻域策略优化算法)[53]。在每一步,控制器预测由softmax产生的决策;然后将预测作为嵌入馈送到下一步。为了预测5个子策略,控制器总共有30个softmax预测,每个子策略有2个操作,每个操作需要操作类型、大小和概率。

控制器RNN的训练: 控制器使用奖励信号进行训练,这表明该策略在改善“子模型”(作为搜索过程一部分训练的神经网络)的泛化方面有多好。在我们的实验中,我们设置了一个验证集来度量子模型的泛化。通过在训练集(不包含验证集)上应用5个子策略生成的增强数据来训练子模型。对于mini-batch中的每个示例,随机选择5个子策略中的一个来增强图像。然后在验证集上评估子模型以测量准确性,并将其用作训练循环网络控制器的奖励信号。在每个数据集上,控制器对大约15,000个策略进行采样。

控制器RNN的架构和训练超参数: 我们遵循[72]中的训练过程和超参数来训练控制器。更具体地,控制器RNN是一个单层LSTM[21],每层有100个隐藏单元,对与每个架构决策相关的两个卷积单元(其中B通常为5)进行2 × 5B softmax预测。控制器RNN的10B个预测中的每一个都与一个概率相关联。子网络的联合概率是这10B软最大值的所有概率的乘积。该联合概率用于计算控制器RNN的梯度。根据子网络的验证精度缩放梯度,以更新控制器RNN,使控制器为坏的子网络分配低概率,为好的子网络分配高概率。与[72]类似,我们采用学习率为0.00035的近端策略优化(PPO)[53]。为了鼓励探索,我们还使用了权重为0.00001的熵惩罚。在我们的实现中,基线函数是先前奖励的指数移动平均值,权重为0.95。控制器的权重在-0.1到0.1之间均匀初始化。出于方便,我们选择使用PPO来训练控制器,尽管先前的工作表明,其他方法(例如增强随机搜索和进化策略)可以表现得同样好,甚至略好[30]。

在搜索结束时,我们将最佳5个策略中的子策略连接到单个策略中(包含25个子策略)。最后这个包含25个子策略的策略用于训练每个数据集的模型。

上述搜索算法是我们可以用来寻找最佳策略的许多可能的搜索算法之一。也许可以使用不同的离散搜索算法,如遗传规划[48]甚至随机搜索[6]来改进本文的结果。

【关于训练迭代数在5部分Discuss有提到,这里放在一起】

训练步骤与子策略数量之间的关系:我们工作的一个重要方面是子策略在训练过程中的随机应用。每个图像仅由每个小批中可用的许多子策略中的一个增强,子策略本身具有进一步的随机性,因为每个转换都有与其关联的应用程序的概率。我们发现这种随机性要求每个子策略有一定数量的epoch才能使AutoAugment有效。由于每个子模型都用5个子策略进行训练,因此在模型完全受益于所有子策略之前,它们需要训练超过80-100个epoch的子策略。这就是为什么我们选择训练我们的child模型为120个epochs。每个子策略需要应用一定的次数,模型才能从中受益。在策略被学习之后,完整的模型被训练更长的时间(例如CIFAR-10上的Shake-Shake训练1800个epoch, ImageNet上的ResNet-50训练270个epoch),这允许我们使用更多的子策略。

2.2 笔记

这里讲了自动搜索算法,类似训练的概念,学习出一个最优的数据增强策略,讨论部分也提到了要更多的epoch来搜索。后面的实验也就是设置一个基准,然后跟没有用autoaugment或者跟其他方法比较,最后讨论和消融实验。这里就不往下看了,感兴趣可以直接进最上面的原文链接看原文。

这里再看下应用,研究autoAug也是因为需要提升训练精度,然后在timm包里发现了这个,进而来研究下,下面再做一下timm里面的学习笔记。

三、跳出论文,转入应用——timm包

参考:https://timm.fast.ai/AutoAugment#auto_augment_policy

原文:
在本教程中,我们将了解如何利用 AutoAugment 作为一种数据增强技术来训练神经网络。
我们看:

  1. 我们如何使用 timm 训练脚本来应用 AutoAugment 。
  2. 我们如何使用 AutoAugment 作为自定义训练循环的独立数据增强技术。
  3. 深入研究 AutoAugment 的源代码。

理解:
发现这里只是用了论文的预设结论或者其他的结论生成的一些策略,以及一些增强算子随机增强。以下是对自动增强策略的解读,以及实验看下每个随机增强的效果。

3.1 timm包的自动增强搜索策略

其中timm包的自动增强搜索策略包含:

  1. AutoContrast: 自动对比度调整。
  2. Equalize: 直方图均衡化。
  3. Invert: 反转图像颜色。
  4. Rotate: 随机旋转图像。
  5. Posterize: 减少图像的色阶。
  6. Solarize: 部分地反转图像的像素值。
  7. SolarizeAdd: 在图像上添加一些反转效果。
  8. Color: 随机调整图像的颜色。
  9. Contrast: 随机调整图像的对比度。
  10. Brightness: 随机调整图像的亮度。
  11. Sharpness: 随机调整图像的锐度。
  12. ShearX: 沿着 X 轴随机剪切图像。
  13. ShearY: 沿着 Y 轴随机剪切图像。
  14. TranslateXRel: 沿着 X 轴相对随机平移图像。
  15. TranslateYRel: 沿着 Y 轴相对随机平移图像。

3.2 随机增强参数解释

rand_augment_transform函数的注释
这段代码是用于创建一个 RandAugment 变换的函数。RandAugment 是一种数据增强的方法,通过对图像应用一系列随机的数据变换来增加训练数据的多样性。
这个函数接受两个参数:

  1. config_str:一个字符串,定义了随机增强的配置。这个字符串包括多个部分,由破折号(‘-’)分隔。第一个部分定义了具体的 RandAugment 变体(目前只有 ‘rand’)。其余的部分用于确定具体的配置参数,包括:
  • ‘m’:整数,表示 RandAugment 的幅度(magnitude)。
  • ‘n’:整数,表示每个图像选择的变换操作的数量。
  • ‘w’:整数,表示概率权重的索引(一组权重集合的索引,用于影响操作的选择)。
  • ‘mstd’:浮点数,表示幅度噪声的标准差,或者如果是无穷大(或大于100),则进行均匀采样。
  • ‘mmax’:设置幅度的上限,而不是默认的 _LEVEL_DENOM(10)。
  • ‘inc’:整数(布尔值),表示是否使用随着幅度增加而增加的增强(默认为0)。
  1. hparams:其他的超参数(关键字参数),用于配置 RandAugmentation 方案。
    最终,这个函数返回一个与 PyTorch 兼容的变换(Transform),可以用于数据增强。这个变换将在训练过程中被应用于图像数据。

3.3 策略增强的imagenet官方给的参数注释

policy = [
    [('PosterizeOriginal', 0.4, 8), ('Rotate', 0.6, 9)],
    [('Solarize', 0.6, 5), ('AutoContrast', 0.6, 5)],
    [('Equalize', 0.8, 8), ('Equalize', 0.6, 3)],
    [('PosterizeOriginal', 0.6, 7), ('PosterizeOriginal', 0.6, 6)],
    [('Equalize', 0.4, 7), ('Solarize', 0.2, 4)],
    [('Equalize', 0.4, 4), ('Rotate', 0.8, 8)],
    [('Solarize', 0.6, 3), ('Equalize', 0.6, 7)],
    [('PosterizeOriginal', 0.8, 5), ('Equalize', 1.0, 2)],
    [('Rotate', 0.2, 3), ('Solarize', 0.6, 8)],
    [('Equalize', 0.6, 8), ('PosterizeOriginal', 0.4, 6)],
    [('Rotate', 0.8, 8), ('Color', 0.4, 0)],
    [('Rotate', 0.4, 9), ('Equalize', 0.6, 2)],
    [('Equalize', 0.0, 7), ('Equalize', 0.8, 8)],
    [('Invert', 0.6, 4), ('Equalize', 1.0, 8)],
    [('Color', 0.6, 4), ('Contrast', 1.0, 8)],
    [('Rotate', 0.8, 8), ('Color', 1.0, 2)],
    [('Color', 0.8, 8), ('Solarize', 0.8, 7)],
    [('Sharpness', 0.4, 7), ('Invert', 0.6, 8)],
    [('ShearX', 0.6, 5), ('Equalize', 1.0, 9)],
    [('Color', 0.4, 0), ('Equalize', 0.6, 3)],
    [('Equalize', 0.4, 7), ('Solarize', 0.2, 4)],
    [('Solarize', 0.6, 5), ('AutoContrast', 0.6, 5)],
    [('Invert', 0.6, 4), ('Equalize', 1.0, 8)],
    [('Color', 0.6, 4), ('Contrast', 1.0, 8)],
    [('Equalize', 0.8, 8), ('Equalize', 0.6, 3)],
]

分别是:变换名,变换概率,变换强度

3.4 数据增强效果实验

from timm.data.auto_augment import AugmentOp
from PIL import Image
from matplotlib import pyplot as plt

img_path = r"/path/to/imagenet-mini/val/n01537544/ILSVRC2012_val_00023438.JPEG"
mean = (0.485, 0.456, 0.406)
X = Image.open(img_path)
img_size_min = min(X.size)
plt.imshow(X)
plt.show()

all_policy_use_op = [
    ['AutoContrast', 1, 10], ['Equalize', 1, 10], ['Invert', 1, 10], ['Rotate', 1, 10], ['Posterize', 1, 10],
    ['PosterizeIncreasing', 1, 10], ['PosterizeOriginal', 1, 10], ['Solarize', 1, 10], ['SolarizeIncreasing', 1, 10],
    ['SolarizeAdd', 1, 10], ['Color', 1, 10], ['ColorIncreasing', 1, 10], ['Contrast', 1, 10],
    ['ContrastIncreasing', 1, 10], ['Brightness', 1, 10], ['BrightnessIncreasing', 1, 10], ['Sharpness', 1, 10],
    ['SharpnessIncreasing', 1, 10], ['ShearX', 1, 10], ['ShearY', 1, 10], ['TranslateX', 1, 10], ['TranslateY', 1, 10],
    ['TranslateXRel', 1, 10], ['TranslateYRel', 1, 10]
]

for op_name, p, m in all_policy_use_op:
    aug_op = AugmentOp(name=op_name, prob=p, magnitude=m,
                       hparams={'translate_const': int(img_size_min * 0.45),
                                'img_mean': tuple([min(255, round(255 * x)) for x in mean])})
    plt.imshow(aug_op(X))
    plt.title(f'{op_name}_{str(p)}_{str(m)}')
    plt.show()

原图
在这里插入图片描述
AutoContrast
在这里插入图片描述

Equalize
在这里插入图片描述

Invert
在这里插入图片描述

Rotate
在这里插入图片描述
Posterize
在这里插入图片描述
PosterizeIncreasing
在这里插入图片描述

PosterizeOriginal
在这里插入图片描述

Solarize
在这里插入图片描述

SolarizeIncreasing
在这里插入图片描述

SolarizeAdd

在这里插入图片描述
Color
在这里插入图片描述

ColorIncreasing

在这里插入图片描述

Contrast
在这里插入图片描述

ContrastIncreasing

在这里插入图片描述

Brightness
在这里插入图片描述

BrightnessIncreasing
在这里插入图片描述

Sharpness
在这里插入图片描述

SharpnessIncreasing
在这里插入图片描述

ShearX
在这里插入图片描述

ShearY
在这里插入图片描述

TranslateX
在这里插入图片描述

TranslateY
在这里插入图片描述

TranslateXRel
在这里插入图片描述

TranslateYRel

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1293159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python超级详细的raise用法

当程序出现错误时,系统会自动引发异常。除此之外,Python 也允许程序自行引发异常,自行引发异常使用 raise 语句来完成。 很多时候,系统是否要引发异常,可能需要根据应用的业务需求来决定,如果程序中的数据…

智能配电房解决方案

智能配电房解决方案运用物联网、云计算、大数据、人工智能等先进技术,构建具备遥测、遥信、遥控、遥调、遥视功能的智能配电房,依托电易云-智慧电力物联网实现对配电室的全面感知、智能监控、优化运行、精益管理,提高供电可靠性,降…

系统设计之数据库

为您的项目选择正确的数据库是一项复杂的任务。许多数据库选项都适合不同的用例,很快就会导致决策疲劳。 我们希望这份备忘单提供高级指导,以找到符合您项目需求的正确服务并避免潜在的陷阱。 注意:Google 关于其数据库用例的文档有限。尽管…

笔记本用gpu运行tensorflow-gpu,keras写的老程序,结果与原来不一样,一脸懵逼。

先说结论我笔记一是rtx3050ti, 重点RTX30系列最低要求CUDA版本为11.1,否则最后跑程序会报错。再说现象,突发奇想想在笔记本上运行一个以前在1080titensorflow-gpu1.5.2,keras2.2.4上面写的一个图像分类模型,先用cpu模式 运行一下一切正常。如…

探索正则可视化工具:让编程更直观、高效

导语:在当今的编程世界中,正则表达式已成为不可或缺的技能。然而,理解和编写正则表达式往往是一项具有挑战性的任务。为了降低门槛,提高编程效率,正则可视化工具应运而生。 一、正则表达式的简介与历史 正则表达式&a…

基于JNI实现调用C++ SDK

基于JNI实现调用C SDK 背景分析解决实践 背景 上篇文章总结了几种Java项目调用C/C SDK项目方法,在逐一实践、踩坑后,最终还是敲定采用 JNI 方式进行实现。在文章开始的过程,会先大概讲讲笔者遇到的情况,因为封装方式需要根据实际…

文本润色工具有哪些,高质量的文本润色软件

在当今信息过载的时代,文本的重要性愈发凸显。即便是最精心构思的文章,若未经过仔细的润色,也难以达到最佳的表达效果。本文将专心分享文本润色工具的种类。 文本润色工具的种类 文本润色工具根据其功能和应用范围可以分为多个种类&#xff…

【C语言快速学习基础篇】之二控制语句、循环语句、隐式转换

文章目录 一、控制语句1.1、for循环1.2、while循环1.3、注意:for循环和while循环使用上面等同1.4、do while循环1.4.1while条件成立时1.4.2、while条件不成立时 C语言介绍 C语言是一门面向过程的计算机编程语言,与C、C#、Java等面向对象编程语言有所不同…

python pydoc生成API文档

pydoc是python内置的一个文档生成模块。 pydoc 模块会根据 Python 模块来自动生成文档。 生成的文档可在控制台中显示为文本页面,提供给 Web 浏览器访问或者保存为 HTML 文件。 对于模块、类、函数和方法,显示的文档内容取自文档字符串(即 _…

202350读书笔记|《再别康桥:徐志摩诗选》——微风起,清芬酝藉,不减荼

202350读书笔记|《再别康桥:徐志摩诗选》——微风起,清芬酝藉,不减荼 《再别康桥:徐志摩诗选》我觉得有时候诗人是很狂热的,上头的感觉。 有几首很喜欢,节选如下: 偶然 我是天空里的一片云&…

【STM32】TIM定时器输入捕获

1 输入捕获 1.1 输入捕获简介 IC(Input Capture)输入捕获 输入捕获模式下,当通道输入引脚出现指定电平跳变时(上升沿/下降沿),当前CNT的值将被锁存到CCR中(把CNT的值读出来,写入到…

JavaScript编程基础 – 闭包(Closure)

JavaScript编程基础 – 闭包 JavaScript Programming Essentials - Closure By JacksonML 闭包和JavaScript的作用域有关。 我们需要先理解闭包的概念。 本文简要介绍闭包函数以及环境状态,并用实例说明闭包的创建及其基本用法。希望对学习及开发有所帮助。 1. …

sql优化常用的几种方法

SQL优化是数据库管理和应用开发中的一个重要环节,它涉及到对SQL查询语句的改进,以提高执行效率,减少系统负载,并优化资源使用。以下是一些常用的SQL优化方法,我会尽量覆盖一些关键的点。 使用合适的数据类型 选择适…

通俗易懂的案例+代码解释AOP 切面编程

目录 1. 理解AOP2 Before2.1 controller层2.2 service层2.3 自定义注解2.4 切面 advice 3 After4 Around spring的三大核心:IOC控制反转、DI依赖注入、AOP面向切面编程 刚开始接触springboot项目,前两个使用的多,亲自使用AOP的机会并不多&…

python自动化测试如何做数据缓存 ?这个第三方包推荐给你,方便又简单!

1.数据缓存说明 数据缓存可以说也是项目开发中比不可少的一个工具 ,像我们测试的系统中 ,你都会见到像Redis一样的数据缓存库 。使用缓存数据库的好处不言而喻,那就是效率高 ,简单数据直接放在缓存中 ,存取简单方便 。…

探索Scrapy-spider:构建高效网络爬虫

Spider简介 Scrapy中的Spider是用于定义和执行数据抓取逻辑的核心组件。Spider负责从指定的网站抓取数据,并定义了如何跟踪链接、解析内容以及提取数据的规则。它允许您定制化地指定要抓取的网站、页面和所需的信息。Spider的作用是按照预定的规则爬取网页&#xf…

12.7 C++作业

自由发挥登录窗口的应用场景,实现一个登录窗口界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {//*******窗口相关设置********this->setWindowTitle("王者农药"); //设置窗口标题this->setWindowIcon(QIc…

OpenTiny Vue 3.12.0 发布:文档大优化!增加水印和二维码两个新组件

你好,我是 Kagol。 非常高兴跟大家宣布,2023年11月30日,OpenTiny Vue 发布了 v3.12.0 🎉。 OpenTiny 每次大版本发布,都会给大家带来一些实用的新特性,10.24 我们发布了 v3.11.0 版本,增加了富…

算法学习系列(六):高精度加法、减法、乘法、除法

目录 引言一、高精度加法1.题目描述2.代码实现3.测试 二、高精度减法1.题目描述2.代码实现3.测试 三、高精度乘法1.题目描述2.代码实现3.测试 四、高精度除法1.题目描述2.代码实现3.测试 引言 本文介绍了高精度加法、高精度减法、高精度乘法、高精度除法,这个高精度…