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

文档链接:

https://www.paddlepaddle.org.cn/hubsearch?filter=en_category&value=%7B%22scenes%22%3A%5B%22GANs%22%5D%7D

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
  • 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更多信息参考服务部署

详细部署参考:超链接

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_bilstmhub.Module(name='senta_bilstm')
senta_bowhub.Module(name='senta_bow')
senta_gruhub.Module(name='senta_gru')
senta_lstmhub.Module(name='senta_lstm')
senta_cnnhub.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提供了许多优化策略,如AdamWeightDecayStrategyULMFiTStrategyDefaultFinetuneStrategy等,详细信息参见策略

其中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:

  1. outputs["sentence_feature"]返回了senta模型对应的句子特征,可以用于句子的特征表达;
  2. feed_list中的inputs参数指名了senta中的输入tensor的顺序,与LACClassifyReader返回的结果一致;
  3. 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微调}的主要内容,如果未能解决你的问题,请参考以下文章

基于飞桨PaddleHub快速实践口罩人脸检测与分类项目

飞桨PaddleHub实现将视频转化为皮影戏

使用飞桨Paddlehub实现皮影戏

使用飞桨Paddlehub实现皮影戏

使用飞桨Paddlehub实现皮影戏

PaddleHub