未验证 提交 3696b08d 编写于 作者: S Steffy-zxf 提交者: GitHub

fix urls and update senta_demo (#791)

上级 58f15a8b
## `v1.8.0`
* 预训练模型丰富,一键完成更多
*[文本生成](https://www.paddlepaddle.org.cn/hublist?filter=en_category&value=TextGeneration)』新增基于ERNIE-tiny和ERNIE-gen的对联和写诗生成模型,支持一键自动写诗和对对联。
*[词法分析](https://www.paddlepaddle.org.cn/hublist?filter=en_category&value=LexicalAnalysis)』新增jieba的paddle模式切词模型,可一键完成中文分词、关键词抽取等功能。
*[语义表示](https://www.paddlepaddle.org.cn/hublist?filter=en_category&value=SemanticModel)』新增基于网页、小说、新闻三类大规模文本数据的LDA主题模型及其语义相似度计算接口。
* Fine-tune API升级,提升灵活性并支持更多任务
* 新增Tokenizer API,支持更加灵活的切词、切字模式和自定义切词工具拓展。
* 新增[文本生成](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.8/demo/text_generation)任务,支持Seq2Seq任务的Fine-tuning。
* 新增文本匹配任务,支持[Pointwise](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.8/demo/pointwise_text_matching)[Pairwise](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.8/demo/pairwise_text_matching)两种文本匹配训练模式,更便捷完成语义匹配任务。
## `v1.7.0`
* 丰富预训练模型,提升应用性
......@@ -52,7 +64,7 @@
# `v1.5.0`
* 升级PaddleHub Serving,提升性能和易用性
* 新增文本Embedding服务[Bert Service](./tutorial/bert_service.md), 轻松获取文本embedding;
* 新增文本Embedding服务[Bert Service](./docs/tutorial/bert_service.md), 轻松获取文本embedding;
* 代码精短,易于使用。服务端/客户端一行命令即可获取文本embedding;
* 更高性能,更高效率。通过Paddle AnalysisPredictor API优化计算图,提升速度减小显存占用
* 随"机"应变,灵活扩展。根据机器资源和实际需求可灵活增加服务端数量,支持多显卡多模型计算任务
......
......@@ -8,7 +8,7 @@ This page implements the [DELTA](https://arxiv.org/abs/1901.09229) algorithm in
## Preparation of Data and Pre-trained Model
- Download transfer learning target datasets, like [Caltech-256](http://www.vision.caltech.edu/Image_Datasets/Caltech256/), [CUB_200_2011](http://www.vision.caltech.edu/visipedia/CUB-200-2011.html) or others. Arrange the dataset in this way:
- Download transfer learning target datasets, like [Caltech-256](https://www.kaggle.com/jessicali9530/caltech256), [CUB_200_2011](http://www.vision.caltech.edu/visipedia/CUB-200-2011.html) or others. Arrange the dataset in this way:
```
root/train/dog/xxy.jpg
root/train/dog/xxz.jpg
......
......@@ -33,14 +33,14 @@
* [阅读理解](./reading_comprehension)
该样例展示了PaddleHub如何将BERT作为预训练模型在SQAD数据集上完成阅读理解的FineTune和预测。
* [检索式问答任务](./qa_classfication)
* [检索式问答任务](./qa_classification)
该样例展示了PaddleHub如何将ERNIE和BERT作为预训练模型在NLPCC-DBQA等数据集上完成检索式问答任务的FineTune和预测。
* [句子语义相似度计算](./sentence_similarity)
该样例展示了PaddleHub如何将word2vec_skipgram用于计算两个文本语义相似度。
* [超参优化AutoDL Finetuner使用](./autofinetune)
该样例展示了PaddleHub超参优化AutoDL Finetuner如何使用,给出了自动搜素图像分类/文本分类任务的较佳超参数示例。
* 超参优化AutoDL Finetuner使用
该样例展示了PaddleHub超参优化AutoDL Finetuner如何使用,给出了自动搜[图像分类](./autofinetune_image_classification)/[文本分类](./autofinetune_text_classification)任务的较佳超参数示例。
* [服务化部署Hub Serving使用](./serving)
该样例文件夹下展示了服务化部署Hub Serving如何使用,将PaddleHub支持的可预测Module如何服务化部署。
......@@ -50,7 +50,7 @@
请确认转化时,使用的PaddleHub为1.6.0以上版本。
**NOTE:**
以上任务示例均是利用PaddleHub提供的数据集,若您想在自定义数据集上完成相应任务,请查看[PaddleHub适配自定义数据完成Fine-tune](https://github.com/PaddlePaddle/PaddleHub/wiki/PaddleHub%E9%80%82%E9%85%8D%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E5%AE%8C%E6%88%90FineTune)
以上任务示例均是利用PaddleHub提供的数据集,若您想在自定义数据集上完成相应任务,请查看[PaddleHub适配自定义数据完成Fine-tune](../docs/tutorial/how_to_load_data.md)
## 在线体验
......
......@@ -50,7 +50,7 @@ pairwise_text_matching
```python
module = hub.Module(name="tencent_ailab_chinese_embedding_small")
inputs, outputs, program = module.context(trainable=True, max_seq_len=args.max_seq_len, num_slots=3)
inputs, outputs, program = module.context(trainable=True, max_seq_len=128, num_slots=3)
```
其中最大序列长度`max_seq_len`是可以调整的参数,建议值128,根据任务文本长度不同可以调整该值。
......@@ -99,11 +99,11 @@ dataset = hub.dataset.DuEL(tokenizer=tokenizer, max_seq_len=128)
`max_seq_len` 需要与Step1中context接口传入的序列长度保持一致;
更多数据集信息参考[Dataset](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.7/docs/reference/dataset.md)
更多数据集信息参考[Dataset](../../docs/reference/dataset.md)
#### 自定义数据集
如果想加载自定义数据集完成迁移学习,详细参见[自定义数据集](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.7/docs/tutorial/how_to_load_data.md)
如果想加载自定义数据集完成迁移学习,详细参见[自定义数据集](../../docs/tutorial/how_to_load_data.md)
### Step4:选择优化策略和运行配置
......@@ -170,7 +170,7 @@ matching_task.finetune_and_eval()
#### 自定义迁移任务
如果想改变迁移任务组网,详细参见[自定义迁移任务]()。
如果想改变迁移任务组网,详细参见[自定义迁移任务](../../docs/tutorial/how_to_define_task.md)
## 可视化
......
......@@ -46,7 +46,7 @@ pointwise_text_matching
```python
module = hub.Module(name="tencent_ailab_chinese_embedding_small")
inputs, outputs, program = module.context(trainable=True, max_seq_len=args.max_seq_len, num_slots=2)
inputs, outputs, program = module.context(trainable=True, max_seq_len=128, num_slots=2)
```
其中最大序列长度`max_seq_len`是可以调整的参数,建议值128,根据任务文本长度不同可以调整该值。
......@@ -95,11 +95,11 @@ dataset = hub.dataset.LCQMC(tokenizer=tokenizer, max_seq_len=128)
`max_seq_len` 需要与Step1中context接口传入的序列长度保持一致;
更多数据集信息参考[Dataset](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.7/docs/reference/dataset.md)
更多数据集信息参考[Dataset](../../docs/reference/dataset.md)
#### 自定义数据集
如果想加载自定义数据集完成迁移学习,详细参见[自定义数据集](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.7/docs/tutorial/how_to_load_data.md)
如果想加载自定义数据集完成迁移学习,详细参见[自定义数据集](../../docs/tutorial/how_to_load_data.md)
### Step4:选择优化策略和运行配置
......@@ -164,7 +164,7 @@ matching_task.finetune_and_eval()
#### 自定义迁移任务
如果想改变迁移任务组网,详细参见[自定义迁移任务]()。
如果想改变迁移任务组网,详细参见[自定义迁移任务](../../docs/tutorial/how_to_define_task.md)
## 可视化
......
......@@ -41,6 +41,7 @@ $ sh run_finetune.sh
--batch_size: 批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数;
--checkpoint_dir: 模型保存路径,PaddleHub会自动保存验证集上表现最好的模型;
--num_epoch: Fine-tune迭代的轮数;
--max_seq_len: 模型使用的最大序列长度, 若出现显存不足,请适当调低这一参数;
--use_gpu: 是否使用GPU进行训练,如果机器支持GPU且安装了GPU版本的PaddlePaddle,我们建议您打开这个开关;
```
......@@ -50,9 +51,11 @@ $ sh run_finetune.sh
```python
module = hub.Module(name="senta_bilstm")
inputs, outputs, program = module.context(trainable=True)
inputs, outputs, program = module.context(trainable=True, max_seq_len=96)
```
其中最大序列长度`max_seq_len`是可以调整的参数,根据任务文本长度不同可以调整该值。
PaddleHub提供Senta一列模型可供选择, 模型对应的加载示例如下:
模型名 | PaddleHub Module
......@@ -71,21 +74,32 @@ senta_cnn | `hub.Module(name='senta_cnn')`
module = hub.Module(name="senta_gru")
```
### Step2: 准备数据集并使用LACClassifyReader读取数据
### Step2: 选择Tokenizer读取数据
```python
dataset = hub.dataset.ChnSentiCorp()
reader = hub.reader.LACClassifyReader(
dataset=dataset,
vocab_path=module.get_vocab_path())
tokenizer = hub.CustomTokenizer(
vocab_file=module.get_vocab_path(),
tokenize_chinese_chars=True,
)
```
`hub.dataset.ChnSentiCorp()` 会自动从网络下载数据集并解压到用户目录下`$HOME/.paddlehub/dataset`目录;
`module.get_vocab_path()` 会返回预训练模型对应的词表;
`tokenize_chinese_chars` 是否切分中文文本
**NOTE:**
1. 如果使用Transformer类模型(如ERNIE、BERT、RoBerta等),则应该选择`hub.BertTokenizer`.
2. 如果使用非Transformer类模型(如senta、word2vec_skipgram、tencent_ailab_chinese_embedding_small等),则应该选择`hub.CustomTokenizer`
### Step3: 准备数据集
```python
dataset = hub.dataset.LCQMC(tokenizer=tokenizer, max_seq_len=128)
```
LACClassifyReader中的`data_generator`会自动按照模型对应词表对数据进行切词,以迭代器的方式返回Senta所需要的word id
`hub.dataset.LCQMC()` 会自动从网络下载数据集并解压到用户目录下`$HOME/.paddlehub/dataset`目录
更多数据集信息参考[Dataset](../../docs/reference/dataset.md)
`max_seq_len` 需要与Step1中context接口传入的序列长度保持一致;
更多数据集信息参考[Dataset](../../docs/reference/dataset.md)
#### 自定义数据集
......@@ -131,18 +145,20 @@ sent_feature = outputs["sentence_feature"]
feed_list = [inputs["words"].name]
cls_task = hub.TextClassifierTask(
data_reader=reader,
dataset=dataset,
feature=sent_feature,
feed_list=feed_list,
num_classes=dataset.num_labels,
num_classes=2,
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`
2. `hub.TextClassifierTask`通过输入特征,label与迁移的类别数,可以生成适用于文本分类的迁移任务`TextClassifierTask`
#### 自定义迁移任务
如果想改变迁移任务组网,详细参见[自定义迁移任务](../../docs/tutorial/how_to_define_task.md)
## 可视化
......@@ -165,24 +181,7 @@ python predict.py --checkpoint_dir $CKPT_DIR
参数配置正确后,请执行脚本`sh run_predict.sh`,即可看到以下文本分类预测结果, 以及最终准确率。
如需了解更多预测步骤,请参考`predict.py`
我们在AI Studio上提供了IPython NoteBook形式的demo,您可以直接在平台上在线体验,链接如下:
|预训练模型|任务类型|数据集|AIStudio链接|备注|
|-|-|-|-|-|
|ResNet|图像分类|猫狗数据集DogCat|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/147010)||
|ERNIE|文本分类|中文情感分类数据集ChnSentiCorp|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/147006)||
|ERNIE|文本分类|中文新闻分类数据集THUNEWS|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/221999)|本教程讲述了如何将自定义数据集加载,并利用Fine-tune API完成文本分类迁移学习。|
|ERNIE|序列标注|中文序列标注数据集MSRA_NER|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/147009)||
|ERNIE|序列标注|中文快递单数据集Express|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/184200)|本教程讲述了如何将自定义数据集加载,并利用Fine-tune API完成序列标注迁移学习。|
|ERNIE Tiny|文本分类|中文情感分类数据集ChnSentiCorp|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/221971)||
|Senta|文本分类|中文情感分类数据集ChnSentiCorp|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/216846)|本教程讲述了任何利用Senta和Fine-tune API完成情感分类迁移学习。|
|Senta|情感分析预测|N/A|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/215814)||
|LAC|词法分析|N/A|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/215711)||
|Ultra-Light-Fast-Generic-Face-Detector-1MB|人脸检测|N/A|[点击体验](https://aistudio.baidu.com/aistudio/projectdetail/215962)||
我们在AI Studio上提供了IPython NoteBook形式的demo,点击[PaddleHub教程合集](https://aistudio.baidu.com/aistudio/projectdetail/231146),可使用AI Studio平台提供的GPU算力进行快速尝试。
## 超参优化AutoDL Finetuner
......
#coding:utf-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
# coding:utf-8
import argparse
import ast
import numpy as np
import os
import time
import paddle
import paddle.fluid as fluid
import paddlehub as hub
# yapf: disable
parser = argparse.ArgumentParser(__doc__)
parser.add_argument("--checkpoint_dir", type=str, default=None, help="Directory to model checkpoint")
parser.add_argument("--use_gpu", type=ast.literal_eval, default=True, help="Whether use GPU for fine-tuning, input should be True or False")
parser.add_argument("--batch_size", type=int, default=1, help="Total examples' number in batch when the program predicts.")
parser.add_argument("--num_epoch", type=int, default=3, help="Number of epoches for fine-tuning.")
parser.add_argument("--use_gpu", type=ast.literal_eval, default=True, help="Whether use GPU for fine-tuning, input should be True or False")
parser.add_argument("--checkpoint_dir", type=str, default=None, help="Directory to model checkpoint")
parser.add_argument("--max_seq_len", type=int, default=128, help="Number of words of the longest seqence.")
parser.add_argument("--batch_size", type=int, default=32, help="Total examples' number in batch for training.")
args = parser.parse_args()
# yapf: enable.
jieba_paddle = hub.Module(name='jieba_paddle')
def cut(text):
res = jieba_paddle.cut(text, use_paddle=False)
return res
if __name__ == '__main__':
# loading Paddlehub senta pretrained model
module = hub.Module(name="senta_bilstm")
inputs, outputs, program = module.context(trainable=True)
# Load Paddlehub senta pretrained model
module = hub.Module(name="senta_bow", version='1.2.0')
inputs, outputs, program = module.context(
trainable=True, max_seq_len=args.max_seq_len)
# Download dataset and use LACClassifyReader to read dataset
dataset = hub.dataset.ChnSentiCorp()
reader = hub.reader.LACClassifyReader(
dataset=dataset, vocab_path=module.get_vocab_path())
# Tokenizer tokenizes the text data and encodes the data as model needed.
# If you use transformer modules (ernie, bert, roberta and so on), tokenizer should be hub.BertTokenizer.
# Otherwise, tokenizer should be hub.CustomTokenizer.
# If you choose CustomTokenizer, you can also change the chinese word segmentation tool, for example jieba.
tokenizer = hub.CustomTokenizer(
vocab_file=module.get_vocab_path(),
tokenize_chinese_chars=True,
cut_function=cut, # jieba.cut as cut function
)
sent_feature = outputs["sentence_feature"]
dataset = hub.dataset.ChnSentiCorp(
tokenizer=tokenizer, max_seq_len=args.max_seq_len)
num_classes = dataset.num_labels
label_list = dataset.get_labels()
# Setup feed list for data feeder
# Must feed all the tensor of senta's module need
feed_list = [inputs["words"].name]
# Construct transfer learning network
# Use sentence-level output.
sent_feature = outputs["sentence_feature"]
# Setup RunConfig for PaddleHub Fine-tune API
config = hub.RunConfig(
use_data_parallel=False,
use_cuda=args.use_gpu,
num_epoch=args.num_epoch,
batch_size=args.batch_size,
checkpoint_dir=args.checkpoint_dir,
strategy=hub.AdamWeightDecayStrategy())
# Define a classfication fine-tune task by PaddleHub's API
cls_task = hub.TextClassifierTask(
data_reader=reader,
feature=sent_feature,
feed_list=feed_list,
num_classes=dataset.num_labels,
config=config)
feature=sent_feature, num_classes=num_classes, config=config)
# Data to be predicted
data = ["这家餐厅很好吃", "这部电影真的很差劲"]
print(cls_task.predict(data=data, return_result=True))
encoded_data = [
tokenizer.encode(text=text, max_seq_len=args.max_seq_len)
for text in data
]
print(cls_task.predict(data=encoded_data, label_list=label_list))
export FLAGS_eager_delete_tensor_gb=0.0
export CUDA_VISIBLE_DEVICES=0
CKPT_DIR="./ckpt_chnsenticorp"
python -u senta_finetune.py \
--batch_size=24 \
--max_seq_len=96 \
--use_gpu=True \
--checkpoint_dir=${CKPT_DIR} \
--num_epoch=3
export FLAGS_eager_delete_tensor_gb=0.0
export CUDA_VISIBLE_DEVICES=0
CKPT_DIR="./ckpt_chnsenticorp "
python -u predict.py --checkpoint_dir $CKPT_DIR --use_gpu True
python -u predict.py --checkpoint_dir $CKPT_DIR --use_gpu True --max_seq_len=96
#coding:utf-8
# coding:utf-8
import argparse
import ast
......@@ -10,31 +10,45 @@ parser = argparse.ArgumentParser(__doc__)
parser.add_argument("--num_epoch", type=int, default=3, help="Number of epoches for fine-tuning.")
parser.add_argument("--use_gpu", type=ast.literal_eval, default=True, help="Whether use GPU for fine-tuning, input should be True or False")
parser.add_argument("--checkpoint_dir", type=str, default=None, help="Directory to model checkpoint")
parser.add_argument("--max_seq_len", type=int, default=128, help="Number of words of the longest seqence.")
parser.add_argument("--batch_size", type=int, default=32, help="Total examples' number in batch for training.")
args = parser.parse_args()
# yapf: enable.
if __name__ == '__main__':
# Load Paddlehub senta pretrained model
module = hub.Module(name="senta_bilstm")
inputs, outputs, program = module.context(trainable=True)
jieba_paddle = hub.Module(name='jieba_paddle')
# Download dataset and use LACClassifyReader to read dataset
dataset = hub.dataset.ChnSentiCorp()
reader = hub.reader.LACClassifyReader(
dataset=dataset, vocab_path=module.get_vocab_path())
sent_feature = outputs["sentence_feature"]
def cut(text):
res = jieba_paddle.cut(text, use_paddle=False)
return res
# Setup feed list for data feeder
# Must feed all the tensor of senta's module need
feed_list = [inputs["words"].name]
if __name__ == '__main__':
# Load Paddlehub senta pretrained model
module = hub.Module(name="senta_bow", version='1.2.0')
inputs, outputs, program = module.context(
trainable=True, max_seq_len=args.max_seq_len)
# Tokenizer tokenizes the text data and encodes the data as model needed.
# If you use transformer modules (ernie, bert, roberta and so on), tokenizer should be hub.BertTokenizer.
# Otherwise, tokenizer should be hub.CustomTokenizer.
# If you choose CustomTokenizer, you can also change the chinese word segmentation tool, for example jieba.
tokenizer = hub.CustomTokenizer(
vocab_file=module.get_vocab_path(),
tokenize_chinese_chars=True,
cut_function=cut, # jieba.cut as cut function
)
dataset = hub.dataset.ChnSentiCorp(
tokenizer=tokenizer, max_seq_len=args.max_seq_len)
# Construct transfer learning network
# Use sentence-level output.
sent_feature = outputs["sentence_feature"]
# Setup RunConfig for PaddleHub Fine-tune API
config = hub.RunConfig(
use_cuda=args.use_gpu,
use_pyreader=False,
use_data_parallel=False,
num_epoch=args.num_epoch,
batch_size=args.batch_size,
checkpoint_dir=args.checkpoint_dir,
......@@ -42,12 +56,8 @@ if __name__ == '__main__':
# Define a classfication fine-tune task by PaddleHub's API
cls_task = hub.TextClassifierTask(
data_reader=reader,
dataset=dataset,
feature=sent_feature,
feed_list=feed_list,
num_classes=dataset.num_labels,
config=config)
# Fine-tune and evaluate by PaddleHub's API
# will finish training, evaluation, testing, save model automatically
cls_task.finetune_and_eval()
......@@ -75,7 +75,7 @@ Loading lac successful.
```
这样我们就完成了对词法分析的预测服务化部署和测试。
完整的测试代码见[lac_serving_demo.py](lac_serving_demo.py)
完整的测试代码见[lac_serving_demo.py](./lac_serving_demo.py)
### 使用自定义词典
`LAC`模型在预测时还可以使用自定义词典干预默认分词结果,这种情况只需要将自定义词典以文件的形式附加到request请求即可,数据格式如下:
......@@ -91,7 +91,7 @@ Loading lac successful.
>>> r = requests.post(url=url, files=file, data=text)
```
完整的测试代码见[lac_with_dict_serving_demo.py](lac_with_dict_serving_demo.py)
完整的测试代码见[lac_with_dict_serving_demo.py](./lac_with_dict_serving_demo.py)
### 客户端请求新版模型的方式
对某些新版模型,客户端请求方式有所变化,更接近本地预测的请求方式,以降低学习成本。
......@@ -146,4 +146,4 @@ if __name__ == "__main__":
]
}
```
此Demo的具体信息和代码请参见[LAC Serving_2.1.0](lac_2.1.0_serving_demo.py)
此Demo的具体信息和代码请参见[LAC Serving_2.1.0](./lac_2.1.0_serving_demo.py)
......@@ -120,7 +120,7 @@ config = hub.RunConfig(use_cuda=True, num_epoch=3, batch_size=32, strategy=strat
* `dis_params_layer`: 分层学习率策略需要的参数层次信息,如果设置为module.get_params_layer(),预训练模型中各层神经网络的更新速度将逐层衰减,默认每一层的学习率是上一层学习率的1/2.6;
* `frz_params_layer`: 逐层解冻策略需要的参数层次信息,如果设置为module.get_params_layer(),预训练模型中各层神经网络将在训练过程中随着epoch的增大而参与更新,例如epoch=1时只有最上层参数会更新,epoch=2时最上2层参数都会参与更新;
关于ULMFiT策略的详细说明,请参考[论文](https://arxiv.org/pdf/1801.06146.pdf)。如果您希望将ULMFiT策略与AdamWeightDecay策略进行组合实验,请参考[CombinedStrategy](../../paddlehub/finetune/strategy.py:183)
关于ULMFiT策略的详细说明,请参考[论文](https://arxiv.org/pdf/1801.06146.pdf)。如果您希望将ULMFiT策略与AdamWeightDecay策略进行组合实验,请参考[CombinedStrategy](../../docs/reference/strategy.md)
#### 运行配置
`RunConfig` 主要控制Fine-tune的训练,包含以下可控制的参数:
......@@ -151,11 +151,12 @@ gen_task.finetune_and_eval()
1. `outputs["pooled_output"]`返回了Transformer类预训练模型对应的[CLS]向量,可以用于句子或句对的特征表达。这一特征将用于TextGenerationTask Decoder状态初始化。
2. `outputs["sequence_output"]`返回了ERNIE/BERT模型输入单词的对应输出,可以用于单词的特征表达;这一特征将用于TextGenerationTask Decoder解码。
3. 当前TextGenerationTask采用如下图所示的seq2seq结构:
<p align="center">
<img src="https://d2l.ai/_images/encoder-decoder.svg" width='60%' align="middle"
</p>
其中Encoder为hub.Module指定的预训练模型,Decoder为通用的Attention LSTM结构,如果您希望进一步增强Decoder性能,可以尝试修改[generation_task组网代码](../../paddlehub/finetune/task/generation_task.py:156)
其中Encoder为hub.Module指定的预训练模型,Decoder为通用的LSTM+Attention结构.
#### 自定义迁移任务
......@@ -191,5 +192,4 @@ PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜
## Fine-tune之后保存的模型转化为PaddleHub Module
代码详见[finetuned_model_to_module](./finetuned_model_to_module)文件夹下
Fine-tune之后保存的模型转化为PaddleHub Module[教程](../../docs/tutorial/finetuned_model_to_module.md)
......@@ -107,7 +107,7 @@ upstream
## 文档
文档使用了 [sphinx](http://sphinx-doc.org/) 来生成,支持 [Markdown](https://guides.github.com/features/mastering-markdown/)[reStructuredText](http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html) 格式。 所有文档都在 [docs/](../docs) 目录下。
文档使用了 [sphinx](http://sphinx-doc.org/) 来生成,支持 [Markdown](https://guides.github.com/features/mastering-markdown/)[reStructuredText](http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html) 格式。 所有文档都在 [docs/](../../) 目录下。
* 在提交文档改动前,请先**在本地生成文档**`cd docs/ && make clean && make html`,然后,可以在 `docs/_build/html` 目录下找到所有生成的网页。 请认真分析生成日志中的**每个 WARNING**,这非常有可能是或**空连接**或其它问题。
......
PaddlePaddle 提供了丰富的模型,使得用户可以采用模块化的方法解决各种学习问题。本文,我们将整体介绍PaddleHub中已经准备好的丰富的预训练模型。
* 如果是想了解具体预训练模型的使用可以继续学习本课程,也可以参考 [PaddleHub预训练模型库]( https://www.paddlepaddle.org.cn/hublist )
* 如果是想了解具体预训练模型的使用可以继续学习本课程,也可以参考 [PaddleHub预训练模型库](https://www.paddlepaddle.org.cn/hublist)
* 如果想了解更多模型组网网络结构源代码请参考 [飞桨模型库](https://github.com/PaddlePaddle/models )
* 如果想了解更多模型组网网络结构源代码请参考 [飞桨模型库](https://github.com/PaddlePaddle/models)
## PaddleHub预训练模型库
* [飞桨优势特色模型](#飞桨优势特色模型)
......
......@@ -82,9 +82,9 @@ train.py用于接受PaddleHub搜索到的超参进行一次优化过程,将优
### 示例
[PaddleHub AutoDL Finetuner超参优化--NLP情感分类任务](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/autofinetune_text_classification)
[PaddleHub AutoDL Finetuner超参优化--NLP情感分类任务](../../demo/autofinetune_text_classification)
[PaddleHub AutoDL Finetuner超参优化--CV图像分类任务](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/autofinetune_image_classification)
[PaddleHub AutoDL Finetuner超参优化--CV图像分类任务](../../demo/autofinetune_image_classification)
## 三、启动方式
......
......@@ -15,7 +15,7 @@ Task定义了[组网事件](./how_to_define_task.md)和[运行事件](./how_to_d
如果您需要对图中提到的事件的具体实现进行修改,可以通过Task提供的事件回调hook机制进行改写。
如你想要改变任务评价指标,如下示例中将PaddleHub默认的accuracy评价指标改为F1评价指标。同时还想用自定义的可视化工具可视化模型训练过程,如下示例将可视化工具改写为tb-paddle。则你需要改写评估方法[log_interval_event]()。这时候你可以用Hook实现。具体使用方法如下:
如你想要改变任务评价指标,如下示例中将PaddleHub默认的accuracy评价指标改为F1评价指标。同时还想用自定义的可视化工具可视化模型训练过程,如下示例将可视化工具改写为tb-paddle。则你需要改写评估方法log_interval_event。这时候你可以用Hook实现。具体使用方法如下:
```python
import numpy as np
......@@ -120,4 +120,4 @@ task.hook_info()
"predict_start_event","predict_end_event","eval_start_event","eval_end_event",
"log_interval_event","save_ckpt_interval_event","eval_interval_event","run_step_event"。
* 如果想要改写组网事件,Hook不支持。改写组网事件参见[自定义Task](./how_to_define_task.md)
* 如何创建Task,参见[PaddleHub迁移学习示例](https://github.com/PaddlePaddle/PaddleHub/tree/develop/demo)
* 如何创建Task,参见[PaddleHub迁移学习示例](../../demo)
......@@ -31,7 +31,9 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \
|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu|
|--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式<br>*`Windows操作系统只支持单进程方式`*|
|--workers|在并发方式下指定的并发任务数,默认为`2*cpu_count-1`,其中`cpu_count`为CPU核数|
**NOTE:** --use_gpu不可与--use_multiprocess共用。
#### 配置文件启动
启动命令
```shell
......@@ -208,43 +210,19 @@ $ PaddleHub Serving will stop.
```
则serving服务已经停止。
此Demo的具体信息和代码请参见[LAC Serving](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/lexical_analysis_lac)。另外,下面展示了一些其他的一键服务部署Demo。
此Demo的具体信息和代码请参见[LAC Serving](../../demo/serving/module_serving/lexical_analysis_lac)。另外,下面展示了一些其他的一键服务部署Demo。
## Demo——其他模型的一键部署服务
获取其他PaddleHub Serving的一键服务部署场景示例,可参见下列demo
* [图像分类-基于vgg11_imagent](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/classification_vgg11_imagenet)
&emsp;&emsp;该示例展示了利用vgg11_imagent完成图像分类服务化部署和在线预测,获取图像分类结果。
* [图像生成-基于stgan_celeba](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/GAN_stgan_celeba)
&emsp;&emsp;该示例展示了利用stgan_celeba生成图像服务化部署和在线预测,获取指定风格的生成图像。
* [文本审核-基于porn_detection_lstm](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/text_censorship_porn_detection_lstm)
&emsp;&emsp;该示例展示了利用porn_detection_lstm完成中文文本黄色敏感信息鉴定的服务化部署和在线预测,获取文本是否敏感及其置信度。
* [中文词法分析-基于lac](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/lexical_analysis_lac)
&emsp;&emsp;该示例展示了利用lac完成中文文本分词服务化部署和在线预测,获取文本的分词结果,并可通过用户自定义词典干预分词结果。
* [目标检测-基于yolov3_darknet53_coco2017](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/object_detection_yolov3_darknet53_coco2017)
&emsp;&emsp;该示例展示了利用yolov3_darknet53_coco2017完成目标检测服务化部署和在线预测,获取检测结果和覆盖识别框的图片。
* [中文语义分析-基于simnet_bow](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/semantic_model_simnet_bow)
&emsp;&emsp;该示例展示了利用simnet_bow完成中文文本相似度检测服务化部署和在线预测,获取文本的相似程度。
* [图像分割-基于deeplabv3p_xception65_humanseg](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/semantic_segmentation_deeplabv3p_xception65_humanseg)
* [中文分词](../../demo/serving/module_serving/lexical_analysis_lac)
&emsp;&emsp;该示例展示了利用deeplabv3p_xception65_humanseg完成图像分割服务化部署和在线预测,获取识别结果和分割后的图像
&emsp;&emsp;该示例展示了利用LAC模型完成中文分词服务化部署和在线预测分词结果
* [中文情感分析-基于senta_lstm](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/sentiment_analysis_senta_lstm)
* [口罩检测](../../demo/serving/module_serving/object_detection_pyramidbox_lite_server_mask)
&emsp;&emsp;该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果
&emsp;&emsp;该示例展示了利用pyramidbox_lite_server_mask模型检测是否佩戴口罩
## 客户端请求新版模型的方式
对某些新版模型,客户端请求方式有所变化,更接近本地预测的请求方式,以降低学习成本。
......@@ -277,7 +255,7 @@ if __name__ == "__main__":
print(json.dumps(r.json(), indent=4, ensure_ascii=False))
```
此Demo的具体信息和代码请参见[LAC Serving_2.1.0](https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.7/demo/serving/module_serving/lexical_analysis_lac/lac_2.1.0_serving_demo.py)
此Demo的具体信息和代码请参见[LAC Serving_2.1.0](../../demo/serving/module_serving/lexical_analysis_lac/lac_2.1.0_serving_demo.py)
## Bert Service
除了预训练模型一键服务部署功能之外,PaddleHub Serving还具有`Bert Service`功能,支持ernie_tiny、bert等模型快速部署,对外提供可靠的在线embedding服务,具体信息请参见[Bert Service](./bert_service.md)
......@@ -96,7 +96,7 @@ embedding_result = module.get_embedding(texts=[["Sample1_text_a"],["Sample2_text
params_layer = module.get_params_layer()
strategy = hub.finetune.strategy.ULMFiTStrategy(frz_params_layer=params_layer, dis_params_layer=params_layer)
```
利用该PaddleHub Module Fine-tune示例,可参考[文本分类](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.4.0/demo/text-classification)
利用该PaddleHub Module Fine-tune示例,可参考[文本分类](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.8/demo/text_classification)
**Note**:建议该PaddleHub Module在**GPU**环境中运行。如出现显存不足,可以将**batch_size****max_seq_len**调小。
......
......@@ -120,19 +120,23 @@ class ClassifierTask(BaseTask):
# The first key will be used as main metrics to update the best model
scores = OrderedDict()
precision, recall, f1 = calculate_f1_np(all_infers, all_labels)
matthews = matthews_corrcoef(all_infers, all_labels)
for metric in self.metrics_choices:
if metric == "acc":
avg_acc = acc_sum / run_examples
scores["acc"] = avg_acc
if metric == "precision":
scores["precision"] = precision
elif metric == "recall":
scores["recall"] = recall
elif metric == "f1":
f1 = calculate_f1_np(all_infers, all_labels)
scores["f1"] = f1
elif metric == "acc":
scores["acc"] = acc_sum / run_examples
elif metric == "matthews":
matthews = matthews_corrcoef(all_infers, all_labels)
scores["matthews"] = matthews
else:
raise ValueError("Not Support Metric: \"%s\"" % metric)
raise ValueError(
"Unknown metric: %s! The chosen metrics must be acc, f1, presicion or recall."
% metric)
return scores, avg_loss, run_speed
......@@ -195,7 +199,7 @@ class TextClassifierTask(ClassifierTask):
startup_program (object): the customized startup program, default None.
config (RunConfig): run config for the task, such as batch_size, epoch, learning_rate setting and so on. Default None.
hidden_units(list): the element of `hidden_units` list is the full-connect layer size. It will add the full-connect layers to the program. Default None.
metrics_choices(list): metrics used to the task, default ["acc"].
metrics_choices(list): metrics used to the task, default ["acc"]. Choices: acc, precision, recall, f1, matthews.
"""
if (not feature) and (not token_feature):
logger.error(
......
......@@ -245,12 +245,12 @@ class PairwiseTextMatchingTask(BaseTask):
scores["recall"] = recall
elif metric == "f1":
scores["f1"] = f1
elif "acc" in self.metrics_choices:
elif metric == "acc":
scores["acc"] = acc
else:
raise ValueError(
"Unknown metric: %s! The chosen metrics must be acc, f1, presicion and recall."
% self.metrics_choice)
"Unknown metric: %s! The chosen metrics must be acc, f1, presicion or recall."
% metric)
return scores, avg_loss, run_speed
......@@ -539,11 +539,11 @@ class PointwiseTextMatchingTask(BaseTask):
scores["recall"] = recall
elif metric == "f1":
scores["f1"] = f1
elif "acc" in self.metrics_choices:
elif metric == "acc":
scores["acc"] = acc
else:
raise ValueError(
"Unknown metric: %s! The chosen metrics must be acc, f1, presicion and recall."
"Unknown metric: %s! The chosen metrics must be acc, f1, presicion or recall."
% self.metrics_choice)
return scores, avg_loss, run_speed
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册