原文:
www.kdnuggets.com/2018/12/solve-image-classification-problem-quickly-easily.html
由Pedro Marcelino,科学家、工程师与企业家
代码的美丽由Chris Ried在Unsplash上展示
1. Google 网络安全证书 - 快速进入网络安全职业生涯。
2. Google 数据分析专业证书 - 提升你的数据分析技能
3. Google IT 支持专业证书 - 支持你的组织进行 IT 管理
深度学习 正迅速成为人工智能应用中的关键工具(LeCun et al. 2015)。例如,在计算机视觉、自然语言处理和语音识别等领域,深度学习取得了显著的成果。因此,深度学习受到越来越多的关注。
深度学习擅长解决的一个问题是图像分类(Rawat & Wang 2017)。图像分类的目标是根据一组可能的类别对特定图片进行分类。图像分类的经典例子是识别一组图片中的猫和狗(例如,狗与猫 Kaggle 竞赛)。
从深度学习的角度来看,图像分类问题可以通过迁移学习来解决。实际上,图像分类中的一些最先进的结果基于迁移学习解决方案(Krizhevsky et al. 2012, Simonyan & Zisserman 2014, He et al. 2016)。Pan & Yang(2010)提供了迁移学习的全面综述。
本文展示了如何实现图像分类问题的迁移学习解决方案。 本文提出的实现基于 Keras(Chollet 2015),使用 Python 编程语言。按照此实现方法,你将能够快速且轻松地解决任何图像分类问题。
本文组织如下:
-
迁移学习
-
卷积神经网络
-
重用预训练模型
-
迁移学习过程
-
深度卷积神经网络上的分类器
-
示例
-
摘要
-
参考文献
迁移学习在计算机视觉中是一种流行的方法,因为它使我们能够以节省时间的方式构建准确的模型 (Rawat & Wang 2017)。使用迁移学习,你不是从零开始学习过程,而是从解决不同问题时已经学习到的模式开始。这样你可以利用以前的学习成果,避免从头开始。把它看作是深度学习版本的Chartres的“站在巨人的肩膀上”。
在计算机视觉中,迁移学习通常通过使用预训练模型来实现。预训练模型是指在大型基准数据集上训练出来的模型,用于解决类似于我们想要解决的问题。因此,由于训练这些模型的计算成本,通常会从已发表的文献中导入并使用模型(例如,VGG、Inception、MobileNet)。Canziani 等人 (2016) 对使用 ImageNet (Deng et al. 2009) 挑战的数据进行的预训练模型在计算机视觉问题上的性能进行了全面回顾。
多个用于迁移学习的预训练模型基于大型卷积神经网络 (CNN) (Voulodimos et al. 2018)。一般来说,CNN 在各种计算机视觉任务中表现出色 (Bengio 2009)。其高性能和易于训练是近年来 CNN 流行的两个主要因素。
一个典型的 CNN 有两个部分:
-
卷积基础,由一系列卷积层和池化层组成。卷积基础的主要目标是从图像中生成特征。有关卷积层和池化层的直观解释,请参考 Chollet (2017)。
-
分类器,通常由全连接层组成。分类器的主要目标是根据检测到的特征对图像进行分类。全连接层是指其神经元与前一层的所有激活都有完全连接的层。
图 1 展示了基于 CNN 的模型架构。请注意,这是一个简化版本,适合本文的目的。实际上,这种模型的架构比我们在这里建议的要复杂。
图 1. 基于 CNN 的模型架构。
这些深度学习模型的一个重要方面是它们能够自动学习层次特征表示。这意味着第一层计算的特征是通用的,可以在不同的问题领域中重复使用,而最后一层计算的特征是特定的,依赖于所选择的数据集和任务。根据 Yosinski 等人(2014 年)的说法,‘如果第一层特征是通用的,而最后一层特征是特定的,那么网络中某个地方必定存在从通用到特定的过渡’。因此,我们的 CNN 的卷积基础——尤其是其较低的层(即靠近输入的层)——指的是通用特征,而分类器部分以及卷积基础的一些较高层则指的是专门的特征。
当你将预训练模型重新利用到自己的需求时,你首先需要移除原始分类器,然后添加一个适合你目的的新分类器,最后你需要根据三种策略之一来微调你的模型。
-
训练整个模型。在这种情况下,你使用预训练模型的架构,并根据你的数据集进行训练。你是在从头开始学习模型,因此你需要一个大数据集(以及大量的计算能力)。
-
训练一些层并保持其他层不变。如你所记得,较低的层指的是通用特征(与问题无关),而较高的层指的是特定特征(与问题相关)。在这里,我们通过选择调整网络权重的多少来玩味这种二分法(一个冻结的层在训练过程中不会变化)。通常,如果你有一个小数据集和大量参数,你会保持更多层不变以避免过拟合。相反,如果数据集很大且参数较少,你可以通过训练更多层来改进你的模型,因为过拟合不是问题。
-
冻结卷积基础。这种情况对应于训练/冻结权衡的极端情况。主要思想是保持卷积基础的原始形式,然后利用其输出作为分类器的输入。你将预训练模型用作固定的特征提取机制,这在计算能力有限、数据集较小和/或预训练模型解决的问题与您想解决的问题非常相似的情况下非常有用。
图 2 以示意图的方式展示了这三种策略。
图 2. 微调策略。
与策略 3不同,策略 1和策略 2的应用需要你在卷积部分的学习率上小心。学习率是一个超参数,控制你调整网络权重的程度。当你使用基于 CNN 的预训练模型时,使用较小的学习率是明智的,因为较高的学习率增加了丢失先前知识的风险。假设预训练模型已经经过良好的训练,这是一个合理的假设,保持较小的学习率将确保你不会过早或过度地扭曲 CNN 权重。
从实际角度来看,整个迁移学习过程可以总结如下:
-
选择一个预训练模型。从众多可用的预训练模型中,你选择一个看起来适合你的问题的模型。例如,如果你使用 Keras,你可以立即访问一组模型,如 VGG(Simonyan & Zisserman 2014)、InceptionV3(Szegedy 等 2015)和 ResNet5(He 等 2015)。这里你可以查看 Keras 上所有可用的模型。
-
**根据 Size-Similarity 矩阵对你的问题进行分类。**在图 3 中,你有一个控制你选择的‘矩阵’。该矩阵根据你的数据集大小及其与预训练模型训练数据集的相似性来分类你的计算机视觉问题。作为一个经验法则,如果你的数据集每个类别少于 1000 张图片,则可以认为它是小型数据集。关于数据集相似性,让常识占上风。例如,如果你的任务是识别猫和狗,ImageNet 是一个类似的数据集,因为它包含猫和狗的图像。然而,如果你的任务是识别癌细胞,ImageNet 不能被认为是类似的数据集。
-
**微调你的模型。**在这里,你可以使用 Size-Similarity 矩阵来指导你的选择,然后参考我们之前提到的关于重新利用预训练模型的三种选项。图 4 提供了接下来文本的视觉总结。
-
象限 1。大型数据集,但不同于预训练模型的数据集。这种情况会导致你使用策略 1。由于你有一个大型数据集,你能够从头开始训练模型并做任何你想做的事情。尽管数据集有所不同,但实际上,从预训练模型初始化你的模型,使用它的架构和权重,仍然是有用的。
-
象限 2. 大数据集且与预训练模型的数据集相似。在这里,你处于梦幻之地。任何选项都有效。可能,最有效的选项是策略 2。由于我们有一个大数据集,过拟合不应该是问题,因此我们可以尽可能多地学习。然而,由于数据集相似,我们可以通过利用先前的知识来节省大量的训练工作。因此,仅需训练分类器和卷积基础的顶层即可。
-
象限 3. 小数据集且与预训练模型的数据集不同。这是计算机视觉问题中的 2–7 离牌手。所有情况都对你不利。如果抱怨不是一个选项,你唯一的希望是策略 2。在训练和冻结层数之间找到平衡会很困难。如果你过深,你的模型可能会过拟合;如果你停留在模型的浅层,你将无法学到任何有用的东西。可能,你需要比在象限 2 中更深入,并且需要考虑数据增强技术(有关数据增强技术的一个很好的总结可以在这里找到)。
-
象限 4. 小数据集,但与预训练模型的数据集相似。我问过大师尤达,他告诉我“最佳选择,策略 3 应该”。我不知道你怎么想,但我不低估原力。因此,选择策略 3。你只需要去掉最后一个全连接层(输出层),将预训练模型作为固定特征提取器运行,然后使用结果特征来训练新的分类器。
图 3 和 4. 尺寸-相似性矩阵(左)和用于微调预训练模型的决策图(右)。
如前所述,图像分类模型 通过基于预训练卷积神经网络的迁移学习方法通常由两个部分组成:
-
卷积基础,用于特征提取。
-
分类器,根据卷积基础提取的特征对输入图像进行分类。
由于本节重点是分类器部分,我们必须首先说明,构建分类器可以采用不同的方法。一些最受欢迎的方法包括:
-
全连接层。 对于图像分类问题,标准方法是使用一系列全连接层,随后是一个 softmax 激活层(Krizhevsky et al. 2012,Simonyan & Zisserman 2014,Zeiler & Fergus 2014)。softmax 层输出每个可能类别标签的概率分布,然后我们只需根据最可能的类别来分类图像。
-
全局平均池化。 Lin 等人(2013)提出了一种基于全局平均池化的不同方法。在这种方法中,我们不是在卷积基础上添加全连接层,而是添加一个全局平均池化层,并将其输出直接送入 softmax 激活层。Lin 等人(2013)对这种方法的优缺点进行了详细讨论。
-
线性支持向量机。 线性支持向量机(SVM)是另一种可能的方法。根据 Tang(2013)的说法,我们可以通过在卷积基础上提取的特征上训练线性 SVM 分类器来提高分类准确率。关于 SVM 方法的优缺点的更多细节可以在论文中找到。