首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

不会写情诗?AI来助力!

大家好,前段时间给大家分享了一篇关于使用AI生成“周杰伦风格歌词”的文章,今天给大家带来如何使用AI生成古诗和藏头诗。代码还是是基于TensorFlow2.1和Python 3.6开发的,主要使用了RNN中的LSTM(长短时记忆网络)。有想生成各种诗的小伙伴可以留言哦。

AI生成的一些古诗

下图是一些随机生成的古诗,可以看出来已经有一些押韵了,但是在古诗的意境方面还是和古人写的诗有很大差距的。但是请注意,这只是用一部分古诗数据集生成的,而且训练得到的损失函数还未下降到最小,也就是说这个模型只是一个很粗糙的模型。

原理简单讲解

RNN是循环神经网络的英文缩写,而LSTM是长短时记忆网络的简称。关于这二者原理可以参见我之前的《使用AI生成周杰伦风格的歌词》一文,这里就不过多介绍了。

而要想对古诗进行,最大的困难在于如何将训练集的诗词让AI成功的识别和训练。文字的转码和上一文的歌词稍稍有些区别。最大的不同是古诗大部分是五言或是七律格式的,我们需要加入一些特殊的符号来代表起始和终止,以便使我们的网络能够正常的生成我们想要的古诗,具体参见下节,我们结合代码讲解。

古诗编码

包含古诗的原始TXT数据如下,每一行是一首诗,题目和内容用:隔开。

1.1首先,我们想训练的是诗的内容,因此诗的题目稍后会进行忽略。另外,这么大的数据集中会出现特殊的字符以及错误的使用中英文符号,有的标题还会有多个冒号等,所以在数据处理的时候我们需要对其进行过滤,只取出符合规范的来进行训练。

1.2 然后从过滤好的古诗列表里面取出几首看一下

1.3 接着我们对古诗的每个字进行分词,并打印出来出现频率最高的几个字看一下。

1.4 如何让计算机识别古诗呢?这里我们需要构建一个编码解码类,用来将古诗的字进行编码以及解码。编码的意思是每个字对应一个特殊的数字,神经网络的训练和识别都用数字来代替。

1.5 构建一个PoemDatSet类,该类的作用是方便的按指定批次随机抽取数据,因为我们的计算机显存有限,无法一次处理所有数据,所以我们采用随机梯度下降的方式来训练模型。

至此,我们的前序工作完成了,下面是核心的AI模型构建和训练。

构建循环神经网络模型

这里同于上一篇文章,我们采用TensorFlow内置的Keras自带的Sequential API直接构建出模型。这里的模型采用的包含2层LSTM层的循环神经网络。同时,别忘了定一些参数,批大小,编码器,数据集器等。

接下来配置模型参数,包括梯度下降器和损失函数。

训练代码和动态过程

下面开始训练模型,我们训练十轮并将模型保存为“model.h5”。

运行代码开始训练,可以看到损失函数值持续下降,说明我们模型构建的没问题。

到最后一轮时,Loss下降到了3.6左右,RNN不同于CNN,Loss一般很难下降到小数点后。

预测新的古诗

将我们之前的训练部分代码注释,然后从本地模型加载。并编写一个预测方法,这里主要是要从预测到的下一个字的概率分布前几名中取出一个,注意是随机取出,而不是总是使用概率最大的下一个字。这样可以使预测出来的古诗更加具有丰富性。

我们使用 清风明月 开头来预测古诗,预测结果如下

也可以随机生成古诗而不指定开头,具体代码如下:

生成的古诗如下:

预测藏头诗

首先定义一个预测藏头诗的方法如下。

生成上善若水藏头诗:

结果如下:

生成我爱中国 藏头诗:

结果如下:

怎么样,是不是很炫酷?想要生成藏头诗的小伙伴可以在评论处留言哦,编者闲暇时会帮忙生成古诗并回复。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200802A00J0000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券