抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

深度学习中的数据增强方法都有哪些?

2019 年 9 月 07 日

深度学习中的数据增强方法都有哪些?

很多实际的项目,我们都难以有充足的数据来完成任务,要保证完美的完成任务,有两件事情需要做好:(1)寻找更多的数据。(2)充分利用已有的数据进行数据增强,今天就来说说数据增强。


什么是数据增强?

数据增强也叫数据扩增,意思是在不实质性的增加数据的情况下,让有限的数据产生等价于更多数据的价值。



比如上图,第 1 列是原图,后面 3 列是对第 1 列作一些随机的裁剪、旋转操作得来。


每张图对于网络来说都是不同的输入,加上原图就将数据扩充到原来的 10 倍。假如我们输入网络的图片的分辨率大小是 256×256,若采用随机裁剪成 224×224 的方式,那么一张图最多可以产生 32×32 张不同的图,数据量扩充将近 1000 倍。虽然许多的图相似度太高,实际的效果并不等价,但仅仅是这样简单的一个操作,效果已经非凡了。


如果再辅助其他的数据增强方法,将获得更好的多样性,这就是数据增强的本质。


数据增强可以分为,有监督的数据增强和无监督的数据增强方法。其中有监督的数据增强又可以分为单样本数据增强和多样本数据增强方法,无监督的数据增强分为生成新的数据和学习增强策略两个方向。


有监督的数据增强

有监督数据增强,即采用预设的数据变换规则,在已有数据的基础上进行数据的扩增,包含单样本数据增强和多样本数据增强,其中单样本又包括几何操作类,颜色变换类。


单样本数据增强

所谓单样本数据增强,即增强一个样本的时候,全部围绕着该样本本身进行操作,包括几何变换类,颜色变换类等。


(1) 几何变换类


几何变换类即对图像进行几何变换,包括翻转,旋转,裁剪,变形,缩放等各类操作,下面展示其中的若干个操作。



水平翻转和垂直翻转:



随机旋转:



随机裁剪:



变形缩放:


翻转操作和旋转操作,对于那些对方向不敏感的任务,比如图像分类,都是很常见的操作,在 caffe 等框架中翻转对应的就是 mirror 操作。


翻转和旋转不改变图像的大小,而裁剪会改变图像的大小。通常在训练的时候会采用随机裁剪的方法,在测试的时候选择裁剪中间部分或者不裁剪。值得注意的是,在一些竞赛中进行模型测试时,一般都是裁剪输入的多个版本然后将结果进行融合,对预测的改进效果非常明显。


以上操作都不会产生失真,而缩放变形则是失真的。


很多的时候,网络的训练输入大小是固定的,但是数据集中的图像却大小不一,此时就可以选择上面的裁剪成固定大小输入或者缩放到网络的输入大小的方案,后者就会产生失真,通常效果比前者差。


(2) 颜色变换类


上面的几何变换类操作,没有改变图像本身的内容,它可能是选择了图像的一部分或者对像素进行了重分布。如果要改变图像本身的内容,就属于颜色变换类的数据增强了,常见的包括噪声、模糊、颜色变换、擦除、填充等等。


基于噪声的数据增强就是在原来的图片的基础上,随机叠加一些噪声,最常见的做法就是高斯噪声。更复杂一点的就是在面积大小可选定、位置随机的矩形区域上丢弃像素产生黑色矩形块,从而产生一些彩色噪声,以 Coarse Dropout 方法为代表,甚至还可以对图片上随机选取一块区域并擦除图像信息。



添加 Coarse Dropout 噪声


颜色变换的另一个重要变换是颜色扰动,就是在某一个颜色空间通过增加或减少某些颜色分量,或者更改颜色通道的顺序。



颜色扰动


还有一些颜色变换,本文就不再详述。


几何变换类,颜色变换类的数据增强方法细致数还有非常多,推荐给大家一个 git 项目:


https://github.com/aleju/imgaug


预览一下它能完成的数据增强操作吧。



2.2. 多样本数据增强

不同于单样本数据增强,多样本数据增强方法利用多个样本来产生新的样本,下面介绍几种方法。


(1) SMOTE[1]


SMOTE 即 Synthetic Minority Over-sampling Technique 方法,它是通过人工合成新样本来处理样本不平衡问题,从而提升分类器性能。


类不平衡现象是很常见的,它指的是数据集中各类别数量不近似相等。如果样本类别之间相差很大,会影响分类器的分类效果。假设小样本数据数量极少,如仅占总体的 1%,则即使小样本被错误地全部识别为大样本,在经验风险最小化策略下的分类器识别准确率仍能达到 99%,但由于没有学习到小样本的特征,实际分类效果就会很差。


SMOTE 方法是基于插值的方法,它可以为小样本类合成新的样本,主要流程为:


第一步,定义好特征空间,将每个样本对应到特征空间中的某一点,根据样本不平衡比例确定好一个采样倍率 N;


第二步,对每一个小样本类样本(x,y),按欧氏距离找出 K 个最近邻样本,从中随机选取一个样本点,假设选择的近邻点为(xn,yn)。在特征空间中样本点与最近邻样本点的连线段上随机选取一点作为新样本点,满足以下公式:



第三步,重复以上的步骤,直到大、小样本数量平衡。


该方法的示意图如下:



在 python 中,SMOTE 算法已经封装到了 imbalanced-learn 库中,如下图为算法实现的数据增强的实例,左图为原始数据特征空间图,右图为 SMOTE 算法处理后的特征空间图。



(2) SamplePairing[2]


SamplePairing 方法的原理非常简单,从训练集中随机抽取两张图片分别经过基础数据增强操作(如随机翻转等)处理后经像素以取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。这两张图片甚至不限制为同一类别,这种方法对于医学图像比较有效。



经 SamplePairing 处理后可使训练集的规模从 N 扩增到 N×N。实验结果表明,因 SamplePairing 数据增强操作可能引入不同标签的训练样本,导致在各数据集上使用 SamplePairing 训练的误差明显增加,而在验证集上误差则有较大幅度降低。


尽管 SamplePairing 思路简单,性能上提升效果可观,符合奥卡姆剃刀原理,但遗憾的是可解释性不强。


(3) mixup[3]


mixup 是 Facebook 人工智能研究院和 MIT 在“Beyond Empirical Risk Minimization”中提出的基于邻域风险最小化原则的数据增强方法,它使用线性插值得到新样本数据。


令(xn,yn)是插值生成的新数据,(xi,yi)和(xj,yj)是训练集随机选取的两个数据,则数据生成方式如下:



λ的取值范围介于 0 到 1。提出 mixup 方法的作者们做了丰富的实验,实验结果表明可以改进深度学习模型在 ImageNet 数据集、CIFAR 数据集、语音数据集和表格数据集中的泛化误差,降低模型对已损坏标签的记忆,增强模型对对抗样本的鲁棒性和训练生成对抗网络的稳定性。


SMOTE,SamplePairing,mixup 三者思路上有相同之处,都是试图将离散样本点连续化来拟合真实样本分布,不过所增加的样本点在特征空间中仍位于已知小样本点所围成的区域内。如果能够在给定范围之外适当插值,也许能实现更好的数据增强效果。


无监督的数据增强

无监督的数据增强方法包括两类:


(1) 通过模型学习数据的分布,随机生成与训练数据集分布一致的图片,代表方法 GAN[4]。


(2) 通过模型,学习出适合当前任务的数据增强方法,代表方法 AutoAugment[5]。


GAN


关于 GAN(generative adversarial networks),我们已经说的太多了。它包含两个网络,一个是生成网络,一个是对抗网络,基本原理如下:


(1) G 是一个生成图片的网络,它接收随机的噪声 z,通过噪声生成图片,记做 G(z) 。


(2) D 是一个判别网络,判别一张图片是不是“真实的”,即是真实的图片,还是由 G 生成的图片。



GAN 的以假乱真能力就不多说了。


2 Autoaugmentation[5]


AutoAugment 是 Google 提出的自动选择最优数据增强方案的研究,这是无监督数据增强的重要研究方向。它的基本思路是使用增强学习从数据本身寻找最佳图像变换策略,对于不同的任务学习不同的增强方法,流程如下:


(1) 准备 16 个常用的数据增强操作。


(2) 从 16 个中选择 5 个操作,随机产生使用该操作的概率和相应的幅度,将其称为一个 sub-policy,一共产生 5 个 sub-polices。


(3) 对训练过程中每一个 batch 的图片,随机采用 5 个 sub-polices 操作中的一种。


(4) 通过模型在验证集上的泛化能力来反馈,使用的优化方法是增强学习方法。


(5) 经过 80~100 个 epoch 后网络开始学习到有效的 sub-policies。


(6) 之后串接这 5 个 sub-policies,然后再进行最后的训练。


总的来说,就是学习已有数据增强的组合策略,对于门牌数字识别等任务,研究表明剪切和平移等几何变换能够获得最佳效果。



而对于 ImageNet 中的图像分类任务,AutoAugment 学习到了不使用剪切,也不完全反转颜色,因为这些变换会导致图像失真。AutoAugment 学习到的是侧重于微调颜色和色相分布。



除此之外还有一些数据增强方法,篇幅有限不做过多解读,请持续关注。


4 思考

数据增强的本质是为了增强模型的泛化能力,那它与其他的一些方法比如 dropout,权重衰减有什么区别?


(1) 权重衰减,dropout,stochastic depth 等方法,是专门设计来限制模型的有效容量的,用于减少过拟合,这一类是显式的正则化方法。研究表明这一类方法可以提高泛化能力,但并非必要,且能力有限,而且参数高度依赖于网络结构等因素。


(2) 数据增强则没有降低网络的容量,也不增加计算复杂度和调参工程量,是隐式的规整化方法。实际应用中更有意义,所以我们常说,数据至上。


参考文章


[1] Chawla N V, Bowyer K W, Hall L O, et al. SMOTE: synthetic minority over-sampling technique[J]. Journal of Artificial Intelligence Research, 2002, 16(1):321-357.


[2] Inoue H. Data Augmentation by Pairing Samples for Images Classification[J]. 2018.


[3] Zhang H, Cisse M, Dauphin Y N, et al. mixup: Beyond Empirical Risk Minimization[J]. 2017.


[4] Goodfellow I J, Pouget-Abadie J, Mirza M, et al. Generative Adversarial Networks[J]. Advances in Neural Information Processing Systems, 2014, 3:2672-2680.


[5] Cubuk E D, Zoph B, Mane D, et al. AutoAugment: Learning Augmentation Policies from Data.[J]. arXiv: Computer Vision and Pattern Recognition, 2018.


作者介绍

言有三,真名龙鹏,曾先后就职于奇虎 360AI 研究院、陌陌深度学习实验室,6 年多计算机视觉从业经验,拥有丰富的传统图像算法和深度学习图像项目经验,拥有技术公众号《有三 AI》,著有书籍《深度学习之图像识别:核心技术与案例实战》。


原文链接:

https://mp.weixin.qq.com/s/g4022Rc1RNvr3IOC_bWuaQ


2019 年 9 月 07 日 15:355276

评论

发布
暂无评论
发现更多内容

AI技术在小程序生态质量保障方向的落地实践

百度Geek说

小程序 AI

从优秀到卓越:成为DevOps专家的7项软技能

禅道项目管理

DevOps 趋势 软技能

五年磨一剑,海外运营商数字化转型与新一代OSS

鲸品堂

方法论 数字化转型 运营商

通过序列号Sequence零代码实现订单流水号

crudapi

低代码 流水号 crud crudapi 序列号

nginx做代理访问慢,优化方案

Ng

产品经理训练营 - 作业六

胡小湖

最火前端Web组态软件(可视化)

尔嵘

可视化数据分析搭建 前端可视化 web组态 托拉拽组态

vue+element中引入百度地图

尔嵘

Vue Element 百度地图

大侠请留步!欢迎有极客精神的你

Lily

图解 | 原来这就是 IO 多路复用

云流

Java 程序员 架构 面试

APK反编译

行者AI

编译

Java岗位阿里+字节+滴滴+美团+腾讯+百度+京东12万字面试题总结

Java架构追梦

Java 阿里巴巴 架构 腾讯 大厂面试题总结

颠覆认知——Redis会遇到的15个「坑」,你踩过几个?

Kaito

redis 踩坑 后端

音频互动连麦使用手册

anyRTC开发者

ios android 音视频 WebRTC RTC

程序开发必备的六个信条

这就是编程

程序开发

Hello World !!!

潮湿了我押韵的心情

AI量化智能交易软件,量化策略系统搭建

13823153121

封装变化的内容

这就是编程

程序开发

layui使用templet格式化表格数据

剖析Android开发未来的出路在哪里,终局之战

欢喜学安卓

android 程序员 面试 移动开发

第 9 周作业 _ 数据分析

园子

聊聊Java的异常机制问题

华为云开发者社区

Java 对象 异常机制 Throwable Error

Kubernetes弃用Docker运行时,小甜甜变牛夫人影响了谁?

会飞的鱼

Docker 云计算 架构 容器 #Kubernetes#

互联网大厂100道Android面试题助你冲关金三银四!附小技巧

欢喜学安卓

android 程序员 面试 移动开发

单片机如何从上电复位执行到main函数?

不脱发的程序猿

嵌入式软件 单片机 28天挑战 3月日更 上电复位执行到main函数

力扣(LeetCode)刷题,简单题(第12期)

不脱发的程序猿

LeetCode 面试刷题 28天写作 算法面经 3月日更

Android内存泄漏检测之LeakCanary2.0(Kotlin版)的实现原理

vivo互联网技术

android kotlin 内存泄漏

中国云基础设施支出创新高,增速全球第一;国内首个区块链特色司法鉴定机构在京成立

京东科技开发者

区块链 人工智能 开发者

nginx配置日志为json格式,nginx按照天实现日志分割,nginx配置负载均衡

Ng

使用VUE和Element 创建一个dialog对话框组件的详细过程

尔嵘

关于 JavaScript 闭包

HaiJun

JavaScript 前端 闭包

Study Go: From Zero to Hero

Study Go: From Zero to Hero

深度学习中的数据增强方法都有哪些?-InfoQ