(如果想及时收到人工智能相关的知识更新,请点击关注!!) 序言:目前我们每一小节的内容都讲解得非常慢,因为这是人工智能研发中的最基础知识。如果我们不能扎实掌握这些知识,将很难理解后续更复杂且实用的概念。因此,我们甚至采用一个概念一节的方式来编排内容,区分得清清楚楚、明明白白,以便大家能够非常明确地了
序言: 目前我们每一小节的内容都讲解得非常慢,因为这是人工智能研发中的最基础知识。如果我们不能扎实掌握这些知识,将很难理解后续更复杂且实用的概念。因此,我们甚至采用一个概念一节的方式来编排内容,区分得清清楚楚、明明白白,以便大家能够非常明确地了解各知识点之间的关联关系和界限。本节将讲述一种在人工智能领域中被视为“泰斗绝学”的方法,帮助我们高效地完成模型训练——这项绝学就是“迁移学习”。
迁移学习
正如我们在本章中已经看到的那样,使用卷积操作来提取特征是识别图像内容的一个强大工具。生成的特征图可以输入到神经网络的密集层中,与标签匹配,从而更准确地确定图像的内容。通过这种方法,结合一个简单、易于训练的神经网络和一些图像增强技术,我们构建了一个模型,在非常小的数据集上训练时,能够以80-90%的准确率区分马和人。
图 3-14. 卷积神经网络架构
但是我们可以通过一种叫做迁移学习的方法进一步改进我们的模型。迁移学习的理念很简单:与其从零开始为我们的数据集学习一组滤波器,为什么不使用一个在更大数据集上学习到的滤波器集合呢?该数据集包含了比我们自己“从零开始构建”所能负担得起的更多特征。我们可以将这些滤波器放入我们的网络中,然后使用这些预学习的滤波器训练一个适合我们数据的模型。例如,我们的马或人数据集只有两个类别,而我们可以使用一个已经为一千个类别预训练过的现有模型,但到某个阶段我们不得不舍弃部分已有的网络结构,添加适合两分类的层来构建分类器。
图 3-15. 通过迁移学习从另一个架构中获取层
当我们考虑到,一旦这些层被训练好,它们实际上只是一些数字,表示滤波器的值、权重和偏置,配合一个已知的架构(每层滤波器的数量、滤波器的大小等),那么重用它们的想法就非常直接了当了。
让我们看看代码中的实现。这方面有很多预训练的模型可以使用。我们将使用来自谷歌的流行模型Inception的第3版,它在一个名为ImageNet的数据库中用超过一百万张图片进行了训练。该模型有几十层,可以将图像分类为一千个类别。一个包含预训练权重的已保存模型也已经可以使用。要使用它,我们只需下载这些权重,创建一个Inception V3架构的实例,然后将这些权重加载到这个架构中,代码如下:
图 3-16. 使用迁移学习训练马或人分类器
这里的结果比我们之前的模型要好得多,但你可以继续进行微调和改进。你还可以试试这个模型在更大数据集上的表现,比如Kaggle上著名的猫狗大战(Dogs vs. Cats)。这是一个非常多样化的数据集,包含了25,000张猫和狗的图片,很多图片中的主体都有一定遮挡——比如被人抱着的情况下。
使用之前的同样算法和模型设计,你可以在Colab上训练一个猫狗分类器,利用GPU每个周期大约3分钟。训练20个周期,大约需要1小时。
在测试一些非常复杂的图片时(如图3-17所示),这个分类器全都判断正确。我特意选择了一张长着像猫耳朵的狗的图片,还有一张背对着的狗的图片。另外两张猫的图片也都是非典型的。
图 3-17. 成功分类的非典型猫狗图片
右下角的那只猫,闭着眼睛、耳朵下垂、伸着舌头舔爪子,把它加载到模型中时,得到了图3-18中的结果。你可以看到,它给出了一个非常低的值(4.98 × 10???),这表明网络几乎可以确定它是一只猫!
图 3-18. 分类舔爪子的猫
你可以在作者的一个GitHub仓库中找到马或人分类器以及猫狗分类器的完整代码。
本节我们介绍了使用“迁移学习”的方法来完成模型训练,省去了繁琐的前期训练过程,通过迁移已有知识并结合少量数据进行微调即可实现模型的适应性。这种方法是通用的,适用于小型神经网络,同样也适用于如2024年Facebook的开源大型语言模型Llama等知名大模型。在这些预训练模型的基础上,迁移学习可以有效节省大量GPU资源的预训练成本。下一节我们要讲解的也是人工智能模型训练中的很重要的技能“随机失活”法。
小编推荐阅读