大家好,前段时间给大家分享了一篇关于使用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一般很难下降到小数点后。
预测新的古诗
将我们之前的训练部分代码注释,然后从本地模型加载。并编写一个预测方法,这里主要是要从预测到的下一个字的概率分布前几名中取出一个,注意是随机取出,而不是总是使用概率最大的下一个字。这样可以使预测出来的古诗更加具有丰富性。
我们使用 清风明月 开头来预测古诗,预测结果如下
也可以随机生成古诗而不指定开头,具体代码如下:
生成的古诗如下:
预测藏头诗
首先定义一个预测藏头诗的方法如下。
生成上善若水藏头诗:
结果如下:
生成我爱中国 藏头诗:
结果如下:
怎么样,是不是很炫酷?想要生成藏头诗的小伙伴可以在评论处留言哦,编者闲暇时会帮忙生成古诗并回复。
领取专属 10元无门槛券
私享最新 技术干货