深度学习实战:基于TensorFlow 2和Keras(原书第2版)
上QQ阅读APP看书,第一时间看更新

4.4 用于大规模图像识别的超深度卷积网络

2014年,K. Simonyan和A. Zisserman[4]在论文“Very Deep Convolutional Networks for Large-Scale Image Recognition”中提出了一种对图像识别的有趣贡献。该论文表明“通过将深度增加到16~19权重层,可以实现对现有技术配置的重大改进”。文中一个表示为D或VGG-16的模型具有16个深层。

一种基于Java Caffe(http://caffe.berkeleyvision.org/)的实现在ImageNet ILSVRC-2012(http://image-net.org/challenges/LSVRC/2012/)数据集上训练模型,该数据集包涵1000个类别的图像,并分为三个集合:训练集(130万张图像)、验证集(50 000张图像)和测试集(100 000张图像)。每个图像均为3个通道(224×224)。该模型在ILSVRC-2012-val上获得了7.5%的top-5错误率,在ILSVRC-2012-test上获得了7.4%的top-5错误率。

援引自ImageNet网站,“本次比赛是为了数据检索和基于大型手工标记ImageNet数据集(1000万张带标签的图片,描绘了1万多个对象类别)的子集训练的自动标注而进行的图像内容评估。测试图像将不带有任何初始标注,也不会出现分段或标签,并且算法要产生能指出哪些物体存在于图像中的标签。”

在Caffe中实现的模型学习的权重已在tf.Keras中直接转换(https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3),使用时可通过将其预加载到指定tf.Keras模型,具体实现如下(论文中作了描述):

121-01
122-01

我们已经实现了VGG16。接下来将使用它。

4.4.1 基于VGG16神经网络识别猫

现在让我们测试一张含有一只猫的图像。

122-02

注意,我们将用到预定义权重:

122-03

如图4-19所示,当代码执行后,返回类别285,该类别与埃及猫(Egyptian cat)对应(https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a):

123-01

图4-19 使用VGG16 Net的图像识别结果

令人赞叹,不是吗?我们的VGG-16网络可以成功识别猫的图像!这是深度学习的第一步。距论文[4]仅仅五年时间,但却改变了游戏规则。

4.4.2 使用tf.keras内置的VGG16 Net模块

tf.Keras应用是预构建和预训练后的深度学习模型。当实例化模型时,权重会自动下载并存储在~/.keras/models/下。使用内置代码非常容易:

123-02

现在,让我们测试一列火车。

124-01

如果运行代码,则结果为820,这正是“蒸汽火车”的图像网络代码。很重要的一点是支撑所有其他类别的可能性都很弱,如下图所示。

124-02

注意,VGG16只是tf.Keras预构建的模块之一。可在线获得预训练模型的完整列表(https://www.tensorflow.org/api_docs/python/tf/keras/applications)。

4.4.3 复用预建深度学习模型以提取特征

一个非常简单的想法是使用VGG16(更具一般性的是DCNN)进行特征提取。以下代码通过从某个特定层提取特征来实现该想法。注意,我们需要切换到Functional API,因为Sequential模型仅接受图层输入:

124-03

你可能会好奇为什么要从DCNN的中间层提取这些特征。原因是随着深度网络学习图像分类,各层都将学习如何标识特征,这些特征会用于完成最终的分类。较低的层标识较低阶的特征(例如颜色和边缘),而较高的层将这些较低阶的特征组合为较高阶的特征(例如形状或对象)。因此,中间层具有从图像中提取重要特征的能力,并且这些特征更有可能有助于不同种类的分类。

这样做有很多优点。首先,我们可以依靠公开提供的大规模训练,并将这种学习转移到新颖的领域。其次,我们可以为昂贵的大型训练节省时间。第三,即使我们没有针对该领域的大量训练示例,也可以提供合理的解决方案。我们也可以很好地应对即将开始的任务,建立一个良好的网络雏形,而不是猜测它。

至此,我们将对VGG-16 CNN作个总结概述,它是本章定义的最后一个深度学习模型。在下一章中,你将看到更多CNN示例。