ITPub博客

首页 > 人工智能 > 人工智能 > 教程:使用迁移学习来解决图像问题!

教程:使用迁移学习来解决图像问题!

原创 人工智能 作者:李佳惠 时间:2018-11-06 12:02:19 0 删除 编辑

本文将教你如何使用迁移学习来解决图像分类问题。使用Keras及其预训练模型的实际示例用于演示目的。

教程:使用迁移学习来解决图像问题!

Chris Ried在Unsplash上的代码之美

深度学习(LeCun等,2015)正在迅速成为人工智能应用的关键工具。例如,在计算机视觉、自然语言处理和语音识别等领域,深度学习已经产生了显著的成果。因此,人们对深度学习的兴趣越来越大。

深度学习擅长的问题之一是图像分类(Rawat&Wang 2017)。图像分类的目标是根据一组可能的类别对特定图片进行分类。图像分类的一个典型例子是在一组图片中识别猫和狗(例如Dogs vs. Cats Kaggle Competition)。

https://www.kaggle.com/c/dogs-vs-cats

从深度学习的角度来看,图像分类问题可以通过迁移学习来解决。实际上,图像分类中的几个最先进的结果基于迁移学习解决方案(Krizhevsky等2012,Simonyan和Zisserman 2014,He等 2016)。 Pan&Yang(2010)提供了关于迁移学习的综合评论。

本文介绍如何实现图像分类问题的迁移学习解决方案。本文中提出的实现基于Keras(Chollet 2015),并使用Python编程语言。完成此实施后,你将能够快速轻松地解决任何图像分类问题。

本篇文章将按以下方式进行组织:

  1. 迁移学习

  2. 卷积神经网络

  3. 重新利用预先训练的模型

  4. 迁移学习过程

  5. 深度卷积神经网络之上的分类器

  6. 实例

  7. 总结

1. 迁移学习

迁移学习是计算机视觉中的一种流行方法,因为它允许我们以节省时间的方式建立精确的模型(Rawat&Wang 2017)。通过迁移学习,你可以从解决不同问题时学到的模式开始,而不是从头开始学习。这样你可以利用以前的学习,避免从头开始。可以将它作为沙特尔在著作"站在巨人的肩膀上"的深度学习一个版本。

在计算机视觉中,通常是通过使用预先训练的模型来表达迁移学习。预训练模型是在大型基准数据集上训练的模型,用于解决类似于我们想要解决的问题。因此,由于训练这些模型的计算成本,通常的做法是从已发表的文献(例如VGG,Inception,MobileNet)导入和使用模型。Canziani et al. (2016)提出了使用ImageNet(Deng et al.2009)挑战的数据全面回顾预训练模型在计算机视觉问题上的表现。

2.卷积神经网络

在迁移学习中使用的几种预训练模型基于大型卷积神经网络(CNN)(Voulodimos et al. 2018)。总的来说,卷积神经网络(CNN)在各种计算机视觉任务中表现出色(Bengio 2009)。它的高性能和易于训练是推动卷积神经网络(CNN)在过去几年中普及的两个主要因素。

典型的卷积神经网络(CNN)有两部分:

(1)卷积基(convolutional base),由一堆卷积和汇集层组成。卷积基的主要目标是从图像生成特征。有关卷积和池化层的直观解释,请参阅Chollet(2017)。

(2)分类器(Classifier),通常由完全连接的层组成。分类器的主要目标是基于检测到的特征对图像进行分类。完全连接的层是其神经元与前一层中的所有激活具有完全连接的层。

图1显示了基于卷积神经网络(CNN)的模型的体系结构。请注意,这是一个简化版本,符合本文的目的。事实上,这种模型的架构比我们在此建议的更复杂。 

教程:使用迁移学习来解决图像问题!

图1.基于卷积神经网络(CNN)模型的体系结构

这些深度学习模型的一个重要方面是,它们可以自动学习分层特征表示。这意味着第一层计算的特征是通用的,可以在不同的问题域中重用,而最后一层计算的特征是特定的,取决于所选的数据集和任务。根据Yosinski等人的说法,"如果第一层特征是通用的,最后一层特征是特定的,那么在网络的某个地方必须有从通用特征到特定特征的过渡。因此,卷积神经网络(CNN)的卷积基数,尤其是其较低层(靠近输入的那些)所指的是通用特征,而分类器部分和卷积基础的一些较高层指的是特定特征。

3.重新利用预先训练的模型

当你根据自己的需要重新利用预先训练的模型时,首先要删除原始分类器,然后添加适合自己目的的新分类器,最后必须根据三种策略之一对模型进行微调:

(1)训练整个模型。在这种情况下,使用预先训练的模型的体系结构,并根据你的数据集进行训练。你要从头开始学习模型,因此需要一个大型数据集(以及大量的计算能力)。

(2)训练一些层,让其他层冻结。你还记得,较低层是指通用特征(与问题无关),而较高层是指特定特征(依赖于问题)。在这里,我们通过选择想要调整网络权重的程度(冻结层在训练期间不会改变)来实现这种二分法。通常,如果你有一个小型数据集和大量参数,你将保留更多层冻结以避免过度拟合。相比之下,如果数据集很大,并且参数数量很少,你可以通过训练更多层来完成新任务来改进模型,因为过度拟合不是问题。

(3)冻结卷积基。这种情况对应于训练/冻结权衡的极端情况。主要思想是将卷积基数保持其原始形式,然后使用其输出来提供分类器。你正在使用预先训练的模型作为固定特征提取机制,如果你的计算能力不足,或者数据集很小,或者预先训练的模型解决的问题类似于你想要解决的问题的话。

图2以示意图的方式介绍了这三种策略

教程:使用迁移学习来解决图像问题!


图2微调策略与策略3不同,策略1和策略2要求你在卷积部分中使用学习率。学习率是一个超参数,可以控制你调整网络权重的程度。当你使用基于卷积神经网络(CNN)的预训练模型时,使用较小的学习率是明智的,因为高学习率会增加丢失先前知识的风险。假设预训练模型训练有素,这是一个公平的假设,保持较小的学习率将确保你不会过早和过多地扭曲卷积神经网络(CNN)权重。

4.迁移学习过程

从实际角度来看,整个迁移学习过程可归纳如下:

(1)选择预先训练的模型。从广泛的预训练模型中,你可以选择一个适合自己的问题的模型。例如,如果你正在使用Keras,可以立即访问一组模型,例如VGG(Simonyan和Zisserman 2014),InceptionV3(Szegedy等2015)和ResNet5(He等2015)。在这里,你可以看到Keras上的所有类型。

https://keras.io/applications/

(2)根据大小相似度矩阵对问题进行分类。在图3中,你可以使用"The Matrix"来控制自己的选择。考虑到数据集的大小及其与预训练模型训练的数据集的相似性,此矩阵对你的计算机视觉问题进行分类。根据经验,如果每个类的图像少于1000个,请考虑你的数据集很小。关于数据集相似性,让这种常识占上风。例如,如果你的任务是识别猫和狗,ImageNet将是一个类似的数据集,因为它拥有猫和狗的图像。但是,如果你的任务是识别癌细胞,则不能将ImageNet视为类似的数据集。

(3)微调模型。在这里,你可以使用尺寸相似度矩阵来指导自己的选择,然后参考我们之前提到的关于重新利用预训练模型的三个选项。图4提供了随后文本的可视化摘要。

  • 象限1.大型数据集,但与预先训练的模型数据集不同。这种情况将引导你进入策略1,由于你拥有大型数据集,因此可以从头开始训练模型,并执行想要的任何操作。尽管数据集不相似,但在实践中,使用其架构和权重从预训练模型初始化模型仍然是有用的。

  • 象限2。大型数据集,与预训练模型的数据集类似。在这里,任何选项都有效。可能最有效的选择是策略2。由于我们有一个大型数据集,过度拟合不应成为问题,因此我们可以尽可能多地学习。但是,由于数据集相似,我们可以通过利用以前的知识来避免大量的训练工作。因此,应该足以训练分类器和卷积基的顶层。

  • 象限3。小型数据集,与预训练模型的数据集不同。这是计算机视觉问题。一切都是对你不利的。而抱怨并不是一种很好的选择,那么唯一的希望就是策略2在训练和冻结的层数之间很难找到平衡点。深入你的模型可能会过度拟合,但如果留在模型的浅层,你将不会学到任何有用的东西。也许你需要比象限2更深入,你需要考虑数据增强技术(这里提供了关于数据增强技术的一个很好的总结)。https://medium.com/nanonets/how-to-use-deep-learning-when-you-have-limited-data-part-2-data-augmentation-c26971dc8ced

  • 象限4。小型数据集,但与预训练模型的数据集类似。请选择策略3。你只需要删除最后一个完全连接的图层(输出图层),将预先训练的模型作为固定特征提取器运行,然后使用生成的特征来训练新的分类器。

教程:使用迁移学习来解决图像问题!

图3和图4 尺寸相似矩阵(左)和用于微调预训练模型的决策图(右)。

5.深度卷积神经网络之上的分类器

如前所述,基于预训练卷积神经网络的传递学习方法产生的图像分类模型通常由两部分组成:

(1)卷积基,执行特征提取。

(2)分类器,它根据卷积基数提取的特征对输入图像进行分类。

因为在本节中我们关注分类器部分,所以必须首先说明可以遵循不同的方法来构建分类器。一些最受欢迎的做法是:

(1)完全连接的层。对于图像分类问题,标准方法是使用一堆完全连接的层,然后使用softmax激活层。softmax层在每个可能的类标签上输出概率分布,然后我们只需要根据最可能的类对图像进行分类。

(2)全局平均池化(Global Average Pooling)。Lin et al. (2013)提出了一种基于全局平均池化的不同方法。在这种方法中,我们不是在卷积基础上添加完全连接的层,而是添加全局平均池层并将其输出直接馈送到softmax激活层。Lin et al. (2013)详细讨论了这种方法的优缺点。

(3)线性支持向量机。线性支持向量机(SVM)是另一种可能的方法。根据Tang(2013),我们可以通过在卷积基数提取的特征上训练线性SVM分类器来提高分类准确性。有关SVM方法的优缺点的更多细节可以在本文中找到。

6.实例

在这个例子中,我们将看到如何在用于图像分类的传输学习解决方案中实现这些分类器中的每一个。根据Rawat和Wang(2017)的研究,"在深度卷积神经网络之上比较不同分类器的性能仍需要进一步研究,从而形成一个有趣的研究方向"。因此,看看每个分类器如何在标准图像分类问题中执行将会很有趣。

你可以在我的GitHub页面上找到此示例的完整代码。

https://github.com/pmarcelino/blog/blob/master/dogs_cats/dogs_cats.ipynb

6.1准备数据

在这个例子中,我们将使用原始数据集的较小版本。这将允许我们更快地运行模型,这对于那些计算能力有限的人(如我)来说非常棒。

要构建较小版本的数据集,我们可以调整Chollet(2017)提供的代码,如代码1所示。

教程:使用迁移学习来解决图像问题!


教程:使用迁移学习来解决图像问题!


教程:使用迁移学习来解决图像问题!


教程:使用迁移学习来解决图像问题!


代码1.为Dogs vs. Cats创建一个较小的数据集。

6.2.从卷积基础中提取特征

卷积基数将用于提取特征。这些功能将提供我们想要训练的分类器,以便我们可以识别图像是否有狗或猫。

Chollet(2017)提供的代码再次进行了改编。代码2显示了使用的代码。

教程:使用迁移学习来解决图像问题!


教程:使用迁移学习来解决图像问题!


代码2 从卷积基础中提取特征

6.3 分类

6.3.1完全连接的层

我们提出的第一个解决方案基于完全连接的层。该分类器添加了一堆完全连接的层,这些层由从卷积基础中提取的特征提供。

为了简单和快速,我们将使用Chollet(2018)提出的解决方案稍作修改。特别是,我们将使用Adam优化器而不是RMSProp。

代码3显示了使用的代码,而图5和6显示了学习曲线。

教程:使用迁移学习来解决图像问题!


代码3 完全连接的层解决方案 

教程:使用迁移学习来解决图像问题!


图5完全连接层解决方案的准确性 

教程:使用迁移学习来解决图像问题!


图6完全连接的层解决方案的丢失 结果简要说明:

(1)验证准确度约为0.85,考虑到数据集的大小,这个结果令人鼓舞。

(2)这个模型过度拟合。训练和验证曲线之间存在很大差距。

(3)由于我们已经使用了dropout,应该增加数据集的大小以改善结果。

6.3.2。全局平均池化

这种情况与前一种情况的区别在于,我们将添加一个全局平均池化层,并将其输出馈送到S形激活层,而不是添加一堆完全连接的层。

请注意,我们讨论的是sigmoid激活层而不是softmax激活层,这是Lin等人推荐的。我们正在改变为sigmoid激活,因为在Keras中,要执行二进制分类,你应该使用sigmoid激活和binary_crossentropy作为损失。因此,有必要对Lin等人的原始提案进行小修改。

代码4显示了构建分类器的代码。图7和8显示了生成的学习曲线。

教程:使用迁移学习来解决图像问题!


代码4全局平均池化解决方案 

教程:使用迁移学习来解决图像问题!


图7 全局平均池化解决方案的准确性 

教程:使用迁移学习来解决图像问题!

图8 全局平均池化解决方案的丢失

结果简要说明:

(1)验证准确性类似于完全连接的层解决方案产生的验证精度。

(2)该模型没有像前一种情况那样过度拟合。

(3)当模型停止训练时,损失函数仍在减少。可以通过增加时期数来改进模型。

6.3.3线性支持向量机

在这种情况下,我们将在卷积基础提取的特征上训练线性支持向量机(SVM)分类器。

为了训练这种分类器,传统的机器学习方法更可取。因此,我们将使用k倍交叉验证来估计分类器的误差。由于将使用k折叠交叉验证,我们可以连接训练和验证集以扩大我们的训练数据(我们保持测试集不变,就像我们在之前的情况中所做的那样)。代码5显示了数据的连接方式。

教程:使用迁移学习来解决图像问题!


代码5.数据连接

最后,我们必须意识到SVM分类器有一个超参数。该超参数是误差项的惩罚参数C。为了优化这个超参数的选择,我们将使用详尽的网格搜索。代码6显示了用于构建此分类器的代码,而图9显示了学习曲线。

教程:使用迁移学习来解决图像问题!


代码6 线性SVM解决方案 

教程:使用迁移学习来解决图像问题!


图9线性SVM解决方案的准确性结果简要说明:(1)模型的精度约为0.86,这与之前解决方案的精度相似。(2)过度拟合围绕中心。此外,训练精度始终为1.0,这是不常见的,可以解释为过度拟合的标志。(3)模型的准确性应随着训练样本的数量而增加。但是,这似乎没有发生。这可能是由于过度拟合。当数据集增加时,看看模型如何反应将会很有趣。

7.总结

在本文中,我们:

•介绍了迁移学习、卷积神经网络和预训练模型的概念。•定义了基本的微调策略,以重新利用预先训练的模型。•描述了一种结构化方法,根据数据集的大小和相似性来决定应该使用哪种微调策略。•引入了三种不同的分类器,可以在从卷积基础中提取的特征之上使用。•为本文中介绍的三个分类器中的每一个提供了关于图像分类的端到端示例。 我希望人们有动力开始开发有关计算机视觉的深度学习项目。这是一个伟大的研究领域,每天都会有新的令人兴奋的发现。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31545819/viewspace-2218847/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-09-19

  • 博文量
    104
  • 访问量
    186502