没有读过本系列前几期文章的朋友,需要先回顾下已发表的文章:
开篇大吉
集成AI模块到系统中
模型的部署
CMSIS-NN介绍
从穿糖葫芦到织深度神经网络
又和大家见面了,上次本程序猿介绍了CMSIS-NN,一晃过去了两个月。。。。闲话不多说,开始正题,小编这次带来的是,进行深度学习部署时的一段比较有用的小插曲:浅谈深度学习中的数据增广。
数据增广,听起来很玄乎,其实很简单,就是把有限的数据集变得更大更多。方法也主要是对现有图像做些变换,比如平移,缩放,拉伸,旋转,加噪声等。
首先回顾一下,上期的文章:从串糖葫芦到织深度神经网络,(此处应该有掌声,比喻的是如此的恰当),我们的工程师,用糖葫芦做比喻,生动形象的向大家介绍了各种通用的深度神经网络,包括简单直接的普通糖葫芦—CIFAR-10模型,拔丝糖葫芦—残差网络等,随后在试吃环节,介绍了拔丝糖葫芦—基于MobileFaceNet的人脸识别网络在小钢炮i.MX RT上的应用,让人不得不赞叹:真香!
但是,可能有人会问了,糖葫芦穿好了,是不是要进行粘糖——训练模型了?对于喜欢吃甜口的顾客,可能要让大家失望了,因为,我们糖不够了,再次要对大家说声抱歉了,因为糖目前比较稀少,还涨价了(时不我待。。。。)。
不过,为了不让我们广大的“糖迷”们失望,本期,我们就将介绍,如何为糖葫芦粘更多的糖,满足广大吃货朋友们的愿望——浅谈深度学习中的数据增广,通过对数据集进行数字图像处理,进行数据集的扩充,让糖变多!
OK, Everybody, Let’s Go!
第一个问题:在没有大量数据的情况下,如何获取更多的数据呢?
事实上,当我们利用CNN等进行模型训练的时候,大量的原始数据集不一定是必须的,为什么呢?因为神经网络从设计之初就不是个天才,不是始祖智能的,例如,缺乏训练的网络会认为下面三个小狗是不同的,disappointing
所以,为了获得更多数据,我们可以利用这点,戏弄神经网络,仅需要对已有数据集做微小的调整。比如,翻转、镜像、平移、旋转,神经网路会认为数据是不同的,不得不说,神经网络还是有点脸盲的。
同时,一个卷积神经网络通常具有不变性的性质,通俗点讲,不论你如何摧残数据集:平移、视角变换、尺寸、照度(或是组合摧残),网络都会爱你永不变(多么痴情的人工智能)。
而以上,这些就是数据增广的理论基础。在现实中,我们可能仅有一袋糖豆儿:一组在有限条件下拍摄的照片。但是,我们的目标应用可能是在多变的环境下,例如,不同的方向、位置、比例、亮度等。通过使用综合修改后的数据来训练网络,以应对这些情形,让糖翻倍。
第二个问题:我已经有足够多的数据了,继续增强也是有必要的吗?
答案当然是肯定的了!不然我这篇文章还怎么写。。。。(好了,开个小玩笑)
话不多说,图来凑,上图!
在人类的眼中,一定一眼就可以得出结论:左边是可爱的狗子,右边是小花猫。
但是,当你完成了网络训练,利用下图进行测试时(可爱的狗子,但是朝向右侧),你会发现,网络却会认为此图为小猫咪……于是,生气的你准备把网络再次回炉重塑,以为是训练不充足,但是无论你重试多少次,结果都一样。这时你可能会想,可能我错怪Ta了,因为数据集充足,而且网络的确是会有5%左右的误差的,那就这样吧。
那么,为什么会这样呢?因为大多数的机器学习就是这样工作的:网络本身会寻找区分物体间的最明显的特征。在本例中,事实上Ta找到了,就是所有狗子的图片都是向左的,而小猫咪是向右的。
尽管听起来很怪,但是,事实上就是如此。因此,无论你训练多少次,当你输入一张朝向右侧的图片时,无论是什么,都只会输出一个结果:小猫咪。这就说明,神经网络的好坏取决于输入的数据。
那么我们要如何预防此类问题呢?
我们需要减少数据集中无关特征的数量。对于上面的猫狗分类器,一个简单的办法就是为数据集添加不同朝向的猫狗图片。更好的办法是,将数据集中的照片进行水平翻转,再用新的数据集就会训练得到你想要的结果。
通过数据集的增强,可以防止网络学习到不相关的模式,根本上提升整体性能。
而这也就带来了一个新的问题,在机器学习中的什么位置进行数据增广呢?
答案相当的明显,在向模型输入数据之前。但同时,你有两个选择,其一是预先进行所必要的变换,从根本上增加数据集规模。另一个是小批量变换,仅仅在输入模型前。
第一个我们称之为离线增强,常用于体型小的数据集。因为你最终会通过一个与执行的转换数量相等的因子来增加数据集的大小(例如,通过翻转所有图像,数据集会增加2倍)
第二个称之为在线增强,或称为动态增强。主要用于大块头的数据集,使你无法负担数据量爆炸性增长。这,可以通过对即将输入模型的小批量数据执行相应的变化。当然,很多机器学习架构均已支持在线增强,并且可以利用GPU进行加速。
在文章最后,简单介绍下常用的增强技术,为了简单起见,我们的所有变换都基于一个假设:我们不需要关心图片边界之外的东西。因为,如果使用的技术需要关注图片边界之外的区域,我们需要插入一些信息。我们赋予每个技术一个增强因子,以增强数据集。
但是要注意,并不是所有的模型都适合进行数据集扩展的,比如,人脸识别,一般不能进行水平翻转。
翻转:对图片进行水平或是垂直翻转
旋转,这个操作,需要注意一个关键问题,在旋转之后,图像纬度信息可能不会保留。如果是正方形,图像旋转90度后尺寸会被保存,但是,如果仅仅旋转一个小角度,将会改变图像的尺寸。
裁剪,随机从原始图中采样一部分,然后调整为原始大小,又称作随机裁剪。
平移,将图像沿X或Y方向(或同时沿着两个方向)移动,方便起见,可假设边界以外是黑色的,也同步移动,这一方法非常有用,因为大多数对象有可能分布在图像的任何地方,这迫使你的卷积网络需要看到所有的地方。
高斯噪声,过拟合通常会发生在神经网络学习高频特性时(及非常频繁出现的无意义模式),而学习这些特征对模型没什么帮助。解决办法其一是采用零均值高斯噪声,在所有频率产生数据点,使得高频特征失真,减弱对模型的影响。但也意味着低频部分(所关心的特征)也会收到影响,但网络本身可以通过学习来克服,因此,事实证明,通过增加适当的噪声能够有效提升网络学习能力。还有个相对比较low的办法,采用添加椒盐噪声的方式,以随机的白色和黑色的像素点呈现并铺满整个图片,效果类似高斯噪声,但是效果相对较弱。下图分别为:原图,高斯噪声,椒盐噪声。
当然,还有很多数据增广的技术,此处就不一一介绍了,小编就充当一个引路人吧,如果读者朋友们有兴趣的话,可自行搜索下关于数据增广的小知识,很有意思的一种提高神经网络训练效果的方法。
到此,本期浅谈深度学习中的数据增广就结束了,希望通过本期的介绍,大家对于数据增广有了一定的认识,从此,我们再也不怕粘糖葫芦没有糖了!现在,我们有好多好多的糖可以用了,哈哈哈哈
【摘自恩智浦MCU加油站】
添加极客助手微信,加入技术交流群
长按,扫码,关注公众号