迁移学习

什么是迁移学习?

迁移学习是一种深度学习方法,就是将为一项任务训练的模型作为起点,重新用于执行类似任务的模型的过程。通过迁移学习更新和重新训练网络,要比从头开始训练网络更便捷。迁移学习可用于图像分类、目标检测、语音识别和其他应用。

为何迁移学习如此重要?

通过迁移学习,您可以充分利用深度学习社区提供的专业知识。常见的预训练模型不仅提供稳健的架构,而且让您无需从头开始构建模型。迁移学习是一种常用的有监督学习方法,因为:

  • 它有助于通过复用已基于大型数据集训练的常见模型,以较少的标注数据训练模型。
  • 它可以减少训练时间和计算资源。使用迁移学习时,神经网络的权重无需从头开始学习即可得到,因为预训练模型已根据以前所学的知识获得了权重。
  • 您可以使用深度学习研究社区开发的模型架构,包括 GoogLeNetYOLO 等常见架构。
迁移学习示意图:知识如何从模型 1(用数据集 1 训练)迁移到模型 2(用数据集 2 训练)。数据集 1 大于数据集 2。

将知识从预训练模型迁移到可用较少标注数据训练的另一个模型。

从头开始训练还是执行迁移学习?

要创建深度学习模型,您既可以从头开始训练模型,也可以使用预训练模型执行迁移学习。

对于非常特别的任务,从头开始开发和训练模型效果更好,因为在这些任务中无法使用预先存在的模型。这种方法的缺点在于,它通常需要大量数据才能生成准确的结果。如果较小的网络就能实现所需的准确度,则也可以从头开始创建模型。例如,循环神经网络 (RNN) 和长短期记忆 (LSTM) 网络特别适用于长度不同的顺序数据,这些网络有助于解决信号分类时间序列预测等问题。

迁移学习适用于存在各种预训练模型的任务。例如,许多常见的卷积神经网络 (CNN) 都是基于 ImageNet 数据集预训练的,该数据集包含 1,400 多万张图像和 1,000 个图像类。如果您需要对花园中的花卉图像(或 ImageNet 数据集中未包含的任何图像)进行分类,并且您的花卉图像数量有限,您可以从 SqueezeNet 网络迁移层及其权重,替换最终层,并使用您的花卉图像重新训练您的模型。

这种方法可以帮助您通过迁移学习在更短时间内获得更高的模型准确度。

比较使用迁移学习和不使用迁移学习训练网络时的网络性能差异。使用迁移学习时,网络的性能曲线显示较高的起点、斜率和渐近线。

比较从头开始训练和使用迁移学习训练时的网络性能(准确度)。

迁移学习应用

迁移学习常见于许多深度学习应用,例如:

计算机视觉

计算机视觉应用包括图像识别目标检测图像分割以及激光雷达点云处理。请参阅 MATLAB 示例使用迁移学习对多分辨率分块图像中的肿瘤进行分类

语音和音频处理

请参阅 MATLAB 示例在深度网络设计器中使用预训练音频网络进行迁移学习

文本分析

请参阅 MATLAB GitHub 示例微调日语文本的 BERT 模型

使用预训练模型进行迁移学习

迁移学习的核心是预训练深度学习模型,该模型由深度学习研究人员构建,已使用数千或数百万样本数据点进行了训练。

预训练模型有许多,每种模型各有优缺点:

  1. 预测速度:模型预测新输入的速度有多快?预测速度可能因硬件和批量大小等其他因素而异,但也受模型架构和大小的影响。
  2. 大小:模型需要占用多大的内存?模型大小的重要性取决于其预期的部署位置和部署方式。它是在嵌入式硬件还是桌面上运行?当部署到资源受限的目标时,网络的大小非常重要。
  3. 准确度:模型在重新训练前的表现如何?如果模型在 ImageNet 数据集上表现良好,则可能在新的类似任务中同样表现良好。然而,如果在 ImageNet 上准确度分数低,则不一定意味着该模型在所有任务中都表现不佳。
比较预训练 CNN 模型的模型大小、预测速度和准确度,这些模型可用于迁移学习。

比较常见 CNN 预训练模型的模型大小、速度和准确度。

哪个模型最适用于您的迁移学习工作流?

由于有多种迁移学习模型可供选择,因此,务必牢记涉及的权衡因素和具体项目的总体目标。最好尝试各个模型,以找到最适合您的应用的模型。

凭借简单的快速入门模型,例如 GoogLeNet、VGG-16 和 VGG-19,您可以实现快速迭代,并试验不同数据预处理步骤和训练选项。您一旦找到适合的设置,就可以尝试更准确的网络,看看能否改进您的结果。

如果模型大小受到部署环境的限制,您可以考虑轻量级和计算高效的模型,如 SqueezeNet、MobileNet-v2 和 ShuffleNet。

如何在 MATLAB 中得到预训练模型?

浏览 MATLAB® 深度学习模型中心,按类别访问最新模型并获取关于选择模型的提示。您可以使用单个 MATLAB 函数(例如 darknet19 函数)加载大多数模型。

您也可以从外部平台获得预训练网络。您可以使用导入函数,例如 importNetworkFromTensorFlow 函数,将模型从 TensorFlow™、PyTorch® 或 ONNX™ 转换为 MATLAB 模型。

直接从 MATLAB 或外部深度学习平台(PyTorch、TensorFlow 和 ONNX)获得预训练深度学习模型。

迁移学习在软传感器设计中的应用

阅读 Poclain Hydraulics 如何在 MATLAB 中利用预训练网络加速软传感器的设计。

“我们确定了两个已在 MATLAB 中实现的神经网络,这些神经网络帮助我们将代码嵌入到了硬件中以实时预测温度。”

Bruno Dandine,Poclain Hydraulics

使用 MATLAB 进行迁移学习

通过将 MATLABDeep Learning Toolbox™ 结合使用,您可以访问数百个预训练模型,并使用内置函数或交互式 App 执行迁移学习。对于不同迁移学习应用,您可能还需要使用其他工具箱,如 Computer Vision Toolbox™Audio Toolbox™Lidar Toolbox™Text Analytics Toolbox™

迁移学习工作流

迁移学习工作流包括获得、修改并重新训练预训练网络,然后用该网络基于新数据进行预测。

迁移学习工作流的步骤示意图。

虽然有各种迁移学习架构和应用,但迁移学习工作流的步骤大同小异。下图显示图像分类的迁移学习工作流。迁移学习是基于预训练的 GoogLeNet 模型执行的,这是一个常见网络,深度为 22 层,经训练可将对象分类为 1,000 个类别。

  1. 选择一个预训练模型。开始时,最好选择一个简单模型。
预训练的 CNN 模型,可经过修改用于图像分类任务中的迁移学习。

GoogLeNet 模型的架构,网络深度为 22 层,经过训练可将对象分类为 1,000 个类别。

  1. 替换最终层。要重新训练网络以对一组新图像和类进行分类,您需要替换 GoogLeNet 模型的最后一个可学习层和最终分类层。最终全连接层(最后一个可学习层)经过修改可包含与新类数量相同的节点数量。新分类层将根据 softmax 层计算的概率生成输出。
要进行迁移学习,必须在重新训练模型之前替换预训练 CNN 模型的最终层。

在重新训练模型之前,替换 CNN 模型的最后一个可学习层和分类层。

修改这些层后,最终全连接层将指定网络要学习的类的数量,而分类层将根据可用的输出类别确定输出。例如,GoogLeNet 最初是基于 1,000 个类别进行训练的,但通过替换最终层,您可以重新训练它,使其只对您感兴趣的五个(或任何其他数量)类别的对象进行分类。

  1. 可以选择冻结权重。您可以通过将网络前几层的学习率设置为零来冻结这些层的权重。在训练过程中,冻结层的参数不会更新,这可以显著加快网络训练速度。如果新数据集较小,则冻结权重还可以防止网络对新数据集进行过拟合。
  2. 重新训练模型。重新训练将更新网络,以学习和识别与新图像和类别相关联的特征。在大多数情况下,相较于从头开始训练模型,重新训练需要的数据更少。
  3. 预测和评估网络准确度。在重新训练模型后,您可以对新图像进行分类,并评估网络的性能。

交互式迁移学习方法

使用深度网络设计器,您能够以交互方式完成整个迁移学习工作流,其中包括选择或导入(从 MATLAB、TensorFlow 或 PyTorch 中)预训练模型,修改最终层,以及使用新数据重新训练网络,这一切只需很少的编码或根本无需编码即可实现。

了解有关迁移学习的更多信息

观看这些视频,了解如何通过命令行或使用深度网络设计器开始迁移学习。

相关主题