使用卷积神经网络进行迁移学习

2025年3月17日 | 阅读 8 分钟

人工智能神经网络(ANNs)是数据科学中最先进的机器学习模型。它们的性能令人难以置信地惊人,即使只有一个隐藏层,它们也可以以任何所需的精度逼近任何函数。

鉴于它们惊人的性能和广泛的适用性,为什么还要选择其他模型呢?

在超越竞争模型之前,ANNs 需要大量数据和计算能力。对于人们通常使用的数据集和技术来说,使用 ANNs 就像用宇宙飞船来日常通勤一样。

那么,有人可能会问,有没有一种方法可以在没有缺点的情况下受益于 ANNs 呢?

自适应学习

迁移学习是指使用一个为某个目的创建的模型并将其应用于另一个目的的过程。使用无监督机器学习的结果,例如 K-means 聚类,作为监督机器学习模型的输入,是一个常见的例子。迁移学习也可用于改编先前训练过的 ANN 以执行新任务,这就是本文的重点。

在讨论 ANNs 的迁移学习之前,我们需要对其基本结构进行概述。

全连接前馈神经网络

Transfer Learning with Convolutional Neural Network

在其最基本的形式中,ANN 只是堆叠的逻辑回归层,其中每个观测值的特征值由输入层中的一个节点表示,该节点随后乘以权重并经过激活函数 5 处理,以告知后续层(称为隐藏层)中的每个节点。此过程一直重复到输出层,即预测。这是前向传播阶段。然后,在比较预测值和实际值以优化某个可微目标函数时,逐层向后修改权重。

在 ANNs 的学习阶段,所有数据和处理能力都是必需的,因为(数百万个)6 权重中的每一个都必须使用梯度下降在损失函数上进行调整。这相当于一千万个微积分问题,即使对计算机来说也很困难。相比之下,前向传播只是将值乘以权重,应用一个简单的激活函数,然后将它们相加。这相当于几千万个数学问题,对机器来说很容易解决。

卷积神经网络

卷积神经网络是一种专门的 ANNs,用于计算机视觉应用,如对象检测、对象定位和图像分类。它们的设计与上面讨论的简单 ANNs 相同,只是它们以卷积基开始,用于识别图像中的独特模式。

Transfer Learning with Convolutional Neural Network

接连的卷积层会发展出更高级别的模式(例如,从边缘到角到形状)。全连接层位于卷积基之后,它们学习这些模式与标签之间的关系,这些关系构成了它们预测的基础。

只需几个简单的步骤,我们就可以改编一个经过充分训练以实现广泛目标(例如,在一千种不同标签中进行分类)的复杂 CNN。

首先,移除为模型原始功能设置的全连接层,然后用适合我们特定目标的全连接层替换它们(需要注意的是,输出层的形状、激活函数和损失函数可能需要修改)。然后,我们冻结卷积块中的层,以便在模型针对我们的任务进行训练时,预先学习的模式只是被重新解释以适应新环境,而不是被覆盖。

瞧!由于只需要训练全连接层,我们可以用训练原始模型所需数据和处理能力的很小一部分来完成。现在我们拥有一个包含数千万到数亿个已学习参数的模型,可以针对我们的任务进行拟合。即使整个模型从头开始为

特定任务创建的模型性能可能会更好,但迁移学习对于没有超级计算机或数百万张标记图像的人来说是一种方便的小方法。

  • 虽然一个训练用于预测 1000 个类别之一的 CNN 预计已经学习了许多可以应用于自定义分类问题的通用特征,但一个为癌症诊断而训练的复杂 CNN 却不能期望用于区分猫和汽车。

将从一项活动中获得的知识用于另一项活动称为迁移学习。许多视觉特征,特别是对于卷积神经网络(CNN),在多个数据集之间共享(例如,直线和边缘几乎出现在所有图像中)。因此,特别是对于大型模型,

由于缺乏大型数据集和强大的计算资源,CNN 很少从头开始训练。

拥有 120 万张图像的 ImageNet 数据集是一个典型的预训练图像集。使用的具体模型取决于目标(通常,用户选择在 ImageNet 挑战中表现最好的模型);但是,本文使用 ResNet50 模型。预训练模型通常可以通过所使用的库(在此示例中为 Keras)访问。

介绍 ResNet

梯度消失问题是 ResNet 最初设计的灵感来源。这个问题限制了神经网络的大小,因为反向传播的梯度在反复相乘时会变得非常小。通过使用跳跃连接——添加让数据跳过层的快捷方式——ResNet 架构试图解决这个问题。

模型由一组带有跳跃连接的卷积层、平均池化和输出全连接(密集)层组成。

导入模型时,我们应该排除卷积层,因为它们是唯一包含我们对迁移学习感兴趣的特征的层。由于我们将它们移除,因此必须用我们的层替换输出层。

问题陈述

为了演示迁移学习过程,我将使用 Caltech-101 图像数据集,该数据集包含 101 个类别,每个类别约有 40-800 张图像。

数据处理

首先下载数据集,然后解压。解压后,请务必删除“BACKGROUND Google”文件夹。

代码:为了准确评估,我们必须将数据划分为训练集和测试集。为了确保在测试集中具有适当的代表性,我们必须在每个类别内部进行划分。

输出

Transfer Learning with Convolutional Neural Network

训练图像在第一个文件夹中,测试图像在第二个文件夹中。每个子文件夹中的图像都按类别组织。我们将使用 Keras 的 ImageDataGenerator 类来输入数据。ImageDataGenerator 提供了图像数据增强和简单图像数据处理的解决方案。

上面的代码使用图像目录的文件路径构建了一个用于创建数据的数据对象。

模型构建标准:包含基本的预训练模型。

由于大多数类别少于 50 张 ImageNet 图像,此数据集在拆分后只有大约 5628 张图像,因此微调卷积层可能会导致过拟合。由于我们的新数据集和 ImageNet 数据集相似,我们确信许多预训练权重也使用了好的特征。为了在训练分类器的其余部分时不对它们进行更改,我们可以冻结那些训练过的卷积层。如果数据集较小且与原始数据集差异很大,微调仍可能导致过拟合,但后面的层可能没有正确的特征。为了在训练分类器的其余部分时不对它们进行更改,我们可以冻结那些训练过的卷积层。如果数据集较小且与原始数据集差异很大,微调仍可能导致过拟合,但后面的层可能没有正确的特征。因此,您可以再次冻结卷积层,但这次,只使用早期层的结果,因为它们具有更通用的特征。如果您拥有大型数据集,您通常可以对整个网络进行微调,而无需担心过拟合。

现在我们可以包含其余的分类器。因此,一个在新闻数据集上训练的不同分类器被馈送了先前训练过的卷积层的输出。

模型训练代码

输出

Transfer Learning with Convolutional Neural Network

使用代码来评估测试集。

输出

Transfer Learning with Convolutional Neural Network

在仅进行了五个 epoch 后,我们获得了 101 类数据集 92.8% 的准确率。作为参考,原始 ResNet 在大约 100 万张图像的数据集上进行了 120 个 epoch 的训练。

有几个方面可以改进。最近一个 epoch 中验证损失和训练损失之间的差异表明模型开始过拟合。图像增强是一种解决此问题的方法。ImageDataGenerator 类使得实现简单的图像增强变得容易。