当前位置:   article > 正文

PaddleHub中的模型_hub.module

hub.module
PaddleHub介绍
目 录
Contents
PaddleHub简介
对比PytorchHub
与PaddleHub
Model与Module
Fine-tune
PaddleHub使用
PaddleHub安装
命令行快速体验
29种模型
迁移学习
Fine-Tune
训练过程

 

§01 PaddleHub介绍


1.1 PaddleHub简介

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

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

1.2 对比PytorchHub与PaddleHub

1.2.1 PytorchHub

GAN
PytorchHub
DCGAN on
FashionGen
PGAN
Speech
Tacotron2
WaveGlow
NLP
GPT
BERT
CV
SqueezeNet
Vgg-Nets
D
eeplabv3-ResNet101
ShuffleNetV2
NesnseNet
FCN-ResNet101
GoogLeNet
Incption_V3
MobileNetV2
ResNeXt
AlexNet
ResNet

1.2.2 PaddleHub

CV
resnet_v2_50_imagenet
ssd_mobilenet_v1_pascal
mobilenet_v2_imagenet
nasnet_imagenet
pnasnet_imagenet
resnet_v2_101_imagene
resnet_v2_152_imagenet
NLP
lac
bert
Chinese
Cased*2
uncased*2
multi_cased
ernie
senta_bilstm
emotion_detecdtion_textcnn
lexical_analysis
dureader_machine_reading
simnet_bow_pairwise
dmtk_models
sentiment_classification
dialogue
human
matchin
seq2seq
keywords

1.2.3 调用PaddleHub

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

hub run XXX(模型) --input_text XXX(需要预测的内容)
  • 1

  也可以支持调用api

import paddlehub as hub

hub.finetune_and_eval(
    task, 
    data_reader, 
    feed_list, 
    config=None)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.3 Model与Module

  实际上,PaddleHubModelModule的管理和使用都提供了命令行工具,但是modelmodule是有区别的,一个是模型,一个是模块。

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

1.4 Fine-tune

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

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

1.4.1 PaddleHub图像分类迁移

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

1.4.2 PaddleHub文本分类迁移

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

▲ 图1.4.1  PytorchHub与PaddleHub对比

▲ 图1.4.1 PytorchHub与PaddleHub对比

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

 

§02 PaddleHub使用


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

2.1 PaddleHub安装

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

pip install paddlehub

2.2 命令行快速体验

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

Usage:
    hub <command> <options>

Commands:
    clear                  Clear all cached data.
    config                 Configure PaddleHub.
    convert                Convert model to PaddleHub-Module.
    download               Download PaddlePaddle pretrained module files.
    help                   Show help for commands.
    install                Install PaddleHub module.
    list                   Show help for commands.
    run                    Run the specific module.
    search                 Search PaddleHub pretrained model through model keywords.
    serving                Start Module Serving or Bert Service for online predicting.
    show                   Show the information of PaddleHub module.
    uninstall              Uninstall PaddleHub module.
    version                Show PaddleHub's version.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

  一行代码预测:

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

▲ 图2.2.1  目标检测

▲ 图2.2.1 目标检测

[{'data': [{'label': 'bird', 'confidence': 0.9935706853866577, 'left': 182.32740783691406, 'top': 110.21607208251953, 'right': 316.4570007324219, 'bottom': 228.32887268066406}, {'label': 'bird', 'confidence': 0.9861606359481812, 'left': 325.08056640625, 'top': 67.50239562988281, 'right': 454.9098815917969, 'bottom': 158.6644744873047}, {'label': 'bird', 'confidence': 0.9371040463447571, 'left': 76.58110809326172, 'top': 156.67181396484375, 'right': 148.7028350830078, 'bottom': 234.810546875}], 'path': 'work/1.jpg'}]
  • 1

  利用 输出转至将输出检测结果放置在text文件中。

import sys,os,math,time
sys.path.append("/home/aistudio/external-libraries")
import matplotlib.pyplot as plt
from numpy import *

!hub run ssd_mobilenet_v1_pascal --input_path work/1.jpg > work/1.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

  结果的内容为:

with open(resultfile, 'r') as f:
    strall = f.readlines()[0]
    exec('data=%s'%strall)

rect = data[0]['data']
print(type(rect), len(rect), shape(rect), rect)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
<class 'list'>
3
(3,)
[{'label': 'bird', 'confidence': 0.9935706853866577, 'left': 182.32740783691406, 'top': 110.21607208251953, 'right': 316.4570007324219, 'bottom': 228.32887268066406}, {'label': 'bird', 'confidence': 0.9861606359481812, 'left': 325.08056640625, 'top': 67.50239562988281, 'right': 454.9098815917969, 'bottom': 158.6644744873047}, {'label': 'bird', 'confidence': 0.9371040463447571, 'left': 76.58110809326172, 'top': 156.67181396484375, 'right': 148.7028350830078, 'bottom': 234.810546875}]
  • 1
  • 2
  • 3
  • 4
img = cv2.imread(imgfile)

for r in rect:
    title = '%s:%.4f'%(r['label'], r['confidence'])

    startpoint = (int(r['left']), int(r['top']))
    endpoint = (int(r['right']), int(r['bottom']))

    cv2.rectangle(img, startpoint, endpoint, (255, 255, 0), 1)
    cv2.putText(img, title, startpoint, fontFace=cv2.FONT_HERSHEY_PLAIN, fontScale=1, color=(255,0,0))

plt.clf()
plt.figure(figsize=(12,12))
plt.axis("off")
plt.imshow(img)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

▲ 图2.2.2 标注后处理的结果

▲ 图2.2.2 标注后处理的结果

2.3 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
  • 1
  • 2
  • 3
  • 4

  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
  • 1
  • 2
  • 3
  • 4

 

§03 移学习


3.1 Fine-Tune

▲ 图2.4.1  Fine-tune全景图

▲ 图2.4.1 Fine-tune全景图

▲ 图3.2  PaddleHub+FineTune流程图

▲ 图3.2 PaddleHub+FineTune流程图

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

3.2 训练过程

3.2.1 准备工作

  安装paddlepaddle和paddlehub

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

pip install paddlehub
  • 1
  • 2
  • 3

3.2.2 选择模型

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

import sys,os,math,time
sys.path.append("/home/aistudio/external-libraries")
import matplotlib.pyplot as plt
from numpy import *
import paddlehub as hub

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3.2.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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.2.4 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())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

3.2.5 启动Fine-Tune

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

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

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

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

▲ 图3.2.1 训练过程以及预测曲线

  最后再按照常规流程对模型进行预测即可。


● 相关图表链接:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/532028
推荐阅读
相关标签
  

闽ICP备14008679号