20.16 通过图像增强来改善卷积神经网络的性能
问题描述
改善卷积神经网络的性能。
解决方案
为了得到更好的结果,对图像进行预处理,并使用ImageDataGenerator提前增强数据:

讨论
先给大家道个歉,因为这个解决方案的代码不能直接运行,原因是你们没有这个图像文件夹。但是,你有一个图像文件夹,而且你想对里面的图像进行处理,这样的情形却是很常见的。因此,这个技术可以很容易地应用到你自己的图像上。
改善卷积神经网络性能的一个方法是预处理图像。我们在第8章中已经
讨论了一些技巧,尽管如此,Keras的ImageDataGenerator仍然值得强调
一下,它包含一些基础的预处理技术。比如,我们的解决方案中使用了featurewise_center=True来标准化整个数据集中的像素。
第二个改善卷积神经网络性能的技术是加入噪声。神经网络有一个有趣的特征,就是在数据中加入噪声后,网络的性能反而会变好。这是因为添加的噪声可以让神经网络对真实世界的噪声变得更具鲁棒性,并且能防止神经网络过拟合。
当对图像使用卷积神经网络进行训练的时候,可以通过多种方法随机转换图像,以实现向样本数据中加入噪声,比如镜像翻转图像,或者局部放大图像。即使很小的变化,也可以显著改善模型的性能。我们可以使用同样的ImageDataGenerator类实施这些转换。Keras文档(参见本节末尾的“延伸阅读”)列出了所有可用的转换方式。我们的解决方案就是一个很好的例子,其中包含图像的随机缩放、平移、翻转和旋转。
有一点很重要,flow_from_directory的输出是一个Python的生成器对象。这是因为大多数情况下我们希望在需要时,即当图像被输入神经网络中进行训练的时候,才进行处理。如果想在训练之前先处理所有图像,可以简单地遍历生成器。
最后,因为augment_images是一个生成器,所以在训练神经网络时,必须使用fit_generator而不是fit。举个例子:

本节所用的全部原始图片都可以在GitHub(http://bit.ly/2FvrVVq)上下载。
延伸阅读
● Keras文档:图像预处理(https://keras.io/preprocessing/image/)



本书评论