PaddleHub 1.0: 一键模型加载,十行代码完成迁移学习

转载于:https://mp.weixin.qq.com/s/5TXHnx64-1pqTeJHZdwa5A

项目地址:https://github.com/PaddlePaddle/PaddleHub?fr=lzw2

下载最新版本的Paddle Fluid v1.5,查看以下链接:http://www.paddlepaddle.org.cn?fr=lzw2

1. 介绍

  • 飞桨(PaddlePaddle)核心框架Paddle Fluid v1.5已经发布,而作为其关键工具,用来迁移学习的PaddleHub也进行了全面更新,正式发布了1.0版本。
  • 全新的PaddleHub模型和任务更加丰富,为用户提供了覆盖文本、图像和视频三大领域八大任务的40+预训练模型,同时还在飞桨官网上开辟了PaddleHub的网页。

2. PaddleHub是什么

  • 深度学习模型的价值在AI时代不断增大。要想得到一个高质量的深度学习模型,离不开4个要素,优秀的算法、充足的算力、丰富的数据以及专家知识。大家在深度学习中常常遇到以下问题:
      一些研究领域只有少量标注数据,且数据标注成本较高,不足以训练一个足够鲁棒的神经网络
      大规模神经网络的训练依赖于大量的计算资源,这对于一般用户而言难以实现
      应对于普适化需求的模型,在特定应用上表现不尽如人意
  • PaddleHub就是为了解决对深度学习模型的需求而开发的工具。它基于飞桨领先的核心框架,精选效果优秀的算法,提供了百亿级大数据训练的预训练模型,方便用户不用花费大量精力从头开始训练一个模型。PaddleHub可以便捷地获取这些预训练模型,完成模型的管理和一键预测。
  • 配合使用Fine-tune API,可以基于大规模预训练模型快速完成迁移学习,让预训练模型能更好地服务于用户特定场景的应用。

3. PaddleHub有什么特色

  • 通过PaddleHub,开发者可以便捷地获取飞桨生态下的所有预训练模型,涵盖了图像分类、目标检测、词法分析、语义模型、情感分析、语言模型、视频分类、图像生成八类主流模型40余个,如图1 所示。飞桨还发布了PaddleHub的官方网页,对各个预训练模型的应用提供了详实的介绍。
  • PaddleHub引入了模型即软件的概念,通过Python API或者命令行工具,一键完成预训练模型地预测。此外还借鉴了Anaconda和pip软件包管理的理念设计了一套命令行接口。
  • 同时模型会有版本的概念,通过不断迭代升级的方式提升我们模型的效果。通过命令行工具,可以方便快捷的完成模型的搜索、下载、安装、预测等功能,对应的关键的命令分别是search,download,install,run等。
  • 如以下示例,在安装完成飞桨和PaddleHub以后(具体安装方法见后文示例),使用词法分析模型LAC,可以一键实现分词。
$ hub run lac --input_text "今天是个好日子"
[{'word': ['今天', '是', '个', '好日子'], 'tag': ['TIME', 'v', 'q', 'n']}]
  • 再如以下示例所示,是一个目标检测的例子,通过hub run 调用不同的目标检测模型,一行即可完成预测,同时也可以快速体验哪个模型能更符合开发的需求。
$ hub run yolov3_coco2017 --input_path test.jpg 
$ hub run faster_rcnn_coco2017 --input_path test.jpg
  • 通过PaddleHub Fine-tune API,结合少量代码即可完成大规模预训练模型的迁移学习。下面一节我们也会全面介绍PaddleHub的API。

4. PaddleHub API全景

  • 为了更好帮助用户更好的应用预训练模型,PaddleHub对Fine-tune做了6个层次的抽象。
  • PaddleHub还支持用户可以通过继承BasicTask来实现自己的任务。
  • PaddleHub封装了finetune、eval、finetune_and_eval、predict等直观的基础接口,让开发者更方便完成模型的迁移和应用。

5.如何快速开始

  • 接下来本文结合实际案例,讲述如何快速使用PaddleHub实现十行代码完成文本分类迁移。场景是标注数据不多中文文本分类场景,如何提高分类的精度和模型的泛化能力。这里的方案是借助ERNIE + PaddleHub Finetune API,除去安装,只想要5个步骤,10行代码即可解决这一问题。这里先介绍一下ERNIE,它是百度发布的知识增强的预训练模型,通过建模海量数据中的词、实体及实体关系,学习真实世界的语义知识。具体来说,ERNIE 模型通过对词、实体等语义单元的掩码,使得模型学习完整概念的语义表示。相较于 BERT 学习原始语言信号,ERNIE 直接对先验语义知识单元进行建模,增强了模型语义表示能力。ERNIE在多个公开的中文数据集上进行了效果验证,包括语言推断、语义相似度、命名实体识别、情感分析、问答匹配等自然语言处理各类任务上,均超越了语义表示模型 BERT 的效果。

6. 实战演练PaddleHub

  6.1.安装

$ pip install paddlepaddle  #CPU安装命令
$ pip install paddlepaddle-gpu # GPU安装
# 以上命令是安装CPU或者GPU版本的飞桨。通过以下命令则可以安装PaddleHub。
$ pip install paddlehub
  • 另外,PaddleHub内置了深度学习可视化工具VisualDL的依赖,通过VisualDL,可以很好的对深度学习任务进行可视化。
      6.2.选择预训练模型
  • 在完成安装飞桨与PaddleHub,import导入相应模块后,一行代码即可加载预训练模型。只要1分钟,你就能得到万级别GPU小时训练出来的ERNIE模型。当然也可以支持BERT模型调用,只需要更换不同的模型名称即可。
import paddle.fluid as fluid
import paddlehub as hub
module = hub.Module(name="ernie")
inputs, outputs, program = module.context(trainable=True, max_seq_len=128)
  • 第二步是获取模型上下文,包括了预训练模型的输入Tensor,输出Tensor还有计算图。这里面有个关键参数是trainable。如果trainable为True,那么就是一个fine-tune的任务,预训练模型的参数会做微调,以更好的适应顶层的应用、如果trainable为False,那么就预训练模型参数保持不变,将它当作特征提取器。对于ERNIE模型而言,不推荐使用特征提取,一定要通过Finetune的方式才能取得更好的效果。
      6.3. 数据处理
  • 选择模型后就是进行数据预处理,针对不同的迁移任务做了一系列数据处理的封装。
dataset = hub.dataset.ChnSentiCorp()
reader = hub.reader.ClassifyReader(
    dataset=dataset,
    vocab_path=module.get_vocab_path(),
    max_seq_len=128)
  • hub.dataset.ChnSentiCorp() 会自动从网络下载数据集并解压到用户目录下。
      6.4. 策略配置
  • 接下来开始配置Fine-tune时用到的优化策略。针对ERNIE与BERT类任务,PaddleHub封装了适合这一任务的迁移学习优化策略AdamWeightDecayStrategy
strategy = hub.AdamWeightDecayStrategy(
    learning_rate=5e-5,
    weight_decay=0.01,
    lr_scheduler="linear_decay",
)

config=hub.RunConfig(use_cuda=True, num_epoch=3,batch_size=32,checkpoint_dir=" ckpt_dir",strategy=strategy)

  6.5. 创建迁移学习任务

  • 组建移学习任务这块也非常简单,首先是选择预训练的模型输出,作为我们句子的特征。在这里ERNIE我们选择pooled_output作为句子的特征输出。也可以通过获取sequence_output来得到词粒度的特征,这个特征般用于序列标注。
pooled_output = outputs["pooled_output"]

# feed_list的Tensor顺序不可以调整
feed_list = [
    inputs["input_ids"].name,
    inputs["position_ids"].name,
    inputs["segment_ids"].name,
    inputs["input_mask"].name,
]

cls_task = hub.TextClassifierTask(
    data_reader=reader,
    feature=pooled_output,
    feed_list=feed_list,
    num_classes=dataset.num_labels,
    config=config)

cls_task.finetune_and_eval()
  • Finetuning API非常智能,会自动完成评估,保存最优模型还有自动可视化的功能。Finetune API训练过程中会自动对关键训练指标进行打点,启动程序后执行下面命令.
$ visualdl --logdir ckpt_dir/vdllog -t ${HOST_IP}
  • 其中${HOST_IP}为本机IP地址,如本机IP地址为192.168.0.1,用浏览器打开192.168.0.1:8040,其中8040为端口号,即可看到训练过程中指标的变化情况。
      6. 6模型预测
  • 通过Finetune完成模型训练后,在对应的ckpt_dir目录下,会自动保存验证集上效果最好的模型。接下来可以按照如下的示例进行预测。
# Data to be prdicted
data = [
    ["这个宾馆比较陈旧了,特价的房间也很一般。总体来说一般"], ["交通方便;环境很好;服务态度很好 房间较小"],["还稍微重了点,可能是硬盘大的原故,还要再轻半斤就好了。其他要进一步验证。贴的几种膜气泡较多,用不了多久就要更换了,屏幕膜稍好点,但比没有要强多了。建议配赠几张膜让用用户自己贴。"],[ "前台接待太差,酒店有A B楼之分,本人check-in后,前台未告诉B楼在何处,并且B楼无明显指示;房间太小,根本不像4星级设施,下次不会再选择入住此店啦"], ["19天硬盘就罢工了~~~算上运来的一周都没用上15天~~~可就是不能换了~~~唉~~~~你说这算什么事呀~~~"]]
index = 0
run_states = cls_task.predict(data=data)
results = [run_state.run_results for run_state in run_states]
for batch_result in results:
    # get predict index
    batch_result = np.argmax(batch_result, axis=2)[0]
    for result in batch_result:
        print("%s\tpredict=%s" % (data[index][0], result))
        index += 1
  • 除了以上的介绍,PaddleHub还在AI Studio和AIBook上提供了IPython NoteBook形式的demo,开发者可以直接在平台上在线体验PaddleHub带来的各种便捷。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容