PaddleHub中的模型

网友投稿 860 2022-05-30

PaddleHub介绍

文章目录

PaddleHub简介

对比PytorchHub

与PaddleHub

Model与Module

Fine-tune

PaddleHub使用

PaddleHub安装

命令行快速体验

29种模型

迁移学习

Fine-Tune

训练过程

PaddleHub介绍

文章目录

PaddleHub简介

对比PytorchHub

与PaddleHub

Model与Module

Fine-tune

PaddleHub使用

PaddleHub安装

命令行快速体验

29种模型

迁移学习

Fine-Tune

训练过程

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

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

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

PaddleHub中的模型

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

实际上,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)

1.4 Fine-tune

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

PaddleHub在Fine-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

总之,从这四个维度上,个人感觉PytorchHub更像一个小工具,帮助大家迅速试用一下开源的新模型,但是真正到实际应用,还是要基于老的一套的fine-tuning,不能直接从hub里调用fine-tune的api,所以并不实用。对于迁移学习来说,Fine-tune是必不可少的,虽然我们有预训练的模型,但是新任务的场景和数据都不相同,直接使用预训练模型其实很难得到很好的效果,所以从工业级实用的角度来说,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的便捷,因为在PaddleHub中hub可以作为一个独立的模块直接运行。PaddleHub目前包含图像分类、目标检测、词法分析、Transformer、情感分析五大类。

Usage: hub 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

[{'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

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.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

3.1 Fine-Tune

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曲线

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

● 相关图表链接:

图1.4.1 PytorchHub与PaddleHub对比

图2.2.1 目标检测

图2.2.2 标注后处理的结果

图2.4.1 Fine-tune全景图

图3.2 PaddleHub+FineTune流程图

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

GitHub 机器学习

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Unity3D日常开发】(十二)Unity3d中使用MVC框架
下一篇:excel制作漂亮表格的方法步骤图
相关文章