热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

PaddlePaddle升级解读|十余行代码完成迁移学习,PaddleHub实战篇

迁移学习(TransferLearning)是属于深度学习的一个子研究领域,该研究领域的目标在于利用数据、任务、或模型之间的相似性,将在旧领域学习过的知

迁移学习 (Transfer Learning) 是属于深度学习的一个子研究领域,该研究领域的目标在于利用数据、任务、或模型之间的相似性,将在旧领域学习过的知识,迁移应用于新领域中。迁移学习吸引了很多研究者投身其中,因为它能够很好的解决深度学习中的以下几个问题:

  • 一些研究领域只有少量标注数据,且数据标注成本较高,不足以训练一个足够鲁棒的神经网络

  • 大规模神经网络的训练依赖于大量的计算资源,这对于一般用户而言难以实现

  • 应对于普适化需求的模型,在特定应用上表现不尽如人意

为了让开发者更便捷地应用迁移学习,百度 PaddlePaddle 开源了预训练模型管理工具 PaddleHub。开发者用使用仅仅十余行的代码,就能完成迁移学习。本文将为读者全面介绍 PaddleHub 并其应用方法。

项目地址:https://github.com/PaddlePaddle/PaddleHub

PaddleHub 介绍

PaddleHub 是基于 PaddlePaddle 开发的预训练模型管理工具,可以借助预训练模型更便捷地开展迁移学习工作,旨在让 PaddlePaddle 生态下的开发者更便捷体验到大规模预训练模型的价值。

PaddleHub 目前的预训练模型覆盖了图像分类、目标检测、词法分析、Transformer、情感分析五大类别。未来会持续开放更多类型的深度学习模型,如语言模型、视频分类、图像生成等预训练模型。PaddleHub 的功能全景如图 1 所示。

# 使用本地数据集
class MyDataSet(hub.dataset.base_cv_dataset.ImageClassificationDataset):def __init__(self):self.base_path = "/test/data"self.train_list_file = "train_list.txt"self.test_list_file = "test_list.txt"self.validate_list_file = "validate_list.txt"self.label_list_file = "label_list.txt"self.label_list = Noneself.num_labels = 2

5. 生成 Reader

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

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

data_reader = hub.reader.ImageClassificationReader(image_width=module.get_expected_image_width(),image_height=module.get_expected_image_height(),images_mean=module.get_pretrained_images_mean(),images_std=module.get_pretrained_images_std(),dataset=dataset)

6. 组建 Fine-tune Task

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

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

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

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

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

input_dict, output_dict, program = module.context(trainable=True)img = input_dict["image"]
feature_map = output_dict["feature_map"]task = hub.create_img_cls_task(feature=feature_map, num_classes=dataset.num_labels)feed_list = [img.name, task.variable("label").name]

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 项目链接。

config = hub.RunConfig(use_cuda=False,num_epoch=1,checkpoint_dir="cv_finetune_turtorial_demo",batch_size=32,log_interval=10,eval_interval=50,strategy=hub.finetune.strategy.DefaultFinetuneStrategy())

8. 开始 Fine-tune

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

hub.finetune_and_eval(task, feed_list=feed_list, data_reader=data_reader, config=config)

9. 查看训练过程的效果

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

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

$ visualdl --logdir ./ cv_finetune_turtorial_demo/vdllog --host ${HOST_IP} --port 8989

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

import os
import numpy as np
import paddle.fluid as fluid
import paddlehub as hub# Step 1: build Program
module_map = {"resnet50": "resnet_v2_50_imagenet","resnet101": "resnet_v2_101_imagenet","resnet152": "resnet_v2_152_imagenet","mobilenet": "mobilenet_v2_imagenet","nasnet": "nasnet_imagenet","pnasnet": "pnasnet_imagenet"
}module_name = module_map["resnet50"]
module = hub.Module(name = module_name)
input_dict, output_dict, program = module.context(trainable=False)
img = input_dict["image"]
feature_map = output_dict["feature_map"]dataset = hub.dataset.DogCat()
task = hub.create_img_cls_task(feature=feature_map, num_classes=dataset.num_labels)
feed_list = [img.name]# Step 2: create data reader
data = ["test_img_dog.jpg","test_img_cat.jpg"
]data_reader = hub.reader.ImageClassificationReader(image_width=module.get_expected_image_width(),image_height=module.get_expected_image_height(),images_mean=module.get_pretrained_images_mean(),images_std=module.get_pretrained_images_std(),dataset=None)predict_reader = data_reader.data_generator(phase="predict", batch_size=1, data=data)label_dict = dataset.label_dict()# Step 3: switch to inference program
with fluid.program_guard(task.inference_program()):# Step 4: load pretrained parametersplace = fluid.CPUPlace()exe = fluid.Executor(place)pretrained_model_dir = os.path.join("cv_finetune_turtorial_demo", "best_model")fluid.io.load_persistables(exe, pretrained_model_dir)feeder = fluid.DataFeeder(feed_list=feed_list, place=place)# Step 5: predictfor index, batch in enumerate(predict_reader()):result, = exe.run(feed=feeder.feed(batch), fetch_list=[task.variable('probs')])predict_result = np.argsort(result[0])[::-1][0]print("input %i is %s, and the predict result is %s" %(index+1, data[index], label_dict[predict_result]))

WAVE SUMMIT2019深度学习开发者峰会上,PaddlePaddle对外发布了“AI Studio亿元算力支持计划”。很多已经用上Tesla v100的小伙伴好评不断,期待获取更多算力。在此小PP发起一轮关于算力的投票,请大家选出你更喜欢的算力获取方式吧!


推荐阅读
author-avatar
aijunli2502898197
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有