迁移学习(Transfer Learning )是深度学习的子研究领域,其目标是利用数据、任务或模型之间的相似性,将在旧领域学到的知识迁移到新领域并加以应用。

为了帮助开发人员更容易地应用迁移学习,百度PaddlePaddle开放了预培训模型管理工具PaddleHub。 开发人员只需10行代码就可以完成迁移学习。 本文全面介绍PaddleHub及其应用方法。

项目地址: https://github.com/paddle paddle/paddle hub

PaddleHub 介绍

PaddleHub是一款基于PaddlePaddle开发的预培训模型管理工具,通过预培训模型可以更轻松地进行迁移学习。 其目的是让PaddlePaddle生态的开发人员更轻松地体验大型预培训模式的价值。

PaddleHub目前的预训练模式涵盖图像分类、目标检测、词法分析、传输器、情感分析五大类。 未来,更多类型的深度学习模型将继续开放,包括语言模型、视频分类和图像生成等预训练模型。

命令行工具

PaddleHub可以借鉴Anaconda和PIP等软件包管理理念,开发命令行工具,方便快捷地完成模型检索、下载、安装、预测等功能。 对应的重要命令分别为搜索、下载、安装、run等。 以run命令为例,介绍如何使用命令行工具进行预测。

Run命令用于执行Module预测。 这里分别举出NLP和CV的例子。

对于NLP任务:输入数据由–input_text指定。 以百度LAC模型(中文词法分析)为例,可以通过以下命令实现单行文本分析:

对于CV任务:输入数据由–input_path指定。 以SSD模型(单阶段目标检测)为例,可以通过以下命令预测一张图像。

有关使用更多命令的信息,请参阅文章开头的Github项目链接。

Fine-tune API

PaddleHub提供基于PaddlePaddle实现的精细队列API,重点针对大型预训练模型的精细队列任务进行高阶抽象,使预训练模型更好地服务于用户特定场景的应用大规模的预训练模型与精细- tune相结合,既能在更短的时间内达到模型的收敛,又能具备更好的泛化能力。

图2 PaddleHub Fine-tune API全景

精细- tune :对一个任务进行精细- tune,定期进行验证集的评价。 在精细运行期间,接口定期存储checkpoint (模型和运行数据),如果运行中断,则通过指定上次在运行配置中运行的checkpoint目录,从上次运行的最后一次评估直接返回状态

迁移任务task :在paddle hub中,任务表示精细隧道任务。 任务包括与执行该任务相关的program、与任务相关的一些测量指标(如分类精度accuracy、precision、recall、F1-score等)以及模型丢失。

RunConfig运行配置:在PaddleHub中,RunConfig表示完成任务时的运行配置。 包括执行的epoch次数、batch大小、是否使用GPU培训等。

优化策略strategy :在paddle hub中,strategy类封装了一组用于迁移学习的精细整型策略。 Strategy包括在预训练参数中使用什么样的学习率变化策略,使用什么类型的优化器,使用什么类型的正则化等等。

预培训模型模块:模块表示可执行的模型。 此处的可执行性意味着Module可以直接从命令行hub run ${MODULE_NAME}运行预测,也可以从上下文获取上下文并运行Fine-tune。 生成模块时,支持通过名称、url或路径创建模块。

数据预处理Reader :PaddleHub的数据预处理模块Reader抽象出了常见的NLP和CV任务。

数据集Dataset:PaddleHub提供多个NLP任务和CV任务的数据集,用户还可以在自定义数据集上完成精细- tune,以便用户加载。

基于以上介绍的PaddleHub的两个功能,用户可以一键使用预训练模型进行预测,而无需编写代码; 使用hub download命令快速获取PaddlePaddle生态下的所有预培训模型PaddleHub Fine-tune API,只需少量代码即可完成迁移

移学习。

  以下将从实战角度,教你如何使用 PaddleHub 进行图像分类迁移。

PaddleHub 实战

  1. 安装

  PaddleHub 是基于 PaddlePaddle 的预训练模型管理框架,使用 PaddleHub 前需要先安装 PaddlePaddle,如果你本地已经安装了 CPU 或者 GPU 版本的 PaddlePaddle,那么可以跳过以下安装步骤。

  推荐使用大于 1.4.0 版本的 PaddlePaddle。

  通过以下命令来安装 PaddleHub。

  2. 选择合适的模型

  首先导入必要的 python 包

  接下来我们要在 PaddleHub 中选择合适的预训练模型来 Fine-tune,由于猫狗分类是一个图像分类任务,因此我们使用经典的 ResNet-50 作为预训练模型。PaddleHub 提供了丰富的图像分类预训练模型,包括了最新的神经网络架构搜索类的 PNASNet,我们推荐你尝试不同的预训练模型来获得更好的性能。

  3. 数据准备

  接着需要加载图片数据集。为了快速体验,我们直接加载 PaddleHub 提供的猫狗分类数据集,如果想要使用自定义的数据进行体验,请查看自定义数据。

  4. 自定义数据

  本节说明如何组装自定义的数据,如果想使用猫狗数据集进行体验,可以直接跳过本节。使用自定义数据时,我们需要自己切分数据集,将数据集且分为训练集、验证集和测试集。

  同时使用三个文本文件来记录对应的图片路径和标签,此外还需要一个标签文件用于记录标签的名称。

  训练/验证/测试集的数据列表文件的格式如下

  标签列表文件的格式如下

  使用如下的方式进行加载数据,生成数据集对象

  注意事项:

  1、num_labels 要填写实际的分类数量,如猫狗分类该字段值为 2,food101 该字段值为 101,下文以 2 为例子

  2、base_path 为数据集实际路径,需要填写全路径,下文以/test/data 为例子

  3、训练/验证/测试集的数据列表文件中的图片路径需要相对于 base_path 的相对路径,例如图片的实际位置为/test/data/dog/dog1.jpg,base_path 为/test/data,则文件中填写的路径应该为 dog/dog1.jpg

      5. 生成 Reader

  接着生成一个图像分类的 reader,reader 负责将 dataset 的数据进行预处理,接着以特定格式组织并输入给模型进行训练。

  当我们生成一个图像分类的 reader 时,需要指定输入图片的大小

     6. 组建 Fine-tune Task

  有了合适的预训练模型和准备要迁移的数据集后,我们开始组建一个 Task。

  由于猫狗分类是一个二分类的任务,而我们下载的 cv_classifer_module 是在 ImageNet 数据集上训练的千分类模型,所以我们需要对模型进行简单的微调,把模型改造为一个二分类模型:

  1、获取 cv_classifer_module 的上下文环境,包括输入和输出的变量,以及 Paddle Program;

  2、从输出变量中找到特征图提取层 feature_map;

  3、在 feature_map 后面接入一个全连接层,生成 Task;

  7. 选择运行时配置

  在进行 Fine-tune 前,我们可以设置一些运行时的配置,例如如下代码中的配置,表示:

  use_cuda:设置为 False 表示使用 CPU 进行训练。如果本机支持 GPU,且安装的是 GPU 版本的 PaddlePaddle,我们建议你将这个选项设置为 True;

  epoch:要求 Fine-tune 的任务只遍历 1 次训练集;

  batch_size:每次训练的时候,给模型输入的每批数据大小为 32,模型训练时能够并行处理批数据,因此 batch_size 越大,训练的效率越高,但是同时带来了内存的负荷,过大的 batch_size 可能导致内存不足而无法训练,因此选择一个合适的 batch_size 是很重要的一步;

  log_interval:每隔 10 step 打印一次训练日志;

  eval_interval:每隔 50 step 在验证集上进行一次性能评估;

  checkpoint_dir:将训练的参数和数据保存到 cv_Fine-tune_turtorial_demo 目录中;

  strategy:使用 DefaultFine-tuneStrategy 策略进行 Fine-tune;

  更多运行配置,请查看文首的 Github 项目链接。

       8. 开始 Fine-tune

  我们选择 Fine-tune_and_eval 接口来进行模型训练,这个接口在 Fine-tune 的过程中,会周期性的进行模型效果的评估,以便我们了解整个训练过程的性能变化。

      9. 查看训练过程的效果

  训练过程中的性能数据会被记录到本地,我们可以通过 visualdl 来可视化这些数据。

  我们在 shell 中输入以下命令来启动 visualdl,其中${HOST_IP} 为本机 IP,需要用户自行指定

  启动服务后,我们使用浏览器访问${HOST_IP}:8989,可以看到训练以及预测的 loss 曲线和 accuracy 曲线,如下图所示。

       10. 使用模型进行预测

  当 Fine-tune 完成后,我们使用模型来进行预测,整个预测流程大致可以分为以下几步:

  1、构建网络

  2、生成预测数据的 Reader

  3、切换到预测的 Program

  4、加载预训练好的参数

  5、运行 Program 进行预测

  通过以下命令来获取测试的图片(适用于猫狗分类的数据集)

  注意:其他数据集所用的测试图片请自行准备。

  完整预测代码如下: