前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重磅! | 比Pytorch Hub更早?三分钟带你弄懂Paddle Hub!  

重磅! | 比Pytorch Hub更早?三分钟带你弄懂Paddle Hub!  

作者头像
kbsc13
发布2019-08-16 15:37:14
1.6K0
发布2019-08-16 15:37:14
举报
文章被收录于专栏:AI 算法笔记AI 算法笔记

这是小编转载的第 26 篇好文

来源:Charlotte数据挖掘

作者:Charlotte77

关注&置顶“Charlotte数据挖掘

每日9:00,干货速递!

By Charlotte77

前言:昨天看到一条爆炸性新闻—"PyTorch Hub发布!一行代码调用最潮模型",在我们调参圈简直震惊了!要是所有模型都能一行命令解决,我也不用一天到晚当调参这么苦兮兮T_T。不过我突然想起,上个月我还用过PaddleHub做Fine-tune,很好用,咋没人推荐呢?好用的东西当然要跟大家分享,所以我做了一个非官方测评,三分钟带大家了解PaddleHub!

关键词:PaddleHub PyTorchHub 模型库 迁移学习

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

PytorchHub V.S PaddleHub

支持模型数量

PytorchHub 目前支持18个模型,PaddleHub支持29个,下面来看看分别支持哪些模型:

PytorchHub目前支持18种模型

PaddleHub目前支持29中模型

从图中可以看到,PaddleHub支持的模型数量有绝对的优势;而PytorchHub涉及的方向更多,但是每个方向的模型并不多,对CV的支持更多;PaddleHub涉及的方向只有两个,CV和NLP,但是对NLP的支持尤其多,高达22个,不仅包括目前最潮的BERT,还有百度自己研发的知识增强语义表示模型Ernie,在多个中文NLP任务中表现超过BERT,除此之外还有对话系统的一系列模型,做智能客服、智能音箱的同学可以使用一下~

是否支持命令行运行

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

代码语言:javascript
复制
hub run XXX(模型) --input_text XXX(需要预测的内容)

也可以支持调用api

代码语言:javascript
复制
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)

是否支持Fine-tune

PyTorchHub 不支持Fine-tune,PaddleHub支持。这一点倒是挺让人意外的,如果通过hub加载了预训练模型,但是无法Fine-tune,那有什么意义呢?仅仅只是为了试试paper中的效果好不好吗?本来我还对此颇有怀疑,于是去看了pytorchhub.org官网下的文档,发现目前pytorchhub确实不支持hub一键式fine-tuning,现有模型的finetuning还是基于传统的脚本式调参。

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

PaddleHub图像分类迁移

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

PaddleHub文本分类迁移

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

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

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

代码语言:javascript
复制
torch.hub.load(github, model, force_reload=False, *args, **kwargs)

PaddleHub目前暂时还不支持用户自己提交新模型,但是据可靠消息表示:预计7月份就会支持这个功能,到时候希望大家能踊跃使用,push自己的新模型哦~

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

总之,从这四个维度上,我个人感觉PytorchHub更像一个小工具,帮助大家迅速试用一下开源的新模型,但是真正到实际应用,还是要基于老的一套的fine-tuning,不能直接从hub里调用fine-tune的api,所以并不实用。对于迁移学习来说,Fine-tune是必不可少的,虽然我们有预训练的模型,但是新任务的场景和数据都不相同,直接使用预训练模型其实很难得到很好的效果,所以从工业级实用的角度来说,PaddleHub做的要更成熟一些,等7月份支持了用户自定义上传模型后大家可以多体验体验。


下面,我们具体来看看PaddleHub如何直接使用命令行,调用一行代码show出结果& 使用Finetune Api来对模型进行微调,并举一个实例教大家一步一步实现。(ps:文末还有福利赠送哦!

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

PaddleHub安装

  • 环境依赖
    • Python==2.7 or Python>=3.5
    • PaddlePaddle>=1.4.0
  • 安装 pip install paddlehub

命令行快速体验

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

一行代码预测

  • 分词
代码语言:javascript
复制
# 使用百度词法分析工具LAC进行分词
$ hub run lac --input_text "今天的你真好看"
[{'tag': ['TIME', 'u', 'r', 'd', 'a'], 'word': ['今天', '的', '你', '真', '好看']}]
  • 情感分析
代码语言:javascript
复制
# 使用百度Senta情感分析模型对句子进行预测
$ hub run senta_bilstm --input_text "老铁666,带你开黑"
[{'text': '老铁666,带你开黑', 'sentiment_key': 'positive', 'sentiment_label': 2, 'positive_probs': 0.7206, 'negative_probs': 0.2794}]
  • 目标检测
代码语言:javascript
复制
#使用SSD检测模型对图片进行目标检测
hub run ssd_mobilenet_v1_pascal --input_path test_img_bird.jpg

检测结果

  • 图像识别
代码语言:javascript
复制
代码语言:javascript
复制
# 使用resnet-50做图像识别
代码语言:javascript
复制
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 download model_name 下载好模型再使用hub run预测,也可直接运行hub run。hub一共有十个命令,其他命令可参考PaddleHub命令行工具[1]

支持29种模型

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

  • NLP预测

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

代码语言:javascript
复制
# 单文本预测
hub run lac --input_text "今天是个好日子"
# 多文本分析
hub run lac --input_file test.txt
  • CV预测 数据通过—input_path或—input_file导入来实现单次预测和批量预测
代码语言:javascript
复制
# 单张照片预测
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全景图

PaddleHub+Finetune流程图

PaddleHub Finetune api

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

1.准备工作


  • 安装paddlepaddle和paddlehub
代码语言:javascript
复制
pip install paddlepaddle( 推荐安装1.4.0版本以上)pip install paddlehub

2.选择模型


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


代码语言:javascript
复制
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.准备数据


代码语言:javascript
复制
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

代码语言:javascript
复制
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的过程中,会周期性的进行模型效果的评估,以便我们了解整个训练过程的性能变化。

代码语言:javascript
复制
hub.finetune_and_eval(
    task, feed_list=feed_list, data_reader=data_reader, config=config)

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

代码语言:javascript
复制
$ 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


福利时间

为了方便大家使用,我在百度AI Studio上给大家创建了两个notebook项目,AI Studio上可以直接体验PaddleHub,项目地址:

代码语言:javascript
复制
https://aistudio.baidu.com/aistudio/projectdetail/70489

大家Fork后,直接点击"运行项目"即可,点击后会弹出:

如果大家没有GPU算力卡,只能选择CPU来运行,但是非常慢 = =!我之前参加活动积攒了一批算力卡,这里免费分享给大家作为福利,

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法猿的成长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PytorchHub V.S PaddleHub
  • 实际上,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)
  • 一行命令调用,直接输出结果
  • 支持迁移学习,Fine-tune更Easy
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档