3.6 图像增强
在前一节中,你创建了一个分类模型,并在一个相对较小的数据集上进行训练。因此,在分类一些之前没有见过的图像时,你很快会遇到问题。例如,将一个女人误分类为一匹马,只因为训练集并不包含任何那样姿势的人的照片。
解决这种问题的一个方法是图像增强。这项技术的背后原理是,当TensorFlow加载数据时,它可以创建更多新的数据,通过使用一系列转换来修改已有数据。如图3-11所示,虽然数据集中没有任何看起来像右边女人的图像,但是左边的图像有点类似。
图3-11:数据集的相似性
因此如果你在训练过程中将左边的图像放大(如图3-12所示),则可以提高模型能够正确将右边图像分类为人的概率。
图3-12:放大训练集数据
使用相似的方法,你可以通过一系列其他转换来扩展训练集,包括:
- 旋转
- 水平平移
- 竖直平移
- 剪切
- 缩放
- 翻转
由于你一直使用ImageDataGenerator
来加载图像,因此你已经见过它进行换了—当它归一化图像时,看起来像这样:
其他的转换也可以在ImageDataGenerator
中很容易地找到。例如以下代码:
除了调整图像大小来对它进行归一化,你还可以执行下面的操作:
- 将每张图像随机向左或向右旋转最多40度
- 将图像向上或向下平移20%
- 剪切图像到最多20%
- 缩放图像到最多20%
- 随机水平或竖直翻转图像
- 在移动或剪切之后,使用最近的邻居像素来填充任何丢失的像素
当你使用这些参数重新训练时,首先注意到的是训练的时间变长了,这是因为所有这些图像处理的过程。同样,你的模型准确率也许没有以前高,这是因为它之前在一个非常统一的数据上面过拟合了。
在我的例子中,当使用这些增强进行训练时,经过15个回合,我的准确率从99%降到了85%,而验证集提升到了89%(这意味着模型有点欠拟合,因此参数可以被稍微修改一下)。
之前图3-9中被误分类的图像怎么样了呢?这次,它可以被正确分类了。多亏了图像增强,训练集现在有了足够的覆盖率,让模型可以理解那一张图像也是一个人(见图3-13)。这仅仅是一个数据点,可能无法代表真实数据的结果,但是这是朝着正确方向的一小步。
图3-13:被缩放的女人现在可以被正确分类了
可以看到,即使只是使用像Horses or Humans这样相对较小的数据集,你也可以创建一个非常不错的分类器。有了更大的数据集,你可以更进一步。另一种提高模型的方法是使用在其他地方已经学到的特征。许多研究者使用了大量资源(几百万张图像)和巨大的模型来训练了几千个类别,他们已经分享了他们的模型,并且使用了一个叫作迁移学习的概念,你可以使用这些模型学到的特征,并将它们应用到你的数据中。