4.4 上手实践

本章对迁移学习的方法进行了总体介绍。在本节中,我们将编写代码,建立迁移学习的基线模型,并简要介绍本书使用的数据集,为后续章节的上手实践部分打下基础。

本书所有的代码实例均使用Python作为主要编程语言。Python作为人工智能和机器学习时代最流行的编程语言之一,在传统机器学习和深度学习方面均有着广泛的应用。许多常用的数据科学框架,例如Numpy、Pandas、scikit-learn、Scipy等均使用Python作为主要编程接口;一些深度学习的主流框架,例如PyTorch、TensorFlow、MXNet等也为Python提供了丰富的支持。在余下的内容中,我们假定读者具有基本的编码能力与Python知识。

4.4.1 数据准备

如同近十年来计算机视觉领域的基准测试数据集是ImageNet一样,迁移学习领域的算法开发和测试,也对应了一些主流的基准测试数据集。迁移学习的主流基准测试数据集包括:

• 物体识别数据集。如Office-31、Office-Home等。

• 手写体识别数据集。如MNIST、USPS、SVHN等。

• 文本情感分类数据集。如Amazon Review Dataset、20Newsgroup、Reuters-21578等。

• 图像分类数据集。如ImageNet、VisDA等。

• 人脸识别数据集。如CMU-PIE等。

• 行为识别数据集。如DSADS、Opportunity等。

本书并不打算详细介绍这些主流数据集。事实上,在任何一个特定的应用领域,只要问题设定符合迁移学习的要求,均可以构建出适合当前情景的数据集。例如,在NLP任务中,跨语言(Cross-lingual)的任务天然就是一个迁移学习任务。这个网页[1]上展示了众多迁移学习的公开数据集信息。本书的附录中也介绍了这些常用数据集的基本信息。

为确保书中上手实践部分的一致性,本书统一采用Office-31对象识别数据集作为所有上手实践部分的测试数据集。对于其他数据集,读者可十分方便地遵循特定的预处理过程对数据集进行替换。此外,由于我们的重点是研究通用算法而非在特定的应用领域进行调优,因此,数据集仅为测试算法性能使用。在实际应用中,需要结合应用背景进行细致的调优,使算法达到最优的表现。

Office-31 [Saenko et al.,2010]是视觉迁移学习的主流基准数据集,包含Amazon(在线电商图片)、Webcam(网络摄像头拍摄的低解析度图片)、DSLR(单反相机拍摄的高解析度图片)3个对象领域,共有4110张图片,31个类别标签。由于这三个对象领域的数据均服从不同的数据分布,因此,从中随机选取2个不同的领域作为源领域和目标领域,我们可以构造3 × 2=6个跨领域视觉对象识别的任务:ADAW,···,WA。这三个领域的数据样本如图4.3所示。从图中可以清晰地看出,不同领域中的数据即使属于同一类别,也服从不同的数据分布(即光照、角度、背景等的不同)。

图4.3  Office-31数据集样本示意

Office-31数据集的原始数据为图片格式,此格式可以直接被用于深度学习方法的输入,因此无须额外提取特征。然而,对于传统方法而言,其通常需要输入提取的特征进行后续处理。因此,我们对Office-31数据提取其DeCAF特征(即用AlexNet [Krizhevsky et al.,2012]网络提取的特征)作为传统方法的输入数据。读者不需要关心DeCAF特征的计算方式,只需了解在传统方法中,并不直接采用原始的图片数据,而是将图片的DeCAF特征作为输入数据。

为同时测试传统方法与深度方法,读者需要在以下链接下载数据集:

• 原始图片数据:请见链接4-2。

• DeCAF特征数据:请见链接4-3。

下载完成后,解压并整理到相应的文件夹中。图4.4展示了Office-31数据集的原始数据集情况,每一个领域对应于31个文件夹,每个文件夹对应于相应类别的图片数据。

图4.4 Office-31数据集

4.4.2 基准模型构建:KNN

为了与迁移学习对比,我们以K近邻分类器(KNN)作为传统方法的代表。我们构建一个KNN分类器并使用它对Office-31数据集的数据进行跨领域分类。

我们用下面的函数加载一个文件夹(folder)下的一个领域(domain)的数据,并返回它的特征和类别。

接着,我们借助scikit-learn工具包构建一个KNN分类器,接受源域和目标域的特征(X)和标签(Y),分类后输出分类精度。

最后,在主函数中对上述两个函数进行调用即可完成最简单的用KNN进行分类的例子。在本实例中源域为amazon,目标域为webcam。读者可自由更换为其他的领域。

图4.5为上述运行的输出。我们看到源域共有2817个样本,目标域则有795个样本。由amazon到webcam使用KNN分类器的结果为48.18%。

图4.5  KNN分类器的运行结果

使用归一化将特征变换到0均值1方差后,使用KNN分类器的分类结果如图4.6所示,分类精度提高到50.44%。

图4.6  KNN分类器+特征归一化后的运行结果

完整的代码可以从本书的配套网络资源中获取。在余下的章节中,我们将会围绕此数据集,运用不同的迁移学习方法来提高其精度。

基于深度学习的方法不在本章中介绍,请感兴趣的读者直接参考8.6节的内容。