今天的分享是关于如何使用 keras 的 ImageDataGenerator类 来进行数据增强处理(data augmentation)。
通过这篇博客你会了解 :
什么是数据增强?
为什么我们要使用 数据增强 ?
数据增强的几种常用类型。
什么情况下可以使用, 什么情况下不能使用 ?
1 什么是数据增强
如果你使用过 keras , 那么首先请你来看一下面的这个问题:
以下的选项当中, 哪一个是 增强处理(data augmentation)这项操作所做的 ?
- 添加更多的训练数据(training data)
- 替换原始的训练数据
- 二者都有涉及
- I don’t know
你默默地选择了哪一项呢 ? ? ?
这篇博文的原作者 Adrian Rosebrock 曾经在它的 Twitter 中做过相同的调查,调查的结果如下:
只有 5% 的人选择了 “ 正确 ” 的答案 B , (这里的正确仅仅是存在于使用 keras 的 ImageDataGenerator class 来进行
数据增强处理 的范围内, 如果你用的不是keras 的I..D..G..类, 那可能 B 项就算不是正确的了, 但是在今天的这篇博客
当中,我们仅仅针对 keras 的 ImageDataGenerator 类。)其实它的这个问题并没有表达清楚, 如果只是单讲数据增强,
那么前三个选项都是正确的。 好了, 不要纠结于这个小问题了,它的出现只不过是用于引出我们今天的出题。
到底应当如何来定义 data augment , 要根据你的使用环境来综合考虑。
augment 这个词有 make something ' great ' , or ' increase ' something 的意思,
什么是广义上的数据增强呢?
————它是一种 从给定的原始数据当中 通过一些图像处理的方法 来生成“ 新的 ”训练数据的技巧(techniques), 但是要注意的是,生成后的图像要和原图像的 class label 是相同的。
为什么要使用数据增强?
——我们使用数据增强的这个技巧 可以 增强模型的泛化能力(the generalizability of the model.)
并且 Given that our network is constantly seeing new, slightly modified versions of the input data, the network is able to learn more robust features.
注意 : 在测试模型的时候我们不针对 test data 使用数据增强, 在绝大多数的时候,数据增强的使用是可以增加 测试集 在
网络模型上的准确度的; 但是这也许会在你的训练阶段 导致 有轻微的在精度上的下降。
针对数据 :
下面的两张图是我们随机创建的一些样本点, 左侧的数据服从正态分布, 右侧的数据使我们为这个分布添加了一些微小的扰动(jitter), 这种类型的数据增强的应用 就能够有效的 增加我们网络模型的 泛化能力(the generalizability of our networks) 。 |
基于 类似于左侧图像的 如此标准的数据分布 来训练我们的 machine learning model , 也许能够精确的进行建模,
但是这种模型的泛化能力实在是令人堪忧的。 况且 在真实的世界当中 这种如此标注的 数据分布 是并不多见的,或者说是并不存在的。
为了增强我们分类器的泛化能力, 我们人为的为其增加一些 大小为e的 随机扰动( randomly jitter ),就有了右侧的分布。
它总体上也是个正态分布, 只不过没有左侧的那么标准罢了。
针对图像 :
如果换做是将图像作为输入, 那么应用数据增强 就会生成如下的“ 新图像 ” ,
这种变换只不过是增强方法的一种 , we can obtain augmented data from the original images by applying simple geometric transforms, such as random:
- Translations
- Rotations
- Changes in scale
- Shearing
- Horizontal (and in some cases, vertical) flips
三种常见的数据增强 类型
常见的数据增强方式大致可以分为如下的几种:
1. Dataset generation and data expansion via data augmentation (less common)
(通过数据增强来扩展数据集)
2. In-place/on-the-fly data augmentation (most common)
(在训练的时候给模型 输入随机变化后的图像, 以达到数据增强的目的)
3. Combining dataset generation and in-place augmentation
(两者的结合)
Type #1: Dataset generation and expanding an existing dataset (less common)
第一种类型是 使用图像增强方式来扩充我们现有的数据集, 但这并不常用, 流程如下 :
这种形式的数据增强 我们一般称其为 dataset generation or dataset expansion.
众所周知, 无论是 machine learning 还是 deep learning 都是需要大量的数据集来训练模型的, 但是