未验证 提交 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` ## `v1.7.0`
* 丰富预训练模型,提升应用性 * 丰富预训练模型,提升应用性
...@@ -52,7 +64,7 @@ ...@@ -52,7 +64,7 @@
# `v1.5.0` # `v1.5.0`
* 升级PaddleHub Serving,提升性能和易用性 * 升级PaddleHub Serving,提升性能和易用性
* 新增文本Embedding服务[Bert Service](./tutorial/bert_service.md), 轻松获取文本embedding; * 新增文本Embedding服务[Bert Service](./docs/tutorial/bert_service.md), 轻松获取文本embedding;
* 代码精短,易于使用。服务端/客户端一行命令即可获取文本embedding; * 代码精短,易于使用。服务端/客户端一行命令即可获取文本embedding;
* 更高性能,更高效率。通过Paddle AnalysisPredictor API优化计算图,提升速度减小显存占用 * 更高性能,更高效率。通过Paddle AnalysisPredictor API优化计算图,提升速度减小显存占用
* 随"机"应变,灵活扩展。根据机器资源和实际需求可灵活增加服务端数量,支持多显卡多模型计算任务 * 随"机"应变,灵活扩展。根据机器资源和实际需求可灵活增加服务端数量,支持多显卡多模型计算任务
......
...@@ -8,7 +8,7 @@ This page implements the [DELTA](https://arxiv.org/abs/1901.09229) algorithm in ...@@ -8,7 +8,7 @@ This page implements the [DELTA](https://arxiv.org/abs/1901.09229) algorithm in
## Preparation of Data and Pre-trained Model ## 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/xxy.jpg
root/train/dog/xxz.jpg root/train/dog/xxz.jpg
......
...@@ -33,14 +33,14 @@ ...@@ -33,14 +33,14 @@
* [阅读理解](./reading_comprehension) * [阅读理解](./reading_comprehension)
该样例展示了PaddleHub如何将BERT作为预训练模型在SQAD数据集上完成阅读理解的FineTune和预测。 该样例展示了PaddleHub如何将BERT作为预训练模型在SQAD数据集上完成阅读理解的FineTune和预测。
* [检索式问答任务](./qa_classfication) * [检索式问答任务](./qa_classification)
该样例展示了PaddleHub如何将ERNIE和BERT作为预训练模型在NLPCC-DBQA等数据集上完成检索式问答任务的FineTune和预测。 该样例展示了PaddleHub如何将ERNIE和BERT作为预训练模型在NLPCC-DBQA等数据集上完成检索式问答任务的FineTune和预测。
* [句子语义相似度计算](./sentence_similarity) * [句子语义相似度计算](./sentence_similarity)
该样例展示了PaddleHub如何将word2vec_skipgram用于计算两个文本语义相似度。 该样例展示了PaddleHub如何将word2vec_skipgram用于计算两个文本语义相似度。
* [超参优化AutoDL Finetuner使用](./autofinetune) * 超参优化AutoDL Finetuner使用
该样例展示了PaddleHub超参优化AutoDL Finetuner如何使用,给出了自动搜素图像分类/文本分类任务的较佳超参数示例。 该样例展示了PaddleHub超参优化AutoDL Finetuner如何使用,给出了自动搜[图像分类](./autofinetune_image_classification)/[文本分类](./autofinetune_text_classification)任务的较佳超参数示例。
* [服务化部署Hub Serving使用](./serving) * [服务化部署Hub Serving使用](./serving)
该样例文件夹下展示了服务化部署Hub Serving如何使用,将PaddleHub支持的可预测Module如何服务化部署。 该样例文件夹下展示了服务化部署Hub Serving如何使用,将PaddleHub支持的可预测Module如何服务化部署。
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
请确认转化时,使用的PaddleHub为1.6.0以上版本。 请确认转化时,使用的PaddleHub为1.6.0以上版本。
**NOTE:** **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 ...@@ -50,7 +50,7 @@ pairwise_text_matching
```python ```python
module = hub.Module(name="tencent_ailab_chinese_embedding_small") 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,根据任务文本长度不同可以调整该值。 其中最大序列长度`max_seq_len`是可以调整的参数,建议值128,根据任务文本长度不同可以调整该值。
...@@ -99,11 +99,11 @@ dataset = hub.dataset.DuEL(tokenizer=tokenizer, max_seq_len=128) ...@@ -99,11 +99,11 @@ dataset = hub.dataset.DuEL(tokenizer=tokenizer, max_seq_len=128)
`max_seq_len` 需要与Step1中context接口传入的序列长度保持一致; `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:选择优化策略和运行配置 ### Step4:选择优化策略和运行配置
...@@ -170,7 +170,7 @@ matching_task.finetune_and_eval() ...@@ -170,7 +170,7 @@ matching_task.finetune_and_eval()
#### 自定义迁移任务 #### 自定义迁移任务
如果想改变迁移任务组网,详细参见[自定义迁移任务]()。 如果想改变迁移任务组网,详细参见[自定义迁移任务](../../docs/tutorial/how_to_define_task.md)
## 可视化 ## 可视化
......
...@@ -46,7 +46,7 @@ pointwise_text_matching ...@@ -46,7 +46,7 @@ pointwise_text_matching
```python ```python
module = hub.Module(name="tencent_ailab_chinese_embedding_small") 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,根据任务文本长度不同可以调整该值。 其中最大序列长度`max_seq_len`是可以调整的参数,建议值128,根据任务文本长度不同可以调整该值。
...@@ -95,11 +95,11 @@ dataset = hub.dataset.LCQMC(tokenizer=tokenizer, max_seq_len=128) ...@@ -95,11 +95,11 @@ dataset = hub.dataset.LCQMC(tokenizer=tokenizer, max_seq_len=128)
`max_seq_len` 需要与Step1中context接口传入的序列长度保持一致; `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:选择优化策略和运行配置 ### Step4:选择优化策略和运行配置
...@@ -164,7 +164,7 @@ matching_task.finetune_and_eval() ...@@ -164,7 +164,7 @@ matching_task.finetune_and_eval()
#### 自定义迁移任务 #### 自定义迁移任务
如果想改变迁移任务组网,详细参见[自定义迁移任务]()。 如果想改变迁移任务组网,详细参见[自定义迁移任务](../../docs/tutorial/how_to_define_task.md)
## 可视化 ## 可视化
......
...@@ -41,6 +41,7 @@ $ sh run_finetune.sh ...@@ -41,6 +41,7 @@ $ sh run_finetune.sh
--batch_size: 批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数; --batch_size: 批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数;
--checkpoint_dir: 模型保存路径,PaddleHub会自动保存验证集上表现最好的模型; --checkpoint_dir: 模型保存路径,PaddleHub会自动保存验证集上表现最好的模型;
--num_epoch: Fine-tune迭代的轮数; --num_epoch: Fine-tune迭代的轮数;
--max_seq_len: 模型使用的最大序列长度, 若出现显存不足,请适当调低这一参数;
--use_gpu: 是否使用GPU进行训练,如果机器支持GPU且安装了GPU版本的PaddlePaddle,我们建议您打开这个开关; --use_gpu: 是否使用GPU进行训练,如果机器支持GPU且安装了GPU版本的PaddlePaddle,我们建议您打开这个开关;
``` ```
...@@ -50,9 +51,11 @@ $ sh run_finetune.sh ...@@ -50,9 +51,11 @@ $ sh run_finetune.sh
```python ```python
module = hub.Module(name="senta_bilstm") 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提供Senta一列模型可供选择, 模型对应的加载示例如下:
模型名 | PaddleHub Module 模型名 | PaddleHub Module
...@@ -71,21 +74,32 @@ senta_cnn | `hub.Module(name='senta_cnn')` ...@@ -71,21 +74,32 @@ senta_cnn | `hub.Module(name='senta_cnn')`
module = hub.Module(name="senta_gru") module = hub.Module(name="senta_gru")
``` ```
### Step2: 准备数据集并使用LACClassifyReader读取数据 ### Step2: 选择Tokenizer读取数据
```python ```python
dataset = hub.dataset.ChnSentiCorp() tokenizer = hub.CustomTokenizer(
reader = hub.reader.LACClassifyReader( vocab_file=module.get_vocab_path(),
dataset=dataset, tokenize_chinese_chars=True,
vocab_path=module.get_vocab_path()) )
``` ```
`hub.dataset.ChnSentiCorp()` 会自动从网络下载数据集并解压到用户目录下`$HOME/.paddlehub/dataset`目录;
`module.get_vocab_path()` 会返回预训练模型对应的词表; `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"] ...@@ -131,18 +145,20 @@ sent_feature = outputs["sentence_feature"]
feed_list = [inputs["words"].name] feed_list = [inputs["words"].name]
cls_task = hub.TextClassifierTask( cls_task = hub.TextClassifierTask(
data_reader=reader, dataset=dataset,
feature=sent_feature, feature=sent_feature,
feed_list=feed_list, num_classes=2,
num_classes=dataset.num_labels,
config=config) config=config)
cls_task.finetune_and_eval() cls_task.finetune_and_eval()
``` ```
**NOTE:** **NOTE:**
1. `outputs["sentence_feature"]`返回了senta模型对应的句子特征,可以用于句子的特征表达; 1. `outputs["sentence_feature"]`返回了senta模型对应的句子特征,可以用于句子的特征表达;
2. `feed_list`中的inputs参数指名了senta中的输入tensor的顺序,与LACClassifyReader返回的结果一致; 2. `hub.TextClassifierTask`通过输入特征,label与迁移的类别数,可以生成适用于文本分类的迁移任务`TextClassifierTask`
3. `hub.TextClassifierTask`通过输入特征,label与迁移的类别数,可以生成适用于文本分类的迁移任务`TextClassifierTask`
#### 自定义迁移任务
如果想改变迁移任务组网,详细参见[自定义迁移任务](../../docs/tutorial/how_to_define_task.md)
## 可视化 ## 可视化
...@@ -165,24 +181,7 @@ python predict.py --checkpoint_dir $CKPT_DIR ...@@ -165,24 +181,7 @@ python predict.py --checkpoint_dir $CKPT_DIR
参数配置正确后,请执行脚本`sh run_predict.sh`,即可看到以下文本分类预测结果, 以及最终准确率。 参数配置正确后,请执行脚本`sh run_predict.sh`,即可看到以下文本分类预测结果, 以及最终准确率。
如需了解更多预测步骤,请参考`predict.py` 如需了解更多预测步骤,请参考`predict.py`
我们在AI Studio上提供了IPython NoteBook形式的demo,点击[PaddleHub教程合集](https://aistudio.baidu.com/aistudio/projectdetail/231146),可使用AI Studio平台提供的GPU算力进行快速尝试。
我们在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)||
## 超参优化AutoDL Finetuner ## 超参优化AutoDL Finetuner
......
#coding:utf-8 # coding:utf-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import argparse import argparse
import ast import ast
import numpy as np
import os
import time
import paddle
import paddle.fluid as fluid import paddle.fluid as fluid
import paddlehub as hub import paddlehub as hub
# yapf: disable # yapf: disable
parser = argparse.ArgumentParser(__doc__) parser = argparse.ArgumentParser(__doc__)
parser.add_argument("--checkpoint_dir", type=str, default=None, help="Directory to model checkpoint") 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("--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("--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() args = parser.parse_args()
# yapf: enable. # 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__': if __name__ == '__main__':
# loading Paddlehub senta pretrained model # Load Paddlehub senta pretrained model
module = hub.Module(name="senta_bilstm") module = hub.Module(name="senta_bow", version='1.2.0')
inputs, outputs, program = module.context(trainable=True) inputs, outputs, program = module.context(
trainable=True, max_seq_len=args.max_seq_len)
# Download dataset and use LACClassifyReader to read dataset # Tokenizer tokenizes the text data and encodes the data as model needed.
dataset = hub.dataset.ChnSentiCorp() # If you use transformer modules (ernie, bert, roberta and so on), tokenizer should be hub.BertTokenizer.
reader = hub.reader.LACClassifyReader( # Otherwise, tokenizer should be hub.CustomTokenizer.
dataset=dataset, vocab_path=module.get_vocab_path()) # 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 # Construct transfer learning network
# Must feed all the tensor of senta's module need # Use sentence-level output.
feed_list = [inputs["words"].name] sent_feature = outputs["sentence_feature"]
# Setup RunConfig for PaddleHub Fine-tune API # Setup RunConfig for PaddleHub Fine-tune API
config = hub.RunConfig( config = hub.RunConfig(
use_data_parallel=False,
use_cuda=args.use_gpu, use_cuda=args.use_gpu,
num_epoch=args.num_epoch,
batch_size=args.batch_size, batch_size=args.batch_size,
checkpoint_dir=args.checkpoint_dir, checkpoint_dir=args.checkpoint_dir,
strategy=hub.AdamWeightDecayStrategy()) strategy=hub.AdamWeightDecayStrategy())
# Define a classfication fine-tune task by PaddleHub's API # Define a classfication fine-tune task by PaddleHub's API
cls_task = hub.TextClassifierTask( cls_task = hub.TextClassifierTask(
data_reader=reader, feature=sent_feature, num_classes=num_classes, config=config)
feature=sent_feature,
feed_list=feed_list,
num_classes=dataset.num_labels,
config=config)
# Data to be predicted # Data to be predicted
data = ["这家餐厅很好吃", "这部电影真的很差劲"] 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 export CUDA_VISIBLE_DEVICES=0
CKPT_DIR="./ckpt_chnsenticorp" CKPT_DIR="./ckpt_chnsenticorp"
python -u senta_finetune.py \ python -u senta_finetune.py \
--batch_size=24 \ --batch_size=24 \
--max_seq_len=96 \
--use_gpu=True \ --use_gpu=True \
--checkpoint_dir=${CKPT_DIR} \ --checkpoint_dir=${CKPT_DIR} \
--num_epoch=3 --num_epoch=3
export FLAGS_eager_delete_tensor_gb=0.0
export CUDA_VISIBLE_DEVICES=0 export CUDA_VISIBLE_DEVICES=0
CKPT_DIR="./ckpt_chnsenticorp " 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 argparse
import ast import ast
...@@ -10,31 +10,45 @@ parser = argparse.ArgumentParser(__doc__) ...@@ -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("--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("--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("--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.") parser.add_argument("--batch_size", type=int, default=32, help="Total examples' number in batch for training.")
args = parser.parse_args() args = parser.parse_args()
# yapf: enable. # yapf: enable.
if __name__ == '__main__': jieba_paddle = hub.Module(name='jieba_paddle')
# Load Paddlehub senta pretrained model
module = hub.Module(name="senta_bilstm")
inputs, outputs, program = module.context(trainable=True)
# 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 if __name__ == '__main__':
# Must feed all the tensor of senta's module need # Load Paddlehub senta pretrained model
feed_list = [inputs["words"].name] 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 # Setup RunConfig for PaddleHub Fine-tune API
config = hub.RunConfig( config = hub.RunConfig(
use_cuda=args.use_gpu, use_cuda=args.use_gpu,
use_pyreader=False,
use_data_parallel=False,
num_epoch=args.num_epoch, num_epoch=args.num_epoch,
batch_size=args.batch_size, batch_size=args.batch_size,
checkpoint_dir=args.checkpoint_dir, checkpoint_dir=args.checkpoint_dir,
...@@ -42,12 +56,8 @@ if __name__ == '__main__': ...@@ -42,12 +56,8 @@ if __name__ == '__main__':
# Define a classfication fine-tune task by PaddleHub's API # Define a classfication fine-tune task by PaddleHub's API
cls_task = hub.TextClassifierTask( cls_task = hub.TextClassifierTask(
data_reader=reader, dataset=dataset,
feature=sent_feature, feature=sent_feature,
feed_list=feed_list,
num_classes=dataset.num_labels, num_classes=dataset.num_labels,
config=config) config=config)
# Fine-tune and evaluate by PaddleHub's API
# will finish training, evaluation, testing, save model automatically
cls_task.finetune_and_eval() cls_task.finetune_and_eval()
...@@ -75,7 +75,7 @@ Loading lac successful. ...@@ -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请求即可,数据格式如下: `LAC`模型在预测时还可以使用自定义词典干预默认分词结果,这种情况只需要将自定义词典以文件的形式附加到request请求即可,数据格式如下:
...@@ -91,7 +91,7 @@ Loading lac successful. ...@@ -91,7 +91,7 @@ Loading lac successful.
>>> r = requests.post(url=url, files=file, data=text) >>> 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__": ...@@ -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 ...@@ -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; * `dis_params_layer`: 分层学习率策略需要的参数层次信息,如果设置为module.get_params_layer(),预训练模型中各层神经网络的更新速度将逐层衰减,默认每一层的学习率是上一层学习率的1/2.6;
* `frz_params_layer`: 逐层解冻策略需要的参数层次信息,如果设置为module.get_params_layer(),预训练模型中各层神经网络将在训练过程中随着epoch的增大而参与更新,例如epoch=1时只有最上层参数会更新,epoch=2时最上2层参数都会参与更新; * `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的训练,包含以下可控制的参数: `RunConfig` 主要控制Fine-tune的训练,包含以下可控制的参数:
...@@ -151,11 +151,12 @@ gen_task.finetune_and_eval() ...@@ -151,11 +151,12 @@ gen_task.finetune_and_eval()
1. `outputs["pooled_output"]`返回了Transformer类预训练模型对应的[CLS]向量,可以用于句子或句对的特征表达。这一特征将用于TextGenerationTask Decoder状态初始化。 1. `outputs["pooled_output"]`返回了Transformer类预训练模型对应的[CLS]向量,可以用于句子或句对的特征表达。这一特征将用于TextGenerationTask Decoder状态初始化。
2. `outputs["sequence_output"]`返回了ERNIE/BERT模型输入单词的对应输出,可以用于单词的特征表达;这一特征将用于TextGenerationTask Decoder解码。 2. `outputs["sequence_output"]`返回了ERNIE/BERT模型输入单词的对应输出,可以用于单词的特征表达;这一特征将用于TextGenerationTask Decoder解码。
3. 当前TextGenerationTask采用如下图所示的seq2seq结构: 3. 当前TextGenerationTask采用如下图所示的seq2seq结构:
<p align="center"> <p align="center">
<img src="https://d2l.ai/_images/encoder-decoder.svg" width='60%' align="middle" <img src="https://d2l.ai/_images/encoder-decoder.svg" width='60%' align="middle"
</p> </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)功能, 自动搜 ...@@ -191,5 +192,4 @@ PaddleHub还提供了超参优化(Hyperparameter Tuning)功能, 自动搜
## Fine-tune之后保存的模型转化为PaddleHub Module ## Fine-tune之后保存的模型转化为PaddleHub Module
代码详见[finetuned_model_to_module](./finetuned_model_to_module)文件夹下
Fine-tune之后保存的模型转化为PaddleHub Module[教程](../../docs/tutorial/finetuned_model_to_module.md) Fine-tune之后保存的模型转化为PaddleHub Module[教程](../../docs/tutorial/finetuned_model_to_module.md)
...@@ -107,7 +107,7 @@ upstream ...@@ -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**,这非常有可能是或**空连接**或其它问题。 * 在提交文档改动前,请先**在本地生成文档**`cd docs/ && make clean && make html`,然后,可以在 `docs/_build/html` 目录下找到所有生成的网页。 请认真分析生成日志中的**每个 WARNING**,这非常有可能是或**空连接**或其它问题。
......
PaddlePaddle 提供了丰富的模型,使得用户可以采用模块化的方法解决各种学习问题。本文,我们将整体介绍PaddleHub中已经准备好的丰富的预训练模型。 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预训练模型库 ## PaddleHub预训练模型库
* [飞桨优势特色模型](#飞桨优势特色模型) * [飞桨优势特色模型](#飞桨优势特色模型)
......
...@@ -82,9 +82,9 @@ train.py用于接受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 ...@@ -15,7 +15,7 @@ Task定义了[组网事件](./how_to_define_task.md)和[运行事件](./how_to_d
如果您需要对图中提到的事件的具体实现进行修改,可以通过Task提供的事件回调hook机制进行改写。 如果您需要对图中提到的事件的具体实现进行修改,可以通过Task提供的事件回调hook机制进行改写。
如你想要改变任务评价指标,如下示例中将PaddleHub默认的accuracy评价指标改为F1评价指标。同时还想用自定义的可视化工具可视化模型训练过程,如下示例将可视化工具改写为tb-paddle。则你需要改写评估方法[log_interval_event]()。这时候你可以用Hook实现。具体使用方法如下: 如你想要改变任务评价指标,如下示例中将PaddleHub默认的accuracy评价指标改为F1评价指标。同时还想用自定义的可视化工具可视化模型训练过程,如下示例将可视化工具改写为tb-paddle。则你需要改写评估方法log_interval_event。这时候你可以用Hook实现。具体使用方法如下:
```python ```python
import numpy as np import numpy as np
...@@ -120,4 +120,4 @@ task.hook_info() ...@@ -120,4 +120,4 @@ task.hook_info()
"predict_start_event","predict_end_event","eval_start_event","eval_end_event", "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"。 "log_interval_event","save_ckpt_interval_event","eval_interval_event","run_step_event"。
* 如果想要改写组网事件,Hook不支持。改写组网事件参见[自定义Task](./how_to_define_task.md) * 如果想要改写组网事件,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, ...] \ ...@@ -31,7 +31,9 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \
|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| |--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu|
|--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式<br>*`Windows操作系统只支持单进程方式`*| |--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式<br>*`Windows操作系统只支持单进程方式`*|
|--workers|在并发方式下指定的并发任务数,默认为`2*cpu_count-1`,其中`cpu_count`为CPU核数| |--workers|在并发方式下指定的并发任务数,默认为`2*cpu_count-1`,其中`cpu_count`为CPU核数|
**NOTE:** --use_gpu不可与--use_multiprocess共用。 **NOTE:** --use_gpu不可与--use_multiprocess共用。
#### 配置文件启动 #### 配置文件启动
启动命令 启动命令
```shell ```shell
...@@ -208,43 +210,19 @@ $ PaddleHub Serving will stop. ...@@ -208,43 +210,19 @@ $ PaddleHub Serving will stop.
``` ```
则serving服务已经停止。 则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——其他模型的一键部署服务 ## Demo——其他模型的一键部署服务
获取其他PaddleHub Serving的一键服务部署场景示例,可参见下列demo 获取其他PaddleHub Serving的一键服务部署场景示例,可参见下列demo
* [图像分类-基于vgg11_imagent](https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.7/demo/serving/module_serving/classification_vgg11_imagenet) * [中文分词](../../demo/serving/module_serving/lexical_analysis_lac)
&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)
&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__": ...@@ -277,7 +255,7 @@ if __name__ == "__main__":
print(json.dumps(r.json(), indent=4, ensure_ascii=False)) 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 ## Bert Service
除了预训练模型一键服务部署功能之外,PaddleHub Serving还具有`Bert Service`功能,支持ernie_tiny、bert等模型快速部署,对外提供可靠的在线embedding服务,具体信息请参见[Bert Service](./bert_service.md) 除了预训练模型一键服务部署功能之外,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 ...@@ -96,7 +96,7 @@ embedding_result = module.get_embedding(texts=[["Sample1_text_a"],["Sample2_text
params_layer = module.get_params_layer() params_layer = module.get_params_layer()
strategy = hub.finetune.strategy.ULMFiTStrategy(frz_params_layer=params_layer, dis_params_layer=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**调小。 **Note**:建议该PaddleHub Module在**GPU**环境中运行。如出现显存不足,可以将**batch_size****max_seq_len**调小。
......
...@@ -120,19 +120,23 @@ class ClassifierTask(BaseTask): ...@@ -120,19 +120,23 @@ class ClassifierTask(BaseTask):
# The first key will be used as main metrics to update the best model # The first key will be used as main metrics to update the best model
scores = OrderedDict() 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: for metric in self.metrics_choices:
if metric == "acc": if metric == "precision":
avg_acc = acc_sum / run_examples scores["precision"] = precision
scores["acc"] = avg_acc elif metric == "recall":
scores["recall"] = recall
elif metric == "f1": elif metric == "f1":
f1 = calculate_f1_np(all_infers, all_labels)
scores["f1"] = f1 scores["f1"] = f1
elif metric == "acc":
scores["acc"] = acc_sum / run_examples
elif metric == "matthews": elif metric == "matthews":
matthews = matthews_corrcoef(all_infers, all_labels)
scores["matthews"] = matthews scores["matthews"] = matthews
else: 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 return scores, avg_loss, run_speed
...@@ -195,7 +199,7 @@ class TextClassifierTask(ClassifierTask): ...@@ -195,7 +199,7 @@ class TextClassifierTask(ClassifierTask):
startup_program (object): the customized startup program, default None. 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. 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. 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): if (not feature) and (not token_feature):
logger.error( logger.error(
......
...@@ -245,12 +245,12 @@ class PairwiseTextMatchingTask(BaseTask): ...@@ -245,12 +245,12 @@ class PairwiseTextMatchingTask(BaseTask):
scores["recall"] = recall scores["recall"] = recall
elif metric == "f1": elif metric == "f1":
scores["f1"] = f1 scores["f1"] = f1
elif "acc" in self.metrics_choices: elif metric == "acc":
scores["acc"] = acc scores["acc"] = acc
else: else:
raise ValueError( 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) % metric)
return scores, avg_loss, run_speed return scores, avg_loss, run_speed
...@@ -539,11 +539,11 @@ class PointwiseTextMatchingTask(BaseTask): ...@@ -539,11 +539,11 @@ class PointwiseTextMatchingTask(BaseTask):
scores["recall"] = recall scores["recall"] = recall
elif metric == "f1": elif metric == "f1":
scores["f1"] = f1 scores["f1"] = f1
elif "acc" in self.metrics_choices: elif metric == "acc":
scores["acc"] = acc scores["acc"] = acc
else: else:
raise ValueError( 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) % self.metrics_choice)
return scores, avg_loss, run_speed return scores, avg_loss, run_speed
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册