机器学习实战:模型构建与应用
上QQ阅读APP看书,第一时间看更新

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这样相对较小的数据集,你也可以创建一个非常不错的分类器。有了更大的数据集,你可以更进一步。另一种提高模型的方法是使用在其他地方已经学到的特征。许多研究者使用了大量资源(几百万张图像)和巨大的模型来训练了几千个类别,他们已经分享了他们的模型,并且使用了一个叫作迁移学习的概念,你可以使用这些模型学到的特征,并将它们应用到你的数据中。