跳到主要内容

神经网络与数据增强

深度学习中的数据增强

为什么需要数据增强 :
一般而言,比较成功的神经网络需要大量的参数,许许多多的神经网路的参数都是数以百万计,而使得这些参数可以正确工作则需要大量的数据进行训练,而实际情况中数据并没有我们想象中的那么多。
数据增强的作用 :

  1. 增加训练的数据量,提高模型的泛化能力
  2. 增加噪声数据,提升模型的鲁棒性

如何获得大量的数据 :
一种方法是获得新的数据,这种方法比较麻烦,需要大量的成本,而第二种方法则是对数据进行增强,即利用已有的数据比如翻转、平移或旋转,创造出更多的数据,来使得神经网络具有更好的泛化效果。
数据增强的分类 :
数据增强可以分为两类,一类是离线增强,一类是在线增强。

  1. 离线增强 : 直接对数据集进行处理,数据的数目会变成增强因子 x 原数据集的数目 ,这种方法常常用于数据集很小的时候
  2. 在线增强 : 这种增强的方法用于,获得 batch 数据之后,然后对这个 batch 的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用 GPU 优化计算。

常用的数据增强技术 :
首先定义增强因子 : 指的是数据做离线增强之后增长的倍数。
1 翻转 :增强因子 2 或 3  
数据翻转是一种常用的数据增强方法,这种方法不同于旋转 180 这种方法是做一种类似于镜面的翻折。  2 旋转 : 增强因子 2 到 4  
旋转就是顺时针或者逆时针的旋转,注意在旋转的时候, 最好旋转 90 - 180 度否则会出现尺度的问题  3 缩放 :增强因子任意  
图像可以被放大或缩小。放大时,放大后的图像尺寸会大于原始尺寸。大多数图像处理架构会按照原始尺寸对放大后的图像 进行裁切。我们将在下一章节讨论图像缩小,因为图像缩小会减小图像尺寸,这使我们不得不对图像边界之外的东西做出假设。下面是图像缩放的例子。   4 裁剪 :增强因子任意  
这种方法更流行的叫法是随机裁剪,我们随机从图像中选择一部分,然后降这部分图像裁剪出来,然后调整为原图像的大小  5 平移 : 增强因子任意  
平移是将图像沿着 x 或者 y 方向 (或者两个方向) 移动。我们在平移的时候需对背景进行假设,比如说假设为黑色等等,因为平移的时候有一部分图像是空的,由于图片中的物体可能出现在任意的位置,所以说平移增强方法十分有用。  6 添加噪声 :增强因子任意 看噪声的类型
过拟合通常发生在神经网络学习高频特征的时候 (因为低频特征神经网络很容易就可以学到,而高频特征只有在最后的时候才可以学到) 而这些特征对于神经网络所做的任务可能没有帮助,而且会对低频特征产生影响,为了消除高频特征我们随机加入噪声数据来消除这些特征。

案例

要解决的问题

依然使用Cat vs Dog数据集,数据集详情请参考https://www.yuque.com/suanpan_doc/public/dx8z5f

解决方案

在算盘的项目模板中,已经创建了一个简单的流程可以参考。
在项目模板中,双击keras教材案例中的神经网络与数据增强: image.png以创建出以下模板,模板中的组件可以在深度学习的pytorch的分类中找到:image.png

模板

可以看出整个模板分了五块:

  • 模型建立——需要有一个输入层,注意填写接收图片的大小与通道数,后面连接卷积层-RELU激活函数-池化层-全连接层等。注意该网络为了防止过拟合增加了dropout节点。
  • 数据载入——可以使用已经制作好的数据集组件Cats-vs-Dogs数据集组件,组件会直接将数据分为训练集,验证集和测试集,后面可以直接连接图片文件夹数据转换组件。
  • 模型训练——数据载入设置Batch Size,选择RMSprop作为参数寻优器,模型训练节点设置epoch数与Loss Function,最终生成训练好的模型文件
  • 预测评估——预测节点接收测试集数据与训练好的模型进行训练,生成预测图片文件夹与CSV文件(包含每个图片的index,真实值与预测值),CSV文件可以作为多分类评估的输入进行模型评估
  • 图片可视化——由于每张图片的大小不等,需要先将图片比例缩放之后再进行剪裁,案例中将图片变换为1501503的数据格式。随机仿射变换是数据增强节点,通过这个函数可以将图片进行随机翻转等操作。Tensor转图片可以将生成好的Tensor数据转换为图片保存,最终生成在转换组合组件的输出节点中。

这样就实现了数据增强的神经网络模型,你可以对其中的网络结构进行重新编辑,验证你的算法!