zoukankan      html  css  js  c++  java
  • 数据增强

    1 什么是数据增强?

    来自 <https://www.infoq.cn/article/kyXx3sRKNsdFgqapv2Gw?utm_source=rss&utm_medium=article>

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

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

     每张图对于网络来说都是不同的输入,加上原图就将数据扩充到原来的10倍。假如我们输入网络的图片的

    分辨率大小是256×256,若采用随机裁剪成224×224的方式,那么一张图最多可以产生32×32张不同的图,

    数据量扩充将近1000倍。虽然许多的图相似度太高,实际的效果并不等价,但仅仅是这样简单的一个操作,效果已经非凡了。

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

     数据增强可以分为,有监督的数据增强和无监督的数据增强方法。其中有监督的数据增强又可以分为单样本数据增强

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

    2 有监督的数据增强

    有监督数据增强,即采用预设的数据变换规则,在已有数据的基础上进行数据的扩增,包含单样本数据增强和多样本

    数据增强,其中单样本又包括几何操作类,颜色变换类。

     2.1. 单样本数据增强

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

     (1) 几何变换类

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

      

     变形缩放:

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

     翻转和旋转不改变图像的大小,而裁剪会改变图像的大小。通常在训练的时候会采用随机裁剪的方法,在测试的时候选择裁剪中间部分

    或者不裁剪。值得注意的是,在一些竞赛中进行模型测试时,一般都是裁剪输入的多个版本然后将结果进行融合,对预测的改进效果非常明显。

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

    很多的时候,网络的训练输入大小是固定的,但是数据集中的图像却大小不一,此时就可以选择上面的裁剪成固定大小输入或者缩放到网络

    的输入大小的方案,后者就会产生失真,通常效果比前者差。

    (2) 颜色变换类

    上面的几何变换类操作,没有改变图像本身的内容,它可能是选择了图像的一部分或者对像素进行了重分布。如果要改变图像本身

    的内容,就属于颜色变换类的数据增强了,常见的包括噪声、模糊、颜色变换、擦除、填充等等。

    基于噪声的数据增强就是在原来的图片的基础上,随机叠加一些噪声,最常见的做法就是高斯噪声。更复杂一点的就是在面积大小

    可选定、位置随机的矩形区域上丢弃像素产生黑色矩形块,从而产生一些彩色噪声,以 Coarse Dropout 方法为代表,甚至还可以对

    图片上随机选取一块区域并擦除图像信息。

                           添加 Coarse Dropout 噪声

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

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

    https://github.com/aleju/imgaug

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

    4 思考

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

    (1) 权重衰减,dropout,stochastic depth 等方法,是专门设计来限制模型的有效容量的,用于减少过拟合,

    这一类是显式的正则化方法。研究表明这一类方法可以提高泛化能力,但并非必要,且能力有限,而且参数高度依赖于网络结构等因素。

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

  • 相关阅读:
    IDEA调试快捷键
    视频预览
    文件上传:简单的demo
    Java 运行时优化
    Java 类加载
    Java StringTable
    Java 为什么不用Vector
    C++ 查找函数
    JVM 垃圾回收
    JVM 直接内存
  • 原文地址:https://www.cnblogs.com/Lazycat1206/p/11943410.html
Copyright © 2011-2022 走看看