提交 366c712b 编写于 作者: W wuzewu 提交者: bbking

Update the emotion demo and use the PaddleHub to get the ERNIE model (#2384)

上级 5c142ae7
......@@ -5,7 +5,7 @@
对话情绪识别适用于聊天、客服等多个场景,能够帮助企业更好地把握对话质量、改善产品的用户交互体验,也能分析客服服务质量、降低人工质检成本。可通过 [AI开放平台-对话情绪识别](http://ai.baidu.com/tech/nlp_apply/emotion_detection) 线上体验。
效果上,我们基于百度自建测试集(包含闲聊、客服)和nlpcc2014微博情绪数据集,进行评测,效果如下表所示,此外我们还开源了百度基于海量数据训练好的模型,该模型在聊天对话语料上fine-tune之后,可以得到更好的效果。
| 模型 | 闲聊 | 客服 | 微博 |
| :------| :------ | :------ | :------ |
| BOW | 90.2% | 87.6% | 74.2% |
......@@ -19,7 +19,10 @@
## 快速开始
本项目依赖于 Python2.7 和 Paddlepaddle Fluid 1.3.2,请参考 [安装指南](http://www.paddlepaddle.org/#quick-start) 进行安装
本项目依赖于 Python2.7、Paddlepaddle Fluid 1.4.0以及PaddleHub 0.5.0,请确保相关依赖都已安装正确
[PaddlePaddle安装指南](http://www.paddlepaddle.org/#quick-start)
[PaddleHub安装指南](https://github.com/PaddlePaddle/PaddleHub)
#### 安装代码
......@@ -135,7 +138,7 @@ python tokenizer.py --test_data_dir ./test.txt.utf8 --batch_size 1 > test.txt.ut
可以根据自己的需求,组建自定义的模型,具体方法如下所示:
1. 定义自己的网络结构
1. 定义自己的网络结构
用户可以在 ```models/classification/nets.py``` 中,定义自己的模型,只需要增加新的函数即可。假设用户自定义的函数名为```user_net```
2. 更改模型配置
```config.json``` 中需要将 ```model_type``` 改为用户自定义的 ```user_net```
......@@ -169,4 +172,3 @@ python tokenizer.py --test_data_dir ./test.txt.utf8 --batch_size 1 > test.txt.ut
## 如何贡献代码
如果你可以修复某个issue或者增加一个新功能,欢迎给我们提交PR。如果对应的PR被接受了,我们将根据贡献的质量和难度进行打分(0-5分,越高越好)。如果你累计获得了10分,可以联系我们获得面试机会或者为你写推荐信。
......@@ -201,7 +201,7 @@ def main(args):
pyreader_name='train_reader')
# get ernie_embeddings
embeddings = ernie.ernie_encoder(ernie_inputs, ernie_config=ernie_config)
embeddings = ernie.ernie_encoder_with_paddle_hub(ernie_inputs, args.max_seq_len)
# user defined model based on ernie embeddings
loss, accuracy, num_seqs = create_model(
......@@ -233,7 +233,7 @@ def main(args):
pyreader_name='eval_reader')
# get ernie_embeddings
embeddings = ernie.ernie_encoder(ernie_inputs, ernie_config=ernie_config)
embeddings = ernie.ernie_encoder_with_paddle_hub(ernie_inputs, args.max_seq_len)
# user defined model based on ernie embeddings
loss, accuracy, num_seqs = create_model(
......@@ -253,7 +253,7 @@ def main(args):
pyreader_name='infer_reader')
# get ernie_embeddings
embeddings = ernie.ernie_encoder(ernie_inputs, ernie_config=ernie_config)
embeddings = ernie.ernie_encoder_with_paddle_hub(ernie_inputs, args.max_seq_len)
probs = create_model(args,
embeddings,
......@@ -268,7 +268,7 @@ def main(args):
utils.init_checkpoint(
exe,
args.init_checkpoint,
main_program=startup_prog)
main_program=train_program)
elif args.do_val or args.do_infer:
if not args.init_checkpoint:
raise ValueError("args 'init_checkpoint' should be set if"
......
......@@ -10,6 +10,7 @@ import json
import six
import paddle.fluid as fluid
import paddlehub as hub
from models.transformer_encoder import encoder, pre_process_layer
......@@ -26,7 +27,8 @@ def ernie_pyreader(args, pyreader_name):
name=pyreader_name,
use_double_buffer=True)
(src_ids, sent_ids, pos_ids, input_mask, labels, seq_lens) = fluid.layers.read_file(pyreader)
(src_ids, sent_ids, pos_ids, input_mask, labels,
seq_lens) = fluid.layers.read_file(pyreader)
ernie_inputs = {
"src_ids": src_ids,
......@@ -38,6 +40,42 @@ def ernie_pyreader(args, pyreader_name):
return pyreader, ernie_inputs, labels
def ernie_encoder_with_paddle_hub(ernie_inputs, max_seq_len):
ernie = hub.Module(name="ernie")
inputs, outputs, program = ernie.context(
trainable=True, max_seq_len=max_seq_len, learning_rate=1)
main_program = fluid.default_main_program()
input_dict = {
inputs["input_ids"].name: ernie_inputs["src_ids"],
inputs["segment_ids"].name: ernie_inputs["sent_ids"],
inputs["position_ids"].name: ernie_inputs["pos_ids"],
inputs["input_mask"].name: ernie_inputs["input_mask"]
}
hub.connect_program(
pre_program=main_program,
next_program=program,
input_dict=input_dict,
inplace=True,
need_log=False)
enc_out = outputs["sequence_output"]
unpad_enc_out = fluid.layers.sequence_unpad(
enc_out, length=ernie_inputs["seq_lens"])
cls_feats = outputs["pooled_output"]
embeddings = {
"sentence_embeddings": cls_feats,
"token_embeddings": unpad_enc_out,
}
for k, v in embeddings.items():
v.persistable = True
return embeddings
def ernie_encoder(ernie_inputs, ernie_config):
"""return sentence embedding and token embeddings"""
......@@ -49,7 +87,8 @@ def ernie_encoder(ernie_inputs, ernie_config):
config=ernie_config)
enc_out = ernie.get_sequence_output()
unpad_enc_out = fluid.layers.sequence_unpad(enc_out, length=ernie_inputs["seq_lens"])
unpad_enc_out = fluid.layers.sequence_unpad(
enc_out, length=ernie_inputs["seq_lens"])
cls_feats = ernie.get_pooled_output()
embeddings = {
......@@ -65,6 +104,7 @@ def ernie_encoder(ernie_inputs, ernie_config):
class ErnieConfig(object):
"""ErnieConfig"""
def __init__(self, config_path):
self._config_dict = self._parse(config_path)
......@@ -90,6 +130,7 @@ class ErnieConfig(object):
class ErnieModel(object):
"""ErnieModel"""
def __init__(self,
src_ids,
position_ids,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册