往期RNN相关工程实践文章

『TensotFlow』基础RNN网络分类问题

『TensotFlow』RNN中文文本_上

『TensotFlow』基础RNN网络回归问题

『TensotFlow』RNN中文文本_下_暨研究生开学感想

张量分析

预处理结果是二维数据,相当于batch条一维数据,每个数据对应一首诗,每个字是一个scalar;

embedding之后,将每个字映射为一个rnn_size大小的向量,数据变为三维;

经过递归神经网络,输出维度不变;

将之调整为二维数据,这里面第二维度(即每一行)对应一个字;

全连接映射,将每一个字由rnnsize的向量映射为一个长度为总字数的向量,这样方便计算loss,实际计算loss时,会将label(二维向量,一行一首诗,字为scalar)拉伸为一维向量,每行只有一个字scalar,one_hot之后和此时数据正好对应,方便计算

SoftMax不改变张量形状,只是将结果以概率分布的形式输出

工程分析

代码见Github

1、文件简介

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也可以。

『TensotFlow』RNN/LSTM古诗生成的更多相关文章

  1. 『TensotFlow』RNN中文文本_下_暨研究生开学感想

    承前 接上节代码『TensotFlow』RNN中文文本_上, import numpy as np import tensorflow as tf from collections import Co ...

  2. 『TensotFlow』RNN中文文本_上

    中文文字预处理流程 文本处理 读取+去除特殊符号 按照字段长度排序 辅助数据结构生成 生成 {字符:出现次数} 字典 生成按出现次数排序好的字符list 生成 {字符:序号} 字典 生成序号list ...

  3. 『计算机视觉』Mask-RCNN_锚框生成

    Github地址:Mask_RCNN 『计算机视觉』Mask-RCNN_论文学习 『计算机视觉』Mask-RCNN_项目文档翻译 『计算机视觉』Mask-RCNN_推断网络其一:总览 『计算机视觉』M ...

  4. 『cs231n』RNN之理解LSTM网络

    概述 LSTM是RNN的增强版,1.RNN能完成的工作LSTM也都能胜任且有更好的效果:2.LSTM解决了RNN梯度消失或爆炸的问题,进而可以具有比RNN更为长时的记忆能力.LSTM网络比较复杂,而恰 ...

  5. 『TensotFlow』转置卷积

    网上解释 作者:张萌链接:https://www.zhihu.com/question/43609045/answer/120266511来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  6. 『计算机视觉』Mask-RCNN_推断网络其三:RPN锚框处理和Proposal生成

    一.RPN锚框信息生成 上文的最后,我们生成了用于计算锚框信息的特征(源代码在inference模式中不进行锚框生成,而是外部生成好feed进网络,training模式下在向前传播时直接生成锚框,不过 ...

  7. 『PyTorch』第十弹_循环神经网络

    RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...

  8. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  9. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

随机推荐

  1. Javassist

    Javassist 实现动态代理 javassist 是一款非常优秀的Java 字节码引擎工具,能够在运行时编译.生成Java Class.

  2. 打造高可靠与高性能的React同构解决方案

    前言 随着React的兴起, 结合Node直出的性能优势和React的组件化,React同构已然成为趋势之一.享受技术福利的同时,直面技术挑战,在复杂场景下,挑战10倍以上极致的性能优化. 什么是同构 ...

  3. DNS服务器原理介绍(一)

    DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终 ...

  4. Android java 多线程(三)

  5. 微信小程序——2、配置json文件

    配置文件详解 主配置文件app.json 主配置文件位于主目录中,用于进行全局配置.包括页面文件的路径.窗口表现.设置网络超时时间.设置多tab等 下面通过微信最初自带小程序来学习 { "p ...

  6. Vue 动态图片加载路径问题和解决方法

    最近在做一个树形结构的组件,使用了Vue和element UI中el-tree组件.因为树中每个节点都需要显示一个图标图片,并且需要根据后台传入的数据类型动态地显示,所以图片的路径需要动态地加载.下面 ...

  7. C#工程详解

    转:https://www.cnblogs.com/zhaoqingqing/p/5468072.html 前言 写这篇文章的目地是为了让更多的小伙伴对VS生成的工程有一个清晰的认识.在开发过程中,为 ...

  8. cmd解释

    cmd是command的缩写.即命令提示符(CMD),是在OS / 2 , Windows CE与Windows NT平台为基础的操作系统(包括Windows 2000和XP中, Vista中,和Se ...

  9. JS高级语法与JS选择器

    元素(element)和节点(node) childNode属性和children属性的区别 <!DOCTYPE html> <html lang="en"> ...

  10. P3066 [USACO12DEC]逃跑的BarnRunning Away From

    目录 题目 思路 错误&&注意 代码 题目 luoguP3066 思路 虽说这个题目有多种做法,但 左偏树算法: 我们发现这个合并的时候并不好合并,因为存的值不是固定的 那我们是不是可 ...