实验背景
周末,早晨下了点小雨,淅淅沥沥,来到阳台坐了一会,看着雨有点发呆,真惬意,真想雨一直这么下着。
下午雨就停了,太阳紧跟其后,普照万物。好吧,回到现实吧。
回到正题,人工智能(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。 内在的原理是利用网络来学习训练诗歌中字符出现的概率模型。
领取专属 10元无门槛券
私享最新 技术干货