在EZDL到底怎样,试试看…中,我们谈到百度的在线AI设计工具EasyDL不需要调整任何参数,对于用户而言就是一个吃数据的黑盒子。也许系统会选择最优的参数和算法来训练出一个好的模型,如果此时准确率仍然达不到我们的需求,我们是否就完全束手无策了呢?
也不完全是。我们知道,丰富的高质量数据是训练出好的机器学习模型的关键。但是良好的数据不会从天上掉下来,靠人工收集数据是一个非常费时费力的工作,关键是,在特定的领域,有效的数据很难获取,比如医学影像数据。
这个时候,采用一些程序手段扩充数据集就成为了解决数据缺乏的一种方法,它可以将训练集的大小增加10倍或更多。更让人鼓舞的是,这样训练出的模型通常会更加健壮,减少过拟合。
数据扩充(Data Augmentation) 是指根据一些先验知识,在保持特定信息的前提下,对原始数据进行适当变换以达到扩充数据集的效果。这个其实很好理解,一张猫的图片,对其进行旋转、缩放等变换,我们人类还是能辨认出。具体到图像分类任务中,在保持图像类别不变的前提下,可以对训练集中的每幅图像进行一下变换:
- 一定程度内的随机旋转、平移、缩放、裁剪、填充、左右翻转等,这些变换对应着同一个目标在不同角度的观察结果。
- 对图像中的像素添加噪声扰动,比如椒盐噪声、高斯白噪声等。
- 颜色变换。
- 改变图像的亮度、清晰度、对比度、锐度等。
如果你对图像处理并不是那么熟悉,不用慌张,对于万能的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/。
参考
- 百面机器学习 - 算法工程师带你去面试,诸葛越主编,人民邮电出版社
- https://keras.io/preprocessing/image/
- https://github.com/aleju/imgaug
- https://machinelearningmastery.com/image-augmentation-deep-learning-keras/
往期回顾
提高模型性能,你可以尝试这几招…
百度推出EZDL,编程小白也可训练AI
EZDL到底怎样,试试看…