您的位置:首页
『TensotFlow』RNN/LSTM古诗生成
2017-10-22 15:37
190 查看
往期RNN相关工程实践文章
『TensotFlow』基础RNN网络分类问题『TensotFlow』RNN中文文本_上
『TensotFlow』基础RNN网络回归问题
『TensotFlow』RNN中文文本_下_暨研究生开学感想
张量分析
预处理结果是二维数据,相当于batch条一维数据,每个数据对应一首诗,每个字是一个scalar;
embedding之后,将每个字映射为一个rnn_size大小的向量,数据变为三维;
经过递归神经网络,输出维度不变;
将之调整为二维数据,这里面第二维度(即每一行)对应一个字;
全连接映射,将每一个字由rnnsize的向量映射为一个长度为总字数的向量,这样方便计算loss,实际计算loss时,会将label(二维向量,一行一首诗,字为scalar)拉伸为一维向量,每行只有一个字scalar,one_hot之后和此时数据正好对应,方便计算
SoftMax不改变张量形状,只是将结果以概率分布的形式输出
工程分析
代码见Github1、文件简介
LSTM_model.py:LSTM网络模型,提供了end_points接口,被其他部分调用
poetry_porcess.py:数据读取、预处理部分,会返回打包好的batch,被main调用
gen_poetry.py:古诗生成程序,拥有可选的风格参数,被main调用
main.py:主函数,既可以调用前两个程序获取预处理数据并使用LSTM网络进行训练,也可以调用gen_poetry.py生成古诗
2、调用指令
在main.py最后有如下指令,
if __name__ == "__main__": words,poetry_vector,to_num,x_batches,y_batches = poetry_porcess.poetry_process() # train(words, poetry_vector, x_batches, y_batches) # gen_poetry(words, to_num) generate(words_, to_num_, style_words="狂沙将军战燕然,大漠孤烟黄河骑。")
此时实际上处于生成模式,对于最后的三行, train:表示训练 gen_poetry:表示根据首字符生成 generate:表示根据首句和风格句生成古诗
训练时注释掉后两行,保留train行,
if __name__ == "__main__": words,poetry_vector,to_num,x_batches,y_batches = poetry_porcess.poetry_process() train(words, poetry_vector, x_batches, y_batches) # gen_poetry(words, to_num) # generate(words_, to_num_, style_words="狂沙将军战燕然,大漠孤烟黄河骑。")
生成时不需要修改,但是
generate(words_, to_num_, style_words="狂沙将军战燕然,大漠孤烟黄河骑。")
可以替换style_word为任何你想要的风格句,注意最好使用7言或者5言,因为这句会大概率影响到你生成的古诗的句子长度(不绝对),这只是风格提取,你可以输入任意长度;在运行了脚本后,屏幕会提示输入起始句,输入的句子一般5或者7个字,这个由于会拿来直接做首句(由结果示范可以看到),输入长度不宜过长。
对于上面的两种情况,修改完成后运行脚本即可,
python main.py
即可显示结果
3、结果示范
head:床前明月光 + style:黄沙百战金甲: 床前明月光辉,魏武征夫血絮红。 数步崩云复遗主,缟衣东,帝京举,玉轮还满出书初。 秋秋惨惨垂杨柳,梦断黄莺欲断肠。 花凋柳映阮家几,屋前病,歇马空留门。 当年皆月林,独往深山有素。 head:少小离家老大回 + style:山雨欲来风满楼: 少小离家老大回,四壁百月弄鸦飞。 扫香花间春风地,隔天倾似烂桃香。 近来谁伴清明日,两株愁味在罗帏。 仍通西疾空何处,轧轧凉吹日方明。 head:少小离家老大回 + style:铁马冰河入梦来: 少小离家老大回,化空千里便成丝。 官抛十里同牛颔,莫碍风光雪片云。 饮水远涛飞汉地,云连城户翠微低。 一树铁门万象耸,白云三尺各关高。 同言东甸西游子,谁道承阳要旧忧。 少小离家老大回,含颦玉烛拂楼台。 初齐去府芙蓉死,细缓行云向国天
RNN结构补充
原网络结构如下,实际上不需要像下面这样写了,不过当时费了好大事,所以保留一下原来版本的代码,with tf.variable_scope('placeholder'): input_vec = tf.placeholder(tf.int32,[None,None]) output_targets = tf.placeholder(tf.int32,[None,None]) def rnn_network(rnn_size=128,num_layers=2): def lstm_cell(): l_cell = tf.contrib.rnn.BasicLSTMCell(rnn_size,state_is_tuple=True,reuse=tf.get_variable_scope().reuse) return l_cell cell = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(num_layers)]) initial_state = cell.zero_state(batch_size, tf.float32) # 初始化LSTM网络节点,参数为尺寸 with tf.variable_scope('LSTM'): with tf.variable_scope('embedding'): E = tf.get_variable('embedding',[len(words_list) + 1,rnn_size]) input_embedding = tf.nn.embedding_lookup(E,input_vec) output_embedding, last_state = tf.nn.dynamic_rnn(cell, input_embedding, initial_state=initial_state,scope='lstm') output = tf.reshape(output_embedding,[-1,rnn_size]) with tf.variable_scope('output'): W = tf.get_variable('W', [rnn_size,len(words_list)+1]) b = tf.get_variable('b', [len(words_list)+1]) logits = tf.matmul(output,W) + b probs = tf.nn.softmax(logits) return logits, last_state, probs, cell, initial_state
另外,直接使用tf.nn.rnn_cell而不是用tf.contrib.rnn也可以。
相关文章推荐
- 【备忘】深度学习实战项目-利用RNN与LSTM网络原理进行唐诗生成视频课程
- 利用RNN(lstm)生成文本【转】
- 第六章(1.5)深度学习实战——利用RNN和LSTM生成小说题记
- Tensorflow:基于LSTM轻松生成各种古诗
- tensorflow73 使用RNN生成古诗和藏头诗
- 第十二课 tensorflow 使用RNN实现古诗自动生成
- RNN及LSTM的简单理解
- 人人都能用Python写出LSTM-RNN的代码![你的神经网络学习最佳起步]
- 深度学习BP算法的推导(附加RNN,LSTM的推导说明)
- 实习点滴(9)--LSTM是如何解决RNN中的“梯度消失”
- [代码]基于RNN的文本生成算法
- RNN 之LSTM简介
- tensorflow 学习笔记13 RNN LSTM结构预测正弦(sin)函数
- RNN(LSTM)
- 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型
- LSTM入门学习——本质上就是比RNN的隐藏层公式稍微复杂了一点点而已
- RNN和LSTM
- 目前看到的最好的RNN、LSTM、GRU博客:Understanding LSTM Networks(翻译)
- Tensorflow: RNN/LSTM gradient clipping
- 所有人都能学会用Python写出RNN-LSTM代码