训练CNN需要很长时间,并且需要大量数据。然而,很多时间都花在学习网络可以使用从图像中提取模式的最佳低级滤波器。一个自然的问题产生了 - 我们可以使用在一个数据集上训练过的神经网络,并在不需要完全训练的情况下将其适应到分类不同的图像吗?
这种方法被称为迁移学习,因为我们将知识从一个神经网络模型转移到另一个。在迁移学习中,通常我们从一个预训练的模型开始,这个模型已经在一些大型图像数据集上进行了训练,例如ImageNet。这些模型已经可以很好地从通用图像中提取不同的特征,在许多情况下,只需在提取的特征之上构建一个分类器就可以获得良好的结果。
✅ 迁移学习 是一个你在其他学术领域(例如教育)中找到的术语,它指的是将一个领域的知识应用到另一个领域的过程。
预训练模型作为特征提取器
我们之前讨论过的卷积网络包含了许多层,每一层都应该从图像中提取一些特征,从低级像素组合(例如水平/垂直线或笔画)开始,直到更高级别的特征组合,对应于事物的高级特征,例如火焰的眼睛。如果我们在足够大的通用和多样化图像数据集上训练CNN,网络应该学会提取这些常见的特征。 Keras和PyTorch都包含了用于轻松加载一些常见架构的预训练神经网络权重的函数,其中大部分是在ImageNet图像上训练的。最经常使用的一些描述在之前的课程中的CNN架构页面上。特别是,您可能希望考虑使用以下之一:
- VGG-16/VGG-19是相对简单的模型,仍然可以产生良好的准确性。通常使用VGG作为第一次尝试是一个不错的选择,可以看到迁移学习是如何起作用的。
- ResNet是由微软研究于2015年提出的一系列模型。它们有更多的层,因此需要更多资源。
- MobileNet是一个具有减小尺寸的模型系列,适用于移动设备。如果您资源有限并且可以牺牲一点准确性,可以使用它们。
这里是VGG-16网络从一张猫图片中提取的样本特征: VGG-16提取的特征 猫狗数据集在这个例子中,我们将使用一个猫和狗的数据集,这很接近实际的图像分类场景。 ✍️ 练习:迁移学习让我们在下面的笔记本中看看迁移学习的应用: 迁移学习 - PyTorch迁移学习 - TensorFlow
可视化对抗性猫
预训练的神经网络包含各种模式,包括理想的猫(以及理想的狗、理想的斑马等)的概念。某种方法可以使图像成为有趣的,但是这并不简单,因为模式分布在整个网络权重中,并且组织在分层结构中。 我们可以使用一种方法,从一个随机图像开始,然后尝试使用梯度下降优化技术调整该图像,使得网络开始认为它是一只猫。

图片优化循环 然而,如果我们这样做,我们将获得与随机噪声非常相似的东西。这是因为有许多种方法可以使网络认为输入图像是一只猫,包括一些在视觉上没有意义的方式。虽然这些图片包含了许多典型的猫特征,但没有什么可以约束它们具有视觉上的区别。 为了改善结果,我们可以在损失函数中添加另一个项,这个项叫做变差损失。这是一个度量,显示图像相邻像素的相似程度。最小化变差损失可以使图像更加平滑,消除噪音 - 从而显示出更具视觉吸引力的模式。这里是这样的“理想”图像的例子,这些图像被高概率地分类为猫和斑马:

理想猫 理想斑马理想猫 理想斑马类似的方法可以用来执行所谓的对抗性攻击。假设我们想欺骗神经网络,让一只狗看起来像一只猫。如果我们拿一只狗的图片,这个网络被识别为狗,然后通过梯度下降优化略微调整它,直到网络开始将其分类为猫:

狗的图片 被分类为猫的狗的图片原始狗的图片 被分类为猫的狗的图片查看代码以重现上述结果在以下笔记本中:https://microsoft.github.io/AI-For-Beginners/lessons/4-ComputerVision/08-TransferLearning/AdversarialCat_TF.ipynb
结论
使用迁移学习,您能够快速为自定义对象分类任务组装一个分类器,并实现高准确性。您可以看到我们现在正在解决的更复杂的任务需要更高的计算能力,不能轻易在CPU上解决。在下一单元中,我们将尝试使用更轻量级的实现来在较低的计算资源上训练相同的模型,结果只是稍微降低准确性。