PaddleHub--飞桨预训练模型应用工具{风格迁移模型词法分析情感分析Fine-tune API微调}
Posted 汀、
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PaddleHub--飞桨预训练模型应用工具{风格迁移模型词法分析情感分析Fine-tune API微调}相关的知识,希望对你有一定的参考价值。
- 【模型种类丰富】: 涵盖CV、NLP、Audio、Video、工业应用主流五大品类的 350+ 预训练模型,全部开源下载,离线可运行
- 【超低使用门槛】:无需深度学习背景、无需数据与训练过程,可快速使用AI模型
- 【一键模型快速预测】:通过一行命令行或者极简的Python API实现模型调用,可快速体验模型效果
- 【一键模型转服务化】:一行命令,搭建深度学习模型API服务化部署能力
- 【十行代码迁移学习】:十行代码完成图片分类、文本分类的迁移学习任务
- 【跨平台兼容性】:可运行于Linux、Windows、MacOS等多种操作系统
1.PaddleHub环境安装:
先创建虚拟环境:
# 在命令行输入以下命令,创建名为paddle_env的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令
-
该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间
-
之后命令行中会输出提示信息,输入y并回车继续安装
激活刚创建的conda环境,在命令行中输入以下命令:
# 激活paddle_env环境
conda activate paddle_env
# 查看当前python的位置
where python
1.1 安装paddle:
有问题参考下面链接:
【一】飞桨paddle【GPU、CPU】安装以及环境配置+python入门教学_汀、的博客-CSDN博客
使用pip命令在刚激活的环境中安装paddle,
# 在命令行中输入以下命令
# 确认当前所用的pip是否是paddle_env环境下的pip
where pip
# 默认安装CPU版本,安装paddle时建议使用百度源
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
1.2 安装paddlehub:
安装完paddle后,继续在paddle_env环境中安装paddlehub:
# 在命令行中输入以下命令
pip install paddlehub -i https://mirror.baidu.com/pypi/simple
paddlehub的介绍文档:
PaddleHub/README_ch.md at release/v2.1 · PaddlePaddle/PaddleHub · GitHub
1.3 安装paddlehub并下载模型
安装完paddlehub后,下载风格迁移模型:
# 在命令行中输入以下命令
hub install stylepro_artistic==1.0.1
文档链接:
1.4 demo 风格迁移数据和代码
切换工作目录到E:\\style_transfer
,在命令行中输入以下命令
# 在命令行中输入以下命令
#把当前工作目录切换到D盘根目录
E:
#创建style_transfer目录
mkdir style_transfer
#切换当前目录到style_transfer目录
cd style_transfer
分别放置待转换图片和风格图片
- 将待转换图片放置到E
:\\style_transfer\\pic.jpg
- 将风格图片放置到E
:\\style_transfer\\fangao.jpg
-
在E
:\\style_transfer
目录下创建代码文件style_transfer.py
- 若没有vscode等编辑器,可使用记事本先创建1个txt文件,再将文件名改成
style_transfer.py
- 若没有vscode等编辑器,可使用记事本先创建1个txt文件,再将文件名改成
-
在
style_transfer.py
中复制进如下代码:
import paddlehub as hub
import cv2
# 待转换图片的绝对地址
picture = 'E:\\\\style_transfer\\\\pic.jpg' # 注意代码中此处为双反斜杠
# 风格图片的绝对地址
style_image = 'E:\\\\style_transfer\\\\fangao.jpg'
# 创建风格转移网络并加载参数
stylepro_artistic = hub.Module(name="stylepro_artistic")
# 读入图片并开始风格转换
result = stylepro_artistic.style_transfer(
images=['content': cv2.imread(picture),
'styles': [cv2.imread(style_image)]],
visualization=True
)
运行代码:
- 在命令行中,输入
python style_transfer.py
- 程序执行时,会创建新文件夹
transfer_result
,并将转换后的文件保存到该目录下
2.paddlehub 应用
PaddleHub/README_ch.md at release/v2.1 · PaddlePaddle/PaddleHub · GitHub
图像类(161个)
- 包括图像分类、人脸检测、口罩检测、车辆检测、人脸/人体/手部关键点检测、人像分割、80+语言文本识别、图像超分/上色/动漫化等
文本类(129个)
- 包括中文分词、词性标注与命名实体识别、句法分析、AI写诗/对联/情话/藏头诗、中文的评论情感分析、中文色情文本审核等
视频类(8个)
- 包含短视频分类,支持3000+标签种类,可输出TOP-K标签,多种算法可选。
- 感谢CopyRight@PaddleVideo提供预训练模型,训练能力开放,欢迎体验。
语音类(3个)
- TTS语音合成算法,多种算法可选
3、lac--类别文本 - 词法分析
网络BiGRU+CRF;数据集百度自建数据集
3.1 模型概述
Lexical Analysis of Chinese,简称 LAC,是一个联合的词法分析模型,能整体性地完成中文分词、词性标注、专名识别任务。在百度自建数据集上评测,LAC效果:Precision=88.0%,Recall=88.7%,F1-Score=88.4%。该PaddleHub Module支持预测。
https://www.paddlepaddle.org.cn/hubdetail?name=lac&en_category=LexicalAnalysis
3.2 demo
import paddlehub as hub
lac = hub.Module(name="lac")
test_text = ["今天是个好日子", "天气预报说今天要下雨", "下一班地铁马上就要到了"]
results = lac.cut(text=test_text, use_gpu=False, batch_size=1, return_tag=True)
for result in results:
print(result['word'])
print(result['tag'])
"""
['今天', '是', '个', '好日子']
['TIME', 'v', 'q', 'n']
['天气预报', '说', '今天', '要', '下雨']
['n', 'v', 'TIME', 'v', 'v']
['下', '一班', '地铁', '马上', '就要', '到', '了']
['f', 'm', 'n', 'd', 'v', 'v', 'xc']"""
import paddlehub as hub
lac = hub.Module(name="lac")
test_text = ["今天是个好天气。"]
results = lac.cut(text=test_text, use_gpu=False, batch_size=1, return_tag=True)
print(results)
#'word': ['今天', '是', '个', '好天气', '。'], 'tag': ['TIME', 'v', 'q', 'n', 'w']
3.3 LAC 服务部署
PaddleHub Serving可以部署一个在线词法分析服务,可以将此接口用于词法分析、在线分词等在线web应用。
第一步:启动PaddleHub Serving
运行启动命令:
$ hub serving start -c serving_config.json
serving_config.json
的内容如下:
"modules_info":
"lac":
"init_args":
"version": "2.2.0"
"user_dict": "./test_dict.txt"
,
"port": 8866,
"use_singleprocess": false,
"workers": 2
其中user_dict含义为自定义词典路径,如果不使用lac自定义词典功能,则可以不填入。
这样就完成了一个词法分析服务化API的部署,默认端口号为8866。
NOTE: 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。
第二步:发送预测请求
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
import request
import json
# 待预测数据
text = ["今天是个好日子", "天气预报说今天要下雨"]
# 设置运行配置
# 对应本地预测lac.cut(text=text, batch_size=1)
data = "text": text, "batch_size": 1
# 指定预测方法为lac并发送post请求,content-type类型应指定json方式
# HOST_IP为服务器IP
url = "http://HOST_IP:8866/predict/lac"
headers = "Content-Type": "application/json"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(json.dumps(r.json(), indent=4, ensure_ascii=False))
关于PaddleHub Serving更多信息参考服务部署
详细部署参考:超链接
4. senta_bilstm---类别文本 - 情感分析
网络BiLSTM;数据集百度自建数据集
4.1 模型概述
情感倾向分析(Sentiment Classification,简称Senta)针对带有主观描述的中文文本,可自动判断该文本的情感极性类别并给出相应的置信度,能够帮助企业理解用户消费习惯、分析热点话题和危机舆情监控,为企业提供有利的决策支持。该模型基于一个双向LSTM结构,情感类型分为积极、消极。该PaddleHub Module支持预测和Fine-tune。
4.2 demo情感分析(三分类--正向/中性/负向)
hub install senta_bilstm==1.2.0
import paddlehub as hub
senta = hub.Module(name="senta_bilstm")
test_text = ["这家餐厅很好吃", "这部电影真的很差劲"]
results = senta.sentiment_classify(texts=test_text, use_gpu=False, batch_size=1)
for result in results:
print(result['text'])
print(result['sentiment_label'])
print(result['sentiment_key'])
print(result['positive_probs'])
print(result['negative_probs'])
这家餐厅很好吃
1
positive
0.9407
0.0593
这部电影真的很差劲
0
negative
0.02
0.98
4.3 通过PaddleHub Fine-tune API微调
import paddlehub as hub
senta = hub.Module(name="senta_bilstm")
inputs, outputs, program = senta.context(trainable=True)
words = inputs["text"]
sent_feature = outputs["sentence_feature"]
senta_finetune.py
给出了如何使用Senta模型的句子特征进行Fine-tuning的实例代码。 可以运行以下命令在ChnSentiCorp数据集上进行Fine-tuning。
$ sh run_finetune.sh
其中脚本参数说明如下:
--batch_size: 批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数; --checkpoint_dir: 模型保存路径,PaddleHub会自动保存验证集上表现最好的模型; --num_epoch: Fine-tune迭代的轮数; --use_gpu: 是否使用GPU进行训练,如果机器支持GPU且安装了GPU版本的PaddlePaddle,我们建议您打开这个开关;
使用PaddleHub Fine-tune API进行Fine-tune可以分为4个步骤:
Step1: 加载预训练模型
module = hub.Module(name="senta_bilstm")
inputs, outputs, program = module.context(trainable=True)
PaddleHub提供Senta一列模型可供选择, 模型对应的加载示例如下:
模型名 | PaddleHub Module |
---|---|
senta_bilstm | hub.Module(name='senta_bilstm') |
senta_bow | hub.Module(name='senta_bow') |
senta_gru | hub.Module(name='senta_gru') |
senta_lstm | hub.Module(name='senta_lstm') |
senta_cnn | hub.Module(name='senta_cnn') |
更多模型请参考PaddleHub官网。
如果想尝GRU模型,只需要更换Module中的name
参数即可。
# 更换name参数即可无缝切换GRU模型, 代码示例如下 module = hub.Module(name="senta_gru")
Step2: 准备数据集并使用LACClassifyReader读取数据
dataset = hub.dataset.ChnSentiCorp()
reader = hub.reader.LACClassifyReader(
dataset=dataset,
vocab_path=module.get_vocab_path())
hub.dataset.ChnSentiCorp()
会自动从网络下载数据集并解压到用户目录下$HOME/.paddlehub/dataset
目录;
module.get_vocab_path()
会返回预训练模型对应的词表;
LACClassifyReader中的data_generator
会自动按照模型对应词表对数据进行切词,以迭代器的方式返回Senta所需要的word id;
更多数据集信息参考Dataset;
自定义数据集
如果想加载自定义数据集完成迁移学习,详细参见自定义数据集。
Step3:选择优化策略和运行配置
strategy = hub.AdamWeightDecayStrategy(
learning_rate=1e-5,
weight_decay=0.01,
warmup_proportion=0.1,
lr_scheduler="linear_decay",
)
config = hub.RunConfig(use_cuda=True, num_epoch=3, batch_size=32, strategy=strategy)
优化策略
PaddleHub提供了许多优化策略,如AdamWeightDecayStrategy
、ULMFiTStrategy
、DefaultFinetuneStrategy
等,详细信息参见策略。
其中AdamWeightDecayStrategy
:
learning_rate
: Fine-tune过程中的最大学习率;weight_decay
: 模型的正则项参数,默认0.01,如果模型有过拟合倾向,可适当调高这一参数;warmup_proportion
: 如果warmup_proportion>0, 例如0.1, 则学习率会在前10%的steps中线性增长至最高值learning_rate;lr_scheduler
: 有两种策略可选(1)linear_decay
策略学习率会在最高点后以线性方式衰减;noam_decay
策略学习率会在最高点以多项式形式衰减;
运行配置
RunConfig
主要控制Fine-tune的训练,包含以下可控制的参数:
use_cuda
: 是否使用GPU训练,默认为False;checkpoint_dir
: 模型checkpoint保存路径, 若用户没有指定,程序会自动生成;num_epoch
: Fine-tune的轮数;batch_size
: 训练的批大小,如果使用GPU,请根据实际情况调整batch_size;strategy
: Fine-tune优化策略;
Step4: 构建网络并创建分类迁移任务进行Fine-tune
sent_feature = outputs["sentence_feature"]
feed_list = [inputs["words"].name]
cls_task = hub.TextClassifierTask(
data_reader=reader,
feature=sent_feature,
feed_list=feed_list,
num_classes=dataset.num_labels,
config=config)
cls_task.finetune_and_eval()
NOTE:
outputs["sentence_feature"]
返回了senta模型对应的句子特征,可以用于句子的特征表达;feed_list
中的inputs参数指名了senta中的输入tensor的顺序,与LACClassifyReader返回的结果一致;hub.TextClassifierTask
通过输入特征,label与迁移的类别数,可以生成适用于文本分类的迁移任务TextClassifierTask
;
可视化
Fine-tune API训练过程中会自动对关键训练指标进行打点,启动程序后执行下面命令
$ tensorboard --logdir $CKPT_DIR/visualization --host $HOST_IP --port $PORT_NUM
其中为本机地址,HOSTIP为本机IP地址,PORT_NUM为可用端口号,如本机IP地址为192.168.0.1,端口号8040,用浏览器打开192.168.0.1:8040,即可看到训练过程中指标的变化情况。
模型预测
通过Fine-tune完成模型训练后,在对应的ckpt目录下,会自动保存验证集上效果最好的模型。 配置脚本参数
CKPT_DIR="ckpt_chnsentiment/"
python predict.py --checkpoint_dir $CKPT_DIR
其中CKPT_DIR为Fine-tune API保存最佳模型的路径
参数配置正确后,请执行脚本sh run_predict.sh
,即可看到以下文本分类预测结果, 以及最终准确率。 如需了解更多预测步骤,请参考predict.py
。
预训练模型 | 任务类型 | 数据集 | AIStudio链接 | 备注 |
---|---|---|---|---|
ResNet | 图像分类 | 猫狗数据集DogCat | 点击体验 | |
ERNIE | 文本分类 | 中文情感分类数据集ChnSentiCorp | 点击体验 | |
ERNIE | 文本分类 | 中文新闻分类数据集THUNEWS | 点击体验 | 本教程讲述了如何将自定义数据集加载,并利用Fine-tune API完成文本分类迁移学习。 |
ERNIE | 序列标注 | 中文序列标注数据集MSRA_NER | 点击体验 | |
ERNIE | 序列标注 | 中文快递单数据集Express | 点击体验 | 本教程讲述了如何将自定义数据集加载,并利用Fine-tune API完成序列标注迁移学习。 |
ERNIE Tiny | 文本分类 | 中文情感分类数据集ChnSentiCorp | 点击体验 | |
Senta | 文本分类 | 中文情感分类数据集ChnSentiCorp | 点击体验 | 本教程讲述了任何利用Senta和Fine-tune API完成情感分类迁移学习。 |
Senta | 情感分析预测 | N/A | 点击体验 | |
LAC | 词法分析 | N/A | 点击体验 | |
Ultra-Light-Fast-Generic-Face-Detector-1MB | 人脸检测 | N/A | 点击体验 |
4.4 SentaBiLSTM 服务部署
PaddleHub Serving可以部署一个在线情感分析服务,可以将此接口用于在线web应用。
第一步:启动PaddleHub Serving
运行启动命令:
$ hub serving start -m senta_bilstm
启动时会显示加载模型过程,启动成功后显示
Loading senta_bilstm successful.
这样就完成了服务化API的部署,默认端口号为8866。
NOTE: 如使用GPU预测,则需要在启动服务之前,请设置CUDA_VISIBLE_DEVICES环境变量,否则不用设置。
第二步:发送预测请求
配置好服务端,以下数行代码即可实现发送预测请求,获取预测结果
import request
import json
# 待预测数据
text = ["这家餐厅很好吃", "这部电影真的很差劲"]
# 设置运行配置
# 对应本地预测senta_bilstm.sentiment_classify(texts=text, batch_size=1, use_gpu=True)
data = "texts": text, "batch_size": 1, "use_gpu":True
# 指定预测方法为senta_bilstm并发送post请求,content-type类型应指定json方式
# HOST_IP为服务器IP
url = "http://HOST_IP:8866/predict/senta_bilstm"
headers = "Content-Type": "application/json"
r = requests.post(url=url, headers=headers, data=json.dumps(data))
# 打印预测结果
print(json.dumps(r.json(), indent=4, ensure_ascii=False))
关于PaddleHub Serving更多信息参考服务部署
以上是关于PaddleHub--飞桨预训练模型应用工具{风格迁移模型词法分析情感分析Fine-tune API微调}的主要内容,如果未能解决你的问题,请参考以下文章