相关文章:
基础知识介绍:
【一】ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?_汀、的博客-CSDN博客_ernie模型
百度飞桨:ERNIE 3.0 、通用信息抽取 UIE、paddleNLP的安装使用[一]_汀、的博客-CSDN博客_paddlenlp 安装
项目实战:
PaddleHub--飞桨预训练模型应用工具{风格迁移模型、词法分析情感分析、Fine-tune API微调}【一】_汀、的博客-CSDN博客
PaddleHub--{超参优化AutoDL Finetuner}【二】_汀、的博客-CSDN博客
PaddleHub实战篇{词法分析模型LAC、情感分类ERNIE Tiny}训练、部署【三】_汀、的博客-CSDN博客
PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】_汀、的博客-CSDN博客
先创建虚拟环境:
# 在命令行输入以下命令,创建名为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
有问题参考下面链接:
【一】飞桨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
安装完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
安装完paddlehub后,下载风格迁移模型:
# 在命令行中输入以下命令
hub install stylepro_artistic==1.0.1
文档链接:
https://www.paddlepaddle.org.cn/hubsearch?filter=en_category&value=%7B%22scenes%22%3A%5B%22GANs%22%5D%7D
切换工作目录到E:\style_transfer
,在命令行中输入以下命令
# 在命令行中输入以下命令
#把当前工作目录切换到D盘根目录
E:
#创建style_transfer目录
mkdir style_transfer
#切换当前目录到style_transfer目录
cd style_transfer
分别放置待转换图片和风格图片
在E:\style_transfer
目录下创建代码文件style_transfer.py
style_transfer.py
在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
,并将转换后的文件保存到该目录下PaddleHub/README_ch.md at release/v2.1 · PaddlePaddle/PaddleHub · GitHub
图像类(161个)
文本类(129个)
视频类(8个)
语音类(3个)
网络BiGRU+CRF;数据集百度自建数据集
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
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']}
PaddleHub Serving可以部署一个在线词法分析服务,可以将此接口用于词法分析、在线分词等在线web应用。
运行启动命令:
$ 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更多信息参考服务部署
详细部署参考:超链接
PaddleHub Serving模型一键服务部署
网络BiLSTM;数据集百度自建数据集
情感倾向分析(Sentiment Classification,简称Senta)针对带有主观描述的中文文本,可自动判断该文本的情感极性类别并给出相应的置信度,能够帮助企业理解用户消费习惯、分析热点话题和危机舆情监控,为企业提供有利的决策支持。该模型基于一个双向LSTM结构,情感类型分为积极、消极。该PaddleHub Module支持预测和Fine-tune。
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
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个步骤:
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")
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;
自定义数据集
如果想加载自定义数据集完成迁移学习,详细参见自定义数据集。
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优化策略;
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 | 点击体验 |
PaddleHub Serving可以部署一个在线情感分析服务,可以将此接口用于在线web应用。
运行启动命令:
$ 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更多信息参考服务部署