预训练网络和迁移学习 训练卷积神经网络(CNN)需要耗费大量时间,并且需要大量的数据。然而,大部分时间都花在了学习网络如何从图像中提取模式的最佳低级过滤器上。一个自然的问题出现了——我们能否使用在一个数据集上训练的神经网络来适应分类不同的图像,而不需要进行完整的训练过程? 课前测验 这种方法被称为迁移学习,因为我们从一个神经网络模型转移到另一个模型时,会将一些知识转移过去。在迁移学习中,我们通常从一个预训练的模型开始,该模型已经在某个大型图像数据集(如ImageNet)上进行了训练。这些模型已经能够很好地从通用图像中提取不同的特征,在许多情况下,只需在这些提取的特征之上构建一个分类器就能获得很好的结果。 ✅ 迁移学习是其他学术领域(如教育学)中也使用的术语。
训练卷积神经网络(CNN)需要耗费大量时间,并且需要大量的数据。然而,大部分时间都花在了学习网络如何从图像中提取模式的最佳低级过滤器上。一个自然的问题出现了——我们能否使用在一个数据集上训练的神经网络来适应分类不同的图像,而不需要进行完整的训练过程?
这种方法被称为迁移学习,因为我们从一个神经网络模型转移到另一个模型时,会将一些知识转移过去。在迁移学习中,我们通常从一个预训练的模型开始,该模型已经在某个大型图像数据集(如ImageNet)上进行了训练。这些模型已经能够很好地从通用图像中提取不同的特征,在许多情况下,只需在这些提取的特征之上构建一个分类器就能获得很好的结果。
✅ 迁移学习是其他学术领域(如教育学)中也使用的术语。它指的是将一个领域的知识应用到另一个领域的过程。
在前面的部分中讨论的卷积网络包含多个层,每一层都应该从图像中提取一些特征,从低级像素组合(如水平/垂直线或笔画)开始,直到更高层次的特征组合,对应于火焰的眼睛等事物。如果我们在一个足够大的、多样化的通用图像数据集上训练CNN,网络应该学会提取这些常见的特征。
Keras 和 PyTorch 都包含了一些函数,可以轻松加载一些常见架构的预训练神经网络权重,其中大多数都是在 ImageNet 图像上训练的。其中最常用的几个在之前课程的 CNN 架构 页面中有描述。特别是,你可以考虑使用以下之一:
以下是 VGG-16 网络从一张猫的照片中提取的一些特征示例:

在这个例子中,我们将使用一个非常接近实际生活中的图像分类场景的数据集——猫与狗。
让我们在相应的笔记本中看到迁移学习的实际效果:
预训练的神经网络在其“大脑”中包含了不同的模式,包括对理想猫的概念(以及理想狗、理想斑马等)。有趣的是,我们可以尝试可视化这个图像。然而,这并不简单,因为模式散布在网络的权重中,并且组织成一种分层结构。
我们可以采取的一种方法是从一张随机图像开始,然后尝试使用梯度下降优化技术调整该图像,使得网络开始认为它是猫。

然而,如果这样做,我们会得到类似随机噪声的东西。这是因为有很多方法可以让网络认为输入图像是猫,包括一些在视觉上没有意义的方法。虽然这些图像包含了典型的猫的模式,但没有任何东西可以约束它们在视觉上具有明显的区别。
为了改进结果,我们可以在损失函数中添加另一个项,称为变分损失。这是一个衡量图像相邻像素相似程度的指标。最小化变分损失可以使图像更平滑,去除噪声——从而揭示出更美观的模式。以下是这种“理想”图像的例子,它们被高概率地分类为猫和斑马:
![]() |
![]() |
|---|---|
| 理想猫 | 理想斑马 |
类似的方法也可以用于对神经网络进行所谓的对抗攻击。假设我们想愚弄一个神经网络,让它认为一只狗看起来像一只猫。如果我们拿一张被网络识别为狗的狗的照片,然后使用梯度下降优化技术对其进行微调,直到网络开始将其分类为猫:
![]() |
![]() |
|---|---|
| 原始狗的照片 | 被分类为猫的狗的照片 |
请参阅以下笔记本中的代码以重现上述结果:
通过迁移学习,你可以快速组装一个自定义对象分类任务的分类器并获得高准确性。可以看到,我们现在解决的更复杂任务需要更高的计算能力,不能轻易在 CPU 上完成。在下一个单元中,我们将尝试使用更轻量级的实现,使用较低的计算资源来训练相同的模型,这会导致略微降低准确性。
在配套笔记本中,底部有说明迁移知识在一定程度上相似的训练数据上效果最好(可能是新的动物类型)。做一些实验,使用完全不同的图像类型来看看你的迁移知识模型表现如何。
阅读TrainingTricks.md以加深你对其他训练模型方法的理解。
在这个实验中,我们将使用现实生活中的牛津-IIIT宠物数据集,其中包含 35 种猫和狗的品种,并将建立一个迁移学习分类器。
声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。