数据扩增的概念
数据扩增是指不实际增加原始数据,只是对原始数据做一些变换,从而创造出更多的数据。
数据扩增的目的
数据扩增的目的是增加数据量、丰富数据多样性、提高模型的泛化能力。
数据扩增的基本原则
- 不能引入无关的数据
- 扩增总是基于先验知识的,对于不同的任务和场景,数据扩增的策略也会不同。
- 扩增后的标签保持不变
数据扩增的方法
数据扩增方法可分为单样本扩增和多样本扩增
单样本扩增包括:图像翻转、图像旋转、图像扭曲、图像仿射变换、图像缩放、图像压缩、图像随机crop、图像随机padding、图像对比度调整、亮度调整、色度调整、饱和度调整、色彩抖动、添加噪声、图像模糊、图像区域随机擦除、风格转换、生成对抗网络生成等。
多样本扩增包括:SamplePairing和mixup,二者思路很相近
SamplePairing的扩增如下图所示:
非常简单直观,两幅图像分别做基本扩增后,取均值做融合,但是标签还是A的标签
mixup可以说是对SamplePairing的改进,将均值融合扩展成随机线性融合,标签也相应的做线性插值。
SamplePairing和mixup与传统扩增方法比,生成的图像近乎是一副不合理的图像,其标签取的似乎也很难理解,但是效果非常好。其实这样的融合操作与其说是数据扩增,不如说是一种正则化方法,只是是从数据的角度去做正则。可以理解为模型不光要能正确预测f(Xa)和f(Xb),同时还要有预测下式的能力。
显然只有当f是线性函数时才成立。我们知道学到的模型很复杂,且网络越深越复杂、非线性越多越复杂,越复杂的网络越容易过拟合,而mixup就是希望模型尽可能的简单,降低模型复杂度,避免模型过拟合。
最后:
数据扩增的方法很多,但并不是所有的方法都要一股脑的使用,这需要结合应用场景的实际情况,增加不合理的扩增数据或实际不可能发生的扩增数据,对模型训练都是无益的。
附几种常见网络数据扩增及预处理方案(主要来自tensorflow官网实现代码)
cifarnet数据预处理
转成float型、padding、随机crop、随机左右翻转、随机色彩变换、归一化
lenet数据预处理
转成float型、padding、随机crop、resize、归一化
Inception数据预处理
转成float型、padding、随机crop、缩放、随机左右翻转、随机色彩变换、归一化
vgg数据预处理
随机缩放、随机crop、转成float型、随机左右翻转、去均值
SSD数据预处理
图像随机旋转、随机padding、转成float型、随机crop、随机色彩变换、颜色随机翻转、去均值
YOLO数据预处理
随机贴图、随机缩放、随机色彩变换、随机左右翻转、随机crop、随机平移
deeplab数据预处理
转成float型、去均值、图像左右翻转、随机padding、随机crop、随机缩放