赞
踩
PaddleHub
是基于 PaddlePaddle
开发的预训练模型管理工具,可以借助预训练模型更便捷地开展迁移学习工作,旨在让 PaddlePaddle
生态下的开发者更便捷体验到大规模预训练模型的价值。
PaddleHub
目前的预训练模型覆盖了图像分类、目标检测、词法分析、Transformer
、情感分析五大类别。未来会持续开放更多类型的深度学习模型,如语言模型、视频分类、图像生成等预训练模型。
目前PytorchHub不支持命令行运行,但PaddleHub支持,命令行运行就是指我们安装PaddleHub后,可以无需进入python环境,即可快速体验PaddleHub无需代码、一键预测的命令行功能。需要注意的是,在PaddleHub中,既可以支持命令行使用,即在终端输入
hub run XXX(模型) --input_text 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
)
PyTorchHub
不支持Fine-tune
,PaddleHub
支持。这一点倒是挺让人意外的,如果通过hub
加载了预训练模型,但是无法Fine-tune
,那有什么意义呢?仅仅只是为了试试paper
中的效果好不好吗?本来我还对此颇有怀疑,于是去看了pytorchhub.org
官网下的文档,发现目前pytorchhub
确实不支持hub
一键式fine-tuning
,现有模型的finetuning
还是基于传统的脚本式调参。
PaddleHub
在Fine-tune
这一块做的很完善,在前一个板块也给大家详细举了示例讲解,在PaddleHub
的官方gihub
中,有非常详细的Fine-tune
教程,大家可以参考:
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub图像分类迁移教程
https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub文本分类迁移教程
▲ 图1.4.1 PytorchHub与PaddleHub对比
总之,从这四个维度上,个人感觉PytorchHub
更像一个小工具,帮助大家迅速试用一下开源的新模型,但是真正到实际应用,还是要基于老的一套的fine-tuning
,不能直接从hub
里调用fine-tune
的api
,所以并不实用。对于迁移学习来说,Fine-tune
是必不可少的,虽然我们有预训练的模型,但是新任务的场景和数据都不相同,直接使用预训练模型其实很难得到很好的效果,所以从工业级实用的角度来说,PaddleHub
做的要更成熟一些,等稍后支持了用户自定义上传模型后大家可以多体验体验。
下面,我们具体来看看PaddleHub
如何直接使用命令行,调用一行代码show
出结果& 使用Finetune Api
来对模型进行微调,并举一个实例教大家一步一步实现。
pip install paddlehub
安装好后,不需要进入python
环境import
就可以直接先体验hub
的便捷,因为在PaddleHub
中hub
可以作为一个独立的模块直接运行。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.
一行代码预测:
# 使用百度词法分析工具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.7206, 'negative_probs': 0.2794}]
#使用SSD检测模型对图片进行目标检测
hub run ssd_mobilenet_v1_pascal --input_path test_img_bird.jpg
▲ 图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'}]
利用 输出转至将输出检测结果放置在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
结果的内容为:
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)
<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}]
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)
▲ 图2.2.2 标注后处理的结果
PaddleHub目前支持29种模型,主要以CV和NLP模型为主,包括NLP目前最火的BERT和百度自己自己研发开源的Ernie,以及CV中的ssd-mobilenet、resnet-50、resnet-152等。
数据通过 —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
▲ 图2.4.1 Fine-tune全景图
▲ 图3.2 PaddleHub+FineTune流程图
Fine-tune
是迁移学习中使用最多的方式之一,通常我们可以在预训练好的模型上进行微调来实现模型迁移,从而达到模型适应新领域(Domain)
数据的目的。上图是做一个完整的迁移学习需要的步骤,下面举个实例教大家如何用PaddleHub
做图像分类迁移学习
安装paddlepaddle和paddlehub
pip install paddlepaddle( 推荐安装1.4.0版本以上)
pip install paddlehub
此处使用经典的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)
# 直接用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)
由于猫狗分类是一个二分类的任务,而我们下载的分类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())
可以选择finetune_and_eval接口来进行模型训练,这个接口在finetune的过程中,会周期性的进行模型效果的评估,以便我们了解整个训练过程的性能变化。
训练过程中的性能数据会被记录到本地,我们可以通过visualdl来可视化这些数据。我们在shell中输入以下命令来启动visualdl,其中${HOST_IP}为本机IP,需要用户自行指定
$ visualdl --logdir ./cv_finetune_turtorial_demo/vdllog --host ${HOST_IP} --port 8989
启动服务后,我们使用浏览器访问${HOST_IP}:8989,可以看到训练以及预测的loss曲线和accuracy曲线
▲ 图3.2.1 训练过程以及预测曲线
最后再按照常规流程对模型进行预测即可。
● 相关图表链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。