python:为你写诗

实验背景

周末,早晨下了点小雨,淅淅沥沥,来到阳台坐了一会,看着雨有点发呆,真惬意,真想雨一直这么下着。

下午雨就停了,太阳紧跟其后,普照万物。好吧,回到现实吧。

回到正题,人工智能(AI)技术在各应用领域可以说是遍地开发,应用至上。最近看到用神经网络来写诗,今天和大家一起撸一撸,动手实验下。

实验器材

●python

● LSTM

● tensorflow

● 唐诗

实验内容

数据获取

深度学习技术能发挥其作用,最重要的是数据。没有数据再好的算法也没用。本实验要生成诗歌,训练样本为唐诗文本。总共4.3万首。

首春

寒随穷律变,春逐鸟声开。

初风飘带柳,晚雪间花梅。

碧林青旧竹,绿沼翠新苔。

芝田初雁去,绮树巧莺来。

简单原理说明

自动生成文本可以理解成一个文字接着一个文字,不断连接的一个序列。针对序列数据,循环神经网络RNN是一个有效的建模方法。本实验采用LSTM(长短记忆网络)。

传统的RNN模型主要用连接先前的信息到当前的任务上,如下:

LSTM很好的解决了RNN的长期信息依赖的学习问题。通过forget gate丢弃本单元不需要的信息, 同时根据update gate 结合当前序列输入更新加入信息。然后将更新后的信息和当前信息相结合为输出信息。主要通过sigmoid和tanh来操作。

详细信息可以访问:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

生成诗歌

1.数据处理

数据中为一行为一首诗,即为一个样本。

统计每个字出现次数,对字进行编码(按照词频大小)

关于输入x序列和输出y序列:y为x向前移动一个字。如

生成batch的数据迭代器,64首诗为一个batch

2.构建lstm网络

本实验采用单向的LSTM进行训练。

构建输入

这里输入有点特殊,就是增加一个embedding层对输入字符id进行词向量表示:word2vec,来代替ont_hot。

embedding通常可以采用预训练的参数,或者放在网络过程进行自己训练,本是采用第二种,自己训练。

构建LSTM

本实验采用tensorflow实现的LSTM模块。

一个LSTM模块:

one_cell = tf.contrib.rnn.BasicLSTMCell(self.rnn_size)//128个神经元

通常一个LSTM需要包含多层的LSTM cell,即同一个输入x和输出(c和h)之间包含多个LSTM模块,前一个cell的输出为后一个cell的输入。如下:

multi_cell = tf.contrib.rnn.MultiRNNCell( [one_cell] * self.num_layers, state_is_tuple=True)

整个网络结构:

self.initial_state = multi_cell.zero_state(self.batch_size, tf.float32)

outputs, self.last_state = tf.nn.dynamic_rnn(multi_cell, self.inputs, initial_state=self.initial_state)

构建softmax层和损失函数和优化器,采用Adam

训练过程

本实验训练20000个epoch,损失基本上就收敛了。

3.生成诗歌

利用已经训练好的模型,因为是输入是序列。 指定第一字为输入,利用模型输出第二个字,接着将第二个字为输入,利用模型输出第三个字,依此类推,指导输出终止符为止。 一首诗就完成了。

这里模型的输出为softmax的概率,使用argmax取最大的概率就是预测的字符ID,再转换成字符。

我们来欣赏下本实验生成的古代诗歌吧。

芳柳花香翅,花泉暗里船

宫残风落雾,红粉剧参差

翠蜡鸡声动,馨香烧巢袪

帷花侵乳落,唱警蜃芳来

晓净阴窗峻,秦宫槿藓平

应羡棋真栖,无将复难那

秋雨西西路,岧荧在玉清

哀堪进界缨,紫皓安须争

举病难倾礼,习来未在禅

楂舟雪上清,款检在虾瞳

明日八十贵,传来已学禅

清鸿问秦水,楚国高陀枝

送昔晡心惑,全高何一秋

心闲忙操命,雨复度花传

暗尽霜光罩,新闲与马分

仙城衰日远,窗栝初有风

唯更临水上,提得亦延鼎

无时西浦上,七尺与行踪

实验结语

本实验『WedO实验君』和大家用循环神经网络来实现一个自动生成诗歌的小应用,参考CharRNN。 内在的原理是利用网络来学习训练诗歌中字符出现的概率模型。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181126G07KQZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券