图像数据不足时,你可以试试数据扩充

2019-07-01 11:39:29 浏览数 (1)

在EZDL到底怎样,试试看…中,我们谈到百度的在线AI设计工具EasyDL不需要调整任何参数,对于用户而言就是一个吃数据的黑盒子。也许系统会选择最优的参数和算法来训练出一个好的模型,如果此时准确率仍然达不到我们的需求,我们是否就完全束手无策了呢?

也不完全是。我们知道,丰富的高质量数据是训练出好的机器学习模型的关键。但是良好的数据不会从天上掉下来,靠人工收集数据是一个非常费时费力的工作,关键是,在特定的领域,有效的数据很难获取,比如医学影像数据。

这个时候,采用一些程序手段扩充数据集就成为了解决数据缺乏的一种方法,它可以将训练集的大小增加10倍或更多。更让人鼓舞的是,这样训练出的模型通常会更加健壮,减少过拟合。

数据扩充(Data Augmentation) 是指根据一些先验知识,在保持特定信息的前提下,对原始数据进行适当变换以达到扩充数据集的效果。这个其实很好理解,一张猫的图片,对其进行旋转、缩放等变换,我们人类还是能辨认出。具体到图像分类任务中,在保持图像类别不变的前提下,可以对训练集中的每幅图像进行一下变换:

  1. 一定程度内的随机旋转、平移、缩放、裁剪、填充、左右翻转等,这些变换对应着同一个目标在不同角度的观察结果。
  2. 对图像中的像素添加噪声扰动,比如椒盐噪声、高斯白噪声等。
  3. 颜色变换。
  4. 改变图像的亮度、清晰度、对比度、锐度等。

如果你对图像处理并不是那么熟悉,不用慌张,对于万能的python而言,只要有需求,总有人提供程序库,github上就有一个imgaug的python库,下面展示一些图像扩充的样例:

通过数据扩充,我们可以将原来的数据集规模扩大64倍。

这个imgaug库,功能相当强大,文档也还算比较全。如果你觉得引入第三方库太麻烦,也可以考虑keras提供的数据扩充API。

keras图像扩充API

与Keras的其他部分一样,图像增强API简单而强大。

Keras提供了ImageDataGenerator类,提供如下功能:

  • 样本标准化
  • 功能标准化
  • ZCA增白
  • 随机旋转,移位,剪切和翻转。
  • 尺寸重组
  • 将增强的图像保存到磁盘。

以下代码创建ImageDataGenerator

代码语言:javascript复制
datagen = ImageDataGenerator()

API不是在内存中对整个图像数据集执行操作,而是训练模型的迭代过程中实时创建增强的图像数据,这可以减少内存开销,但会增加一些额外的训练时间成本。

创建并配置ImageDataGenerator后,必须将其应用到数据集上,这将计算实际执行图像数据转换所需的信息,该操作通过调用数据生成器上的fit()函数并将其传递给训练数据集来完成。

代码语言:javascript复制
datagen.fit(train)

数据生成器本身实际上是一个迭代器,在请求时返回批量的图像样本。我们可以通过调用flow()函数来配置批量大小并获取批量图像。

代码语言:javascript复制
X_batch, y_batch = datagen.flow(train, train, batch_size=32)

最后,我们可以使用数据生成器,必须调用fit_generator()函数并传入数据生成器和每个轮次的样本数以及要训练的轮次总数,而不是在我们的模型上调用fit()函数。

代码语言:javascript复制
fit_generator(datagen, samples_per_epoch=len(train), epochs=100)

更多关于keras图像扩充API的信息,还请参考官方文档:https://keras.io/preprocessing/image/。

参考
  1. 百面机器学习 - 算法工程师带你去面试,诸葛越主编,人民邮电出版社
  2. https://keras.io/preprocessing/image/
  3. https://github.com/aleju/imgaug
  4. https://machinelearningmastery.com/image-augmentation-deep-learning-keras/
往期回顾

提高模型性能,你可以尝试这几招…

百度推出EZDL,编程小白也可训练AI

EZDL到底怎样,试试看…

0 人点赞