From ba7e8357bbeda2b6725f5ebd8844af524e97ff4e Mon Sep 17 00:00:00 2001 From: Zixuan Chen <56873761+v-zich@users.noreply.github.com> Date: Mon, 16 Dec 2019 20:27:08 +0800 Subject: [PATCH] update document (#439) --- B-教学案例与实践/B13-AI对联生成案例/README.md | 28 +++++++----------- .../code/service/up2down_model/up2down_model.py | 2 +- .../docs/md_resources/getDownCouplet.png | Bin 5195 -> 13078 bytes 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/B-教学案例与实践/B13-AI对联生成案例/README.md b/B-教学案例与实践/B13-AI对联生成案例/README.md index 667b6230..25294533 100644 --- a/B-教学案例与实践/B13-AI对联生成案例/README.md +++ b/B-教学案例与实践/B13-AI对联生成案例/README.md @@ -187,7 +187,7 @@ pip install -r train_requirements.txt + Fairseq 工具包:[Fairseq](https://github.com/pytorch/fairseq) 是 Facebook 推出的一个序列建模工具包,这个工具包允许研究和开发人员自定义训练翻译、摘要、语言模型等文本生成任务。这里是它的 PyTorch 实现。 本案例中,我们使用 T2T 工具包进行模型训练。 - + ## 数据收集 @@ -258,15 +258,7 @@ pip install -r train_requirements.txt cat merge.txt.vocab | awk ‘{print $1}’ > merge.txt.vocab.clean ``` -4. 将 merge.txt.vocab.clean 的前三行填充如下内容,并将字表字数加3: - - ``` - - - - ``` - -5. 生成测试集。 +4. 生成测试集。 取训练集中前 100 个数据作为测试集。(在实际训练过程中,没有用到测试集) @@ -281,7 +273,7 @@ pip install -r train_requirements.txt * train.txt.down.clean * merge.txt.vocab.clean -将上述文件放到`data_dir`目录。 +将上述文件放到`usr_dir`目录(新建目录)。 ### 自定义T2T问题 @@ -312,7 +304,6 @@ pip install -r train_requirements.txt usr_dir \ __init__.py merge_vocab.py -data_dir \ train.txt.up.clean train.txt.down.clean merge.txt.vocab.clean @@ -339,9 +330,10 @@ t2t-datagen \ `t2t_usr_dir`:指定了一个目录,该目录中包含 \_\_init\_\_.py 文件,并可以导入处理对联问题的 python 模块。在该目录中,编写 merge_vocab.py 文件,注册对联问题。 -`data_dir`:数据目录。存放生成训练数据所需的所有源数据资源,以及生成的训练数据文件。 +`data_dir`:数据目录。存放生成的训练数据文件。 + +`problem`:定义问题名称,本案例中问题名称为 translate_up2down。 -`problem`:定义问题名称,本案例中问题名称为 translate_up2down 当命令执行完毕,将会在 data 目录下生成两个文件: translate_up2down-train-00000-of-00001 @@ -539,6 +531,8 @@ chmod +x ./inference.sh ``` pip install tensorflow-serving-api==1.14.0 ``` + 注意:安装`tensorflow-serving-api`会自动安装`tensorflow`的cpu版本,会覆盖`tensorflow-gpu`版本。 + 2. 导出我们训练好的模型 @@ -590,7 +584,7 @@ chmod +x ./inference.sh ``` from up2down_model.up2down_model import up2down -up2down.get_down_couplet(upper_couplet) +up2down.get_down_couplet([upper_couplet]) ``` 由于服务开启后无需再次加载模型和其余相关文件,因此模型推理速度非常快,适合作为应用的接口调用。 @@ -619,9 +613,9 @@ up2down.get_down_couplet(upper_couplet) def get_couplet_down(): couplet_up = request.args.get('upper','') - couplet_down = up2down.get_down_couplet(couplet_up) + couplet_down = up2down.get_down_couplet([couplet_up]) - return couplet_up + "," + couplet_down + return couplet_up + "," + couplet_down[0] ``` diff --git a/B-教学案例与实践/B13-AI对联生成案例/code/service/up2down_model/up2down_model.py b/B-教学案例与实践/B13-AI对联生成案例/code/service/up2down_model/up2down_model.py index ca4960ef..f3d4dcf4 100644 --- a/B-教学案例与实践/B13-AI对联生成案例/code/service/up2down_model/up2down_model.py +++ b/B-教学案例与实践/B13-AI对联生成案例/code/service/up2down_model/up2down_model.py @@ -59,7 +59,7 @@ class up2down_class: raw_outputs = serving_utils.predict(input_sentence_list, self.problem, self.request_fn) outputs = self.format_output(raw_outputs) - outputs = reduce(lambda x,y: x+y,outputs) + return outputs def format_input(self, input_sentence_raw_list): diff --git a/B-教学案例与实践/B13-AI对联生成案例/docs/md_resources/getDownCouplet.png b/B-教学案例与实践/B13-AI对联生成案例/docs/md_resources/getDownCouplet.png index d49f2c9a398927cf8f3f84d5151408cbd9305ca8..6e33e85a8850be581605335544042e5adbfa8a15 100644 GIT binary patch literal 13078 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