比Pytorch Hub更早?三分钟带你弄懂PaddleHub!

栏目: Python · 发布时间: 7年前

内容简介:Hub是什么?Hub本意是中心,docker有docker Hub,大家可以把自己创建的镜像打包提交到docker hub上,需要的时候再pull下来,非常方便,那么模型是不是也可以这样玩呢?完全可以啊!很多时候我们不需要从头开始训练模型,如果有预训练好的模型,直接做迁移学习就可以,但是传统的方式基本上都需要从各个官网上去下载,模型比较大,用起来并不轻量。现在各家都发布了Hub ,可以直接从Hub上下载pretrain模型做finetune或预测,极大的减轻了工作量。下面直接从四个维度对比下Pytorch

作者: Charlotte77

微信公众号: 我爱PaddlePaddle

Hub是什么?Hub本意是中心,docker有docker Hub,大家可以把自己创建的镜像打包提交到docker hub上,需要的时候再pull下来,非常方便,那么模型是不是也可以这样玩呢?完全可以啊!很多时候我们不需要从头开始训练模型,如果有预训练好的模型,直接做迁移学习就可以,但是传统的方式基本上都需要从各个官网上去下载,模型比较大,用起来并不轻量。现在各家都发布了Hub ,可以直接从Hub上下载pretrain模型做finetune或预测,极大的减轻了工作量。下面直接从四个维度对比下Pytorch Hub和PaddleHub~

Pytorch Hub V.S PaddleHub

支持模型数量

Pytorch Hub 目前支持18个模型,PaddleHub支持29个,包含16个model和13个module,model可以直接使用,module提供了预训练模型的参数,支持命令行调用,下面来看看分别支持哪些模型:

比Pytorch Hub更早?三分钟带你弄懂PaddleHub!

Pytorch Hub目前支持18种模型

比Pytorch Hub更早?三分钟带你弄懂PaddleHub!

PaddleHub目前支持29种模型(包含model和module)

从图中可以看到,PaddleHub 支持的模型数量有绝对的优势 ;而Pytorch Hub涉及的方向更多,但是每个方向的模型并不多,对CV的支持更多;PaddleHub涉及的方向只有两个,CV和NLP,但是 对NLP的支持尤其多 ,高达22个,不仅包括目前最潮的BERT,还有百度自己研发的知识增强语义表示模型 ERNIE ,在多个中文NLP任务中 表现超过BERT

是否支持命令行运行

目前Pytorch Hub不支持命令行运行,但PaddleHub支 持,命令行运行就是指我们安装PaddleHub后,可以无需进入 python 环境,即可快速体验PaddleHub无需代码、一键预测的命令行功能。需要注意的是,在PaddleHub中,既可以支持命令行使用,即在终端输入,如下所示:

$ hub run XXX(nlp模型) --input_text XXX(需要预测的内容) 
$ hub run XXX(cv模型) --input_path XXX(需要预测的内容)

也可以支持调用api,如下所示:

import paddlehub as hub 

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

实际上,PaddleHub为Model和Module的管理和使用都提供了命令行工具,但是model和module是有区别的,一个是模型,一个是模块。 

model表示预训练好的参数和模型 ,当需要使用Model进行预测时,需要模型配套的代码,进行模型的加载,数据的预处理等操作后,才能进行预测。我们在使用PaddleHub来调用模型时,可以使用hub download 命令获取到最新的model再进行实验。 module是model的一个可执行模块 ,简单来说,一个Module可以支持直接命令行预测,也可以配合PaddleHub Finetune API,通过少量代码实现迁移学习。需要注意的是,不是所有的Module都支持命令行预测; (例如BERT/ERNIE Transformer类模型,一般需要搭配任务进行finetune) 也不是所有的Module都可用于finetune(例如LAC词法分析模型,我们不建议用户用于finetune),具体区别请见PaddleHub的github wiki(参考文献2)

是否支持Fine-tune

PyTorch Hub 没有Fine-tune接口,PaddleHub可以支持直接从hub调用Fine-tune 的api 。在https://pytorch.org/官网下的文档中可以看到,目前Pytorch Hub不支持hub一键式fine-tuning,现有模型的finetuning还是基于传统的脚本式调参。

PaddleHub在Fine-tune这一块做的很完善,在前一个板块也给大家详细举了示例讲解,在PaddleHub的官方GitHub中,有非常详细的Fine-tune教程,大家可以参考:

PaddleHub图像分类迁移 : 

https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub 图像分类迁移教程 

PaddleHub文本分类迁移

https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub文本分类迁移教程

是否支持用户自定义上传模型

PyTorch Hub 支持,PaddleHub不支持 。我看了https://pytorch.org/官网下的文档,只需要在开源的模型代码里增加了一个hubconf.py, 然后在pytorch/hub里提一个pr,cr后merge到 branch/tag 这个分支就ok了。方法非常简单,代码也不复杂。

torch.hub.load(github, model, force_reload=False, *args, **kwargs)

PaddleHub目前暂时还不支持用户自己提交新模型,但后期应该会支持这个功能,到时候希望大家能踊跃使用,push自己的新模型哦~

总结一下四个维度的比较:

比Pytorch Hub更早?三分钟带你弄懂PaddleHub!

总之,从这四个维度上,我个人感觉Pytorch Hub更像一个小工具,帮助大家迅速试用一下开源的新模型,但是真正到实际应用,还是要基于老的一套的fine-tuning,不能直接从hub里调用fine-tune的api,所以并不实用。  从工业级实用的角度来说 PaddleHub做的要更成熟一些 ,用户可以更方便的使用PaddleHub来进行Fine-tune。

下面,我们具体来看看PaddleHub 如何直接使用命令行 ,调用一行代码show出结果&  使用Finetune Api来对模型进行微调 ,并举一个实例教大家一步一步实现。

一行命令调用,直接输出结果

PaddleHub安装

  • 环境依赖

    • Python==2.7 or Python>=3.5

    • PaddlePaddle>=1.4.0

  • 安装

    • pip install paddlehub

命令行快速体验

安装好后,不需要进入python环境import就可以直接先体验hub的便捷,因为在PaddleHub中hub可以作为一个独立的模块直接运行。PaddleHub目前包含图像分类、目标检测、词法分析、Transformer、情感分析五大类。

一行代码预测

  • 分词

# 使用百度LAC进行分词 • 
$ hub run lac --input_text "今天的你真好看"
[{'tag': ['TIME', 'u', 'r', 'd', 'a'], 'word': ['今天', '的', '你', '真', '好看']}]
  • 情感分析

# 使用百度Senta情感分析模型对句子进行预测 
$ hub run senta_bilstm --input_text "老铁666,带你开黑"
[{'text': '老铁666,带你开黑',
'sentiment_key': 'positive', 'sentiment_label': 2, 'positive_probs': 0.72
06, 'negative_probs': 0.2794}]
  • 目标检测

#使用SSD检测模型对图片进行目标检测 
hub run ssd_mobilenet_v1_pascal --input_path test_img_bird.jpg

检测结果:

比Pytorch Hub更早?三分钟带你弄懂PaddleHub!

  • 图像识别

# 使用resnet-50做图像识别 
hub run resnet_v2_50_imagenet --input_path test_img_bird.jpg
Install Module resnet_v2_50_imagenet
Downloading resnet_v2_50_imagenet
[==================================================] 100.00%
Uncompress /root/.paddlehub/cache/resnet_v2_50_imagenet
[==================================================] 100.00%
Successfully installed resnet_v2_50_imagenet-1.0.0
[[{'brambling': 0.4907981}]]

注:模型未下载时会先下载再预测,也可以先试用hub install model_name 下载好模型再使用hub run预测,也可直接运行hub run。hub一共有十个命令,其他命令可参考PaddleHub命令行工具(参考文献2)

支持29种模型

PaddleHub目前支持29种模型,主要以CV和NLP模型为主,包括NLP目前最火的BERT和百度自己自己研发开源的ERNIE,以及CV中的ssd-mobilenet、resnet-50、resnet-152等。

  • NLP预测

数据通过 —input_text或—input_file导入来实现单次预测和批量预测

# 单文本预测 
hub run lac --input_text "今天是个好日子"
# 多文本分析
hub run lac --input_file test.txt
  • CV预测

数据通过—input_path或—input_file导入来实现单次预测和批量预测

# 单张照片预测 
hub run ssd_mobilenet_v1_pascal --input_path test.jpg
# 多张照片预测
hub run ssd_mobilenet_v1_pascal --input_file test.txt

支持迁移学习,Fine-tune更Easy

Fine-tune全景图

比Pytorch Hub更早?三分钟带你弄懂PaddleHub!

PaddleHub+Finetune流程图

比Pytorch Hub更早?三分钟带你弄懂PaddleHub!

PaddleHub Finetune api

Fine-tune是迁移学习中使用最多的方式之一,通常我们可以在预训练好的模型上进行微调来实现模型迁移,从而达到模型适应新领域(Domain)数据的目的。上图是做一个完整的迁移学习需要的步骤,下面举个实例教大家如何用PaddleHub做图像分类迁移学习。

1. 准备工作

安装 PaddlePaddle PaddleHub

pip install paddlepaddle( 推荐安装1.4.0版本以上) 
pip install paddlehub

2. 选择模型

此处使用经典的 ResNet-50 作为预训练模型

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)

3. 准备数据

# 直接用PaddleHub提供的数据集 
dataset = hub.dataset.DogCat()# 生成readerdata_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)

4. 组建 Finetune Task

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

1.  获取 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]# 设置
configconfig = 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())

5. 启动 Fine-tune 并查看效果

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

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

训练过程中的性能数据会被记录到本地,我们可以通过 VisualDL 来可视化这些数据。我们在 shell 中输入以下命令来启动 VisualDL ,其中 ${HOST_IP} 为本机 IP ,需要用户自行指定

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

启动服务后,我们使用浏览器访问 ${HOST_IP}:8989 ,可以看到训练以及预测的 loss 曲线和 accuracy 曲线。最后再按照常规流程对模型进行预测即可。

参考资料: 

1.PaddleHub官方github:

https://github.com/PaddlePaddle/PaddleHub 

2.PaddleHub命令行工具:

https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub命令行工具 

3.Paddle-code:

https://github.com/huxiaoman7/PaddlePaddle_code 

4.Paddle-models:

https://github.com/PaddlePaddle/models 

5.Pytorch Hub:

https://pytorch.org/blog/towards-reproducible-research-with-pytorch-hub/

ps:最后给大家推荐一个GPU福利-Tesla V100免费算力!配合PaddleHub能让模型原地起飞~扫码下方二维码申请~

比Pytorch Hub更早?三分钟带你弄懂PaddleHub!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

High Performance Python

High Performance Python

Micha Gorelick、Ian Ozsvald / O'Reilly Media / 2014-9-10 / USD 39.99

If you're an experienced Python programmer, High Performance Python will guide you through the various routes of code optimization. You'll learn how to use smarter algorithms and leverage peripheral t......一起来看看 《High Performance Python》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具