古诗词是中国文化殿堂的瑰宝,记得曾经在韩国作 Exchange Student 的时候,看到他们学习咱们的古诗词,有中文的还有翻译版的,本身发自心里的骄傲,甚至也会在某些时候背起一些耳熟能详的诗词。html
本文将会经过深度学习为咱们生成一些古诗词,并将模型部署到 Serverless 架构上,实现基于 Serverless 的古诗词生成 API。python
古诗词生成其实是文本生成,或者说是生成式文本。关于基于深度学习的文本生成,最入门级的读物包括 Andrej Karpathy 的博客。他使用例子生动讲解了 Char-RNN (Character based Recurrent Neural Network) 如何用于从文本数据集里学习,而后自动生成像模像样的文本。git
上图直观展现了 Char-RNN 的原理。以要让模型学习写出「hello」为例,Char-RNN 的输入输出层都是以字符为单位。输入「h」,应该输出「e」;输入「e」,则应该输出后续的「l」。github
输入层咱们能够用只有一个元素为1的向量来编码不一样的字符,例如,「h」被编码为「1000」、「e」被编码为「0100」,而「l」被编码为「0010」。使用 RNN 的学习目标是,可让生成的下一个字符尽可能与训练样本里的目标输出一致。在图一的例子中,根据前两个字符产生的状态和第三个输入「l」预测出的下一个字符的向量为 <0.1, 0.5, 1.9, -1.1>,最大的一维是第三维,对应的字符则为「0010」,正好是「l」。这就是一个正确的预测。但从第一个「h」获得的输出向量是第四维最大,对应的并非「e」,这样就产生代价。express
学习的过程就是不断下降这个代价。学习到的模型,对任何输入字符能够很好地不断预测下一个字符,如此一来就能生成句子或段落。json
本文项目构建参考了 Github 已有项目:https://github.com/norybaby/poetapi
经过 Clone 代码,而且安装相关依赖:浏览器
pip3 install tensorflow==1.14 word2vec numpy
经过训练:架构
python3 train.py
能够看到训练结果:less
此时会生成多个模型在 output_poem 文件夹下,咱们只须要保留最好的便可,例如个人训练以后生成的 json 文件:
{ "best_model": "output_poem/best_model/model-20390", "best_valid_ppl": 21.441762924194336, "latest_model": "output_poem/save_model/model-20390", "params": { "batch_size": 16, "cell_type": "lstm", "dropout": 0.0, "embedding_size": 128, "hidden_size": 128, "input_dropout": 0.0, "learning_rate": 0.005, "max_grad_norm": 5.0, "num_layers": 2, "num_unrollings": 64 }, "test_ppl": 25.83984375 }
此时,我只须要保存 output_poem/best_model/model-20390
模型便可。
在项目目录下,安装必要依赖:
pip3 install word2vec numpy -t ./
因为 Tensorflow 等是腾讯云云函数内置的package,因此这里无需安装,另外 numpy 这个 package 须要在 CentOS+Python3.6 环境下打包。也能够经过以前制做的小工具打包:https://www.serverlesschina.com/35.html
完成以后,编写函数入口文件:
import uuid, json from write_poem import WritePoem, start_model writer = start_model() def return_msg(error, msg): return_data = { "uuid": str(uuid.uuid1()), "error": error, "message": msg } print(return_data) return return_data def main_handler(event, context): # 类型 # 1: 自由 # 2: 押韵 # 3: 藏头押韵 # 4: 藏字押韵 style = json.loads(event["body"])["style"] content = json.loads(event["body"]).get("content", None) if style in '34' and not content: return return_msg(True, "请输入content参数") if style == '1': return return_msg(False, writer.free_verse()) elif style == '2': return return_msg(False, writer.rhyme_verse()) elif style == '3': return return_msg(False, writer.cangtou(content)) elif style == '4': return return_msg(False, writer.hide_words(content)) else: return return_msg(True, "请输入正确的style参数")
同时须要准备好 Yaml 文件:
getUserIp: component: "@serverless/tencent-scf" inputs: name: autoPoem codeUri: ./ exclude: - .gitignore - .git/** - .serverless - .env handler: index.main_handler runtime: Python3.6 region: ap-beijing description: 自动古诗词撰写 namespace: serverless_tools memorySize: 512 timeout: 10 events: - apigw: name: serverless parameters: serviceId: service-8d3fi753 protocols: - http - https environment: release endpoints: - path: /auto/poem description: 自动古诗词撰写 method: POST enableCORS: true
此时,咱们就能够经过 Serverless Framework CLI 部署项目。部署完成以后,咱们能够经过 PostMan 测试咱们的接口:
本文经过已有的深度学习项目,在本地进行训练,保存模型,而后将项目部署在腾讯云云函数上,经过与 API 网关的联动,实现了一个基于深度学习的古诗词撰写的 API。
3 秒你能作什么?喝一口水,看一封邮件,仍是 —— 部署一个完整的 Serverless 应用?
复制连接至 PC 浏览器访问:https://serverless.cloud.tencent.com/deploy/express
3 秒极速部署,当即体验史上最快的 Serverless HTTP 实战开发!
传送门:
- GitHub: github.com/serverless
- 官网:serverless.com
欢迎访问:Serverless 中文网,您能够在 最佳实践 里体验更多关于 Serverless 应用的开发!