zf:tf7: RNN—古诗词
代码:
https://download.csdn.net/download/richgene/10413943
训练数据:
https://download.csdn.net/download/richgene/10466872
RNN不像传统的神经网络-它们的输出输出是固定的,而RNN允许我们输入输出向量序列。RNN是为了对序列数据进行建模而产生的。
样本序列性:样本间存在顺序关系,每个样本和它之前的样本存在关联。比如说,在文本中,一个词和它前面的词是有关联的;在气象数据中,一天的气温和前几天的气温是有关联的。
例如本帖要使用RNN生成古诗,你给它输入一堆古诗词,它会学着生成和前面相关联的字词。如果你给它输入一堆姓名,它会学着生成姓名;给它输入一堆古典乐/歌词,它会学着生成古典乐/歌词,甚至可以给它输入源代码。
关于RNN:
- http://karpathy.github.io/2015/05/21/rnn-effectiveness/
本帖代码移植自char-rnn,它是基于Torch的洋文模型,稍加修改即可应用于中文。char-rnn使用文本文件做为输入、训练RNN模型,然后使用它生成和训练数据类似的文本。
使用的数据集:全唐诗(43030首):https://download.csdn.net/download/richgene/10466872
训练:
- importcollections
- importnumpy as np
- importtensorflow as tf
- #-------------------------------数据预处理---------------------------#
- poetry_file ='poetry.txt'
- # 诗集
- poetrys = []
- with open(poetry_file, "r", encoding='utf-8',) as f:
- forlineinf:
- try:
- title, content = line.strip().split(':')
- content = content.replace(' ','')
- if'_'incontentor'('incontentor'('incontentor'《'incontentor'['incontent:
- continue
- iflen(content) <5orlen(content) >79:
- continue
- content = '['+ content +']'
- poetrys.append(content)
- exceptException as e:
- pass
- # 按诗的字数排序
- poetrys = sorted(poetrys,key=lambdaline: len(line))
- print('唐诗总数: ', len(poetrys))
- # 统计每个字出现次数
- all_words = []
- forpoetryinpoetrys:
- all_words += [word forwordinpoetry]
- counter = collections.Counter(all_words)
- count_pairs = sorted(counter.items(), key=lambdax: -x[1])
- words, _ = zip(*count_pairs)
- # 取前多少个常用字
- words = words[:len(words)] + (' ',)
- # 每个字映射为一个数字ID
- word_num_map = dict(zip(words, range(len(words))))
- # 把诗转换为向量形式,参考TensorFlow练习1
- to_num = lambdaword: word_num_map.get(word, len(words))
- poetrys_vector = [ list(map(to_num, poetry)) forpoetryinpoetrys]
- #[[314, 3199, 367, 1556, 26, 179, 680, 0, 3199, 41, 506, 40, 151, 4, 98, 1],
- #[339, 3, 133, 31, 302, 653, 512, 0, 37, 148, 294, 25, 54, 833, 3, 1, 965, 1315, 377, 1700, 562, 21, 37, 0, 2, 1253, 21, 36, 264, 877, 809, 1]
- #....]
- # 每次取64首诗进行训练
- batch_size = 64
- n_chunk = len(poetrys_vector) // batch_size
- x_batches = []
- y_batches = []
- foriinrange(n_chunk):
- start_index = i * batch_size
- end_index = start_index + batch_size
- batches = poetrys_vector[start_index:end_index]
- length = max(map(len,batches))
- xdata = np.full((batch_size,length), word_num_map[' '], np.int32)
- forrowinrange(batch_size):
- xdata[row,:len(batches[row])] = batches[row]
- ydata = np.copy(xdata)
- ydata[:,:-1] = xdata[:,1:]
- """
- xdata ydata
- [6,2,4,6,9] [2,4,6,9,9]
- [1,4,2,8,5] [4,2,8,5,5]
- """
- x_batches.append(xdata)
- y_batches.append(ydata)
- #---------------------------------------RNN--------------------------------------#
- input_data = tf.placeholder(tf.int32, [batch_size, None])
- output_targets = tf.placeholder(tf.int32, [batch_size, None])
- # 定义RNN
- defneural_network(model='lstm', rnn_size=128, num_layers=2):
- ifmodel =='rnn':
- cell_fun = tf.nn.rnn_cell.BasicRNNCell
- elifmodel =='gru':
- cell_fun = tf.nn.rnn_cell.GRUCell
- elifmodel =='lstm':
- cell_fun = tf.nn.rnn_cell.BasicLSTMCell
- cell = cell_fun(rnn_size, state_is_tuple=True)
- cell = tf.nn.rnn_cell.MultiRNNCell([cell] * num_layers, state_is_tuple=True)
- initial_state = cell.zero_state(batch_size, tf.float32)
- with tf.variable_scope('rnnlm'):
- softmax_w = tf.get_variable("softmax_w", [rnn_size, len(words)+1])
- softmax_b = tf.get_variable("softmax_b", [len(words)+1])
- with tf.device("/cpu:0"):
- embedding = tf.get_variable("embedding", [len(words)+1, rnn_size])
- inputs = tf.nn.embedding_lookup(embedding, input_data)
- outputs, last_state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state, scope='rnnlm')
- output = tf.reshape(outputs,[-1, rnn_size])
- logits = tf.matmul(output, softmax_w) + softmax_b
- probs = tf.nn.softmax(logits)
- returnlogits, last_state, probs, cell, initial_state
- #训练
- deftrain_neural_network():
- logits, last_state, _, _, _ = neural_network()
- targets = tf.reshape(output_targets, [-1])
- loss = tf.nn.seq2seq.sequence_loss_by_example([logits], [targets], [tf.ones_like(targets, dtype=tf.float32)], len(words))
- cost = tf.reduce_mean(loss)
- learning_rate = tf.Variable(0.0, trainable=False)
- tvars = tf.trainable_variables()
- grads, _ = tf.clip_by_global_norm(tf.gradients(cost, tvars), 5)
- optimizer = tf.train.AdamOptimizer(learning_rate)
- train_op = optimizer.apply_gradients(zip(grads, tvars))
- with tf.Session() as sess:
- sess.run(tf.initialize_all_variables())
- saver = tf.train.Saver(tf.all_variables())
- forepochinrange(50):
- sess.run(tf.assign(learning_rate, 0.002* (0.97** epoch)))
- n = 0
- forbatcheinrange(n_chunk):
- train_loss, _ , _ = sess.run([cost, last_state, train_op], feed_dict={input_data: x_batches[n], output_targets: y_batches[n]})
- n += 1
- print(epoch, batche, train_loss)
- ifepoch %7==0:
- saver.save(sess, 'poetry.module', global_step=epoch)
- train_neural_network()
使用训练好的模型生成古诗:
- importcollections
- importnumpy as np
- importtensorflow as tf
- #-------------------------------数据预处理---------------------------#
- poetry_file ='poetry.txt'
- # 诗集
- poetrys = []
- with open(poetry_file, "r", encoding='utf-8',) as f:
- forlineinf:
- try:
- title, content = line.strip().split(':')
- content = content.replace(' ','')
- if'_'incontentor'('incontentor'('incontentor'《'incontentor'['incontent:
- continue
- iflen(content) <5orlen(content) >79:
- continue
- content = '['+ content +']'
- poetrys.append(content)
- exceptException as e:
- pass
- # 按诗的字数排序
- poetrys = sorted(poetrys,key=lambdaline: len(line))
- print('唐诗总数: ', len(poetrys))
- # 统计每个字出现次数
- all_words = []
- forpoetryinpoetrys:
- all_words += [word forwordinpoetry]
- counter = collections.Counter(all_words)
- count_pairs = sorted(counter.items(), key=lambdax: -x[1])
- words, _ = zip(*count_pairs)
- # 取前多少个常用字
- words = words[:len(words)] + (' ',)
- # 每个字映射为一个数字ID
- word_num_map = dict(zip(words, range(len(words))))
- # 把诗转换为向量形式,参考TensorFlow练习1
- to_num = lambdaword: word_num_map.get(word, len(words))
- poetrys_vector = [ list(map(to_num, poetry)) forpoetryinpoetrys]
- #[[314, 3199, 367, 1556, 26, 179, 680, 0, 3199, 41, 506, 40, 151, 4, 98, 1],
- #[339, 3, 133, 31, 302, 653, 512, 0, 37, 148, 294, 25, 54, 833, 3, 1, 965, 1315, 377, 1700, 562, 21, 37, 0, 2, 1253, 21, 36, 264, 877, 809, 1]
- #....]
- batch_size = 1
- n_chunk = len(poetrys_vector) // batch_size
- x_batches = []
- y_batches = []
- foriinrange(n_chunk):
- start_index = i * batch_size
- end_index = start_index + batch_size
- batches = poetrys_vector[start_index:end_index]
- length = max(map(len,batches))
- xdata = np.full((batch_size,length), word_num_map[' '], np.int32)
- forrowinrange(batch_size):
- xdata[row,:len(batches[row])] = batches[row]
- ydata = np.copy(xdata)
- ydata[:,:-1] = xdata[:,1:]
- """
- xdata ydata
- [6,2,4,6,9] [2,4,6,9,9]
- [1,4,2,8,5] [4,2,8,5,5]
- """
- x_batches.append(xdata)
- y_batches.append(ydata)
- #---------------------------------------RNN--------------------------------------#
- input_data = tf.placeholder(tf.int32, [batch_size, None])
- output_targets = tf.placeholder(tf.int32, [batch_size, None])
- # 定义RNN
- defneural_network(model='lstm', rnn_size=128, num_layers=2):
- ifmodel =='rnn':
- cell_fun = tf.nn.rnn_cell.BasicRNNCell
- elifmodel =='gru':
- cell_fun = tf.nn.rnn_cell.GRUCell
- elifmodel =='lstm':
- cell_fun = tf.nn.rnn_cell.BasicLSTMCell
- cell = cell_fun(rnn_size, state_is_tuple=True)
- cell = tf.nn.rnn_cell.MultiRNNCell([cell] * num_layers, state_is_tuple=True)
- initial_state = cell.zero_state(batch_size, tf.float32)
- with tf.variable_scope('rnnlm'):
- softmax_w = tf.get_variable("softmax_w", [rnn_size, len(words)+1])
- softmax_b = tf.get_variable("softmax_b", [len(words)+1])
- with tf.device("/cpu:0"):
- embedding = tf.get_variable("embedding", [len(words)+1, rnn_size])
- inputs = tf.nn.embedding_lookup(embedding, input_data)
- outputs, last_state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state, scope='rnnlm')
- output = tf.reshape(outputs,[-1, rnn_size])
- logits = tf.matmul(output, softmax_w) + softmax_b
- probs = tf.nn.softmax(logits)
- returnlogits, last_state, probs, cell, initial_state
- #-------------------------------生成古诗---------------------------------#
- # 使用训练完成的模型
- defgen_poetry():
- defto_word(weights):
- t = np.cumsum(weights)
- s = np.sum(weights)
- sample = int(np.searchsorted(t, np.random.rand(1)*s))
- returnwords[sample]
- _, last_state, probs, cell, initial_state = neural_network()
- with tf.Session() as sess:
- sess.run(tf.initialize_all_variables())
- saver = tf.train.Saver(tf.all_variables())
- saver.restore(sess, 'poetry.module-49')
- state_ = sess.run(cell.zero_state(1, tf.float32))
- x = np.array([list(map(word_num_map.get, '['))])
- [probs_, state_] = sess.run([probs, last_state], feed_dict={input_data: x, initial_state: state_})
- word = to_word(probs_)
- #word = words[np.argmax(probs_)]
- poem = ''
- whileword !=']':
- poem += word
- x = np.zeros((1,1))
- x[0,0] = word_num_map[word]
- [probs_, state_] = sess.run([probs, last_state], feed_dict={input_data: x, initial_state: state_})
- word = to_word(probs_)
- #word = words[np.argmax(probs_)]
- returnpoem
- print(gen_poetry())
生成的“诗词”(至少格式对上了):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
新犬随风起,一璃迹阵悲。
浅昏罢庄哉,清插去园空。
双叶坐成鉴,王妓水正苑。
鸟声不成影,胙滩朱瓮声。
无斑红芜踏,那期日正闲。
吾燕登无士,无处得赵名。
并灭图微蒿,淮头水十荔。
晴花尚乘望,官宽留可求。
最忆青州守,英仍临阳峰。
生人隔天道,在国思山田。
登临闭石土,阵下一欢娱。
林暝今又少,孙频唯在愁。
|
生成藏头诗:
- defgen_poetry_with_head(head):
- defto_word(weights):
- t = np.cumsum(weights)
- s = np.sum(weights)
- sample = int(np.searchsorted(t, np.random.rand(1)*s))
- returnwords[sample]
- _, last_state, probs, cell, initial_state = neural_network()
- with tf.Session() as sess:
- sess.run(tf.initialize_all_variables())
- saver = tf.train.Saver(tf.all_variables())
- saver.restore(sess, 'poetry.module-49')
- state_ = sess.run(cell.zero_state(1, tf.float32))
- poem = ''
- i = 0
- forwordinhead:
- whileword !=','andword !='。':
- poem += word
- x = np.array([list(map(word_num_map.get, word))])
- [probs_, state_] = sess.run([probs, last_state], feed_dict={input_data: x, initial_state: state_})
- word = to_word(probs_)
- time.sleep(1)
- ifi %2==0:
- poem += ','
- else:
- poem += '。'
- i += 1
- returnpoem
- print(gen_poetry_with_head('一二三四'))
上面使用的TensroFlow版本为0.11,0.12版本貌似不能直接运行,简单修改如下代码:
读取模型的方法:
- module_file = tf.train.latest_checkpoint('.')
- #print(module_file)
- saver.restore(sess, module_file)
tf.initialize_all_variables() deprecated,使用tf.global_variables_initializer()替代。
zf:tf7: RNN—古诗词相关推荐
- MachineLN博客目录
MachineLN博客目录 https://blog.csdn.net/u014365862/article/details/78422372 本文为博主原创文章,未经博主允许不得转载.有问题可以加微 ...
- 基于Skip-Thought的Sentence2Vec神经网络实现
一.前言 1.Skip-Thought-Vector论文 2.本文假设读者已了解Skip-Gram-Vector和RNN相关基础,以下文章可做参考: (1)RNN古诗词生成 (2)Skip-Gram- ...
- TensorFlow练习7: 基于RNN生成古诗词
RNN不像传统的神经网络-它们的输出输出是固定的,而RNN允许我们输入输出向量序列.RNN是为了对序列数据进行建模而产生的. 样本序列性:样本间存在顺序关系,每个样本和它之前的样本存在关联.比如说,在 ...
- 基于RNN的中文古诗词生成神经网络实现
一.前言 1.图解RNN 2.Tensorflow中RNN实现的正确打开方式 二.实战 1.训练数据处理 (1)文字转为向量 def _get_poetry(self):with open(self. ...
- 基于RNN实现古诗词生成模型
我们知道,RNN(循环神经网络)模型是基于当前的状态和当前的输入来对下一时刻做出预判.而LSTM(长短时记忆网络)模型则可以记忆距离当前位置较远的上下文信息. 在此,我们根据上述预判模型来进行 古诗词 ...
- java rnn生成古诗_Tensorflow 基于RNN生成古诗词 自己的实践
在网上看到一篇利用Tensorflow+RNN模型生成古诗词的练习,觉得挺有意思的便自己来试了下,算是熟悉下Tensorflow+NLP的基本操作流程 首先pip 安装NLTK 在你的Tensorfl ...
- 机器学习笔记4 古诗词自动生成 RNN with Keras
这是一个RNN的典型应用,也是RNN最能解决的一个应用场景. 我们这里以中国古诗为例,我们将要构造一个RNN 模型,并用它来自动生成古诗. 准备工作: 我们拿到的是一个txt文件,里面包含了一些古诗. ...
- TensorFlow2学习:RNN生成古诗词
本文转自 AI科技大本营 TensorFlow2学习:RNN生成古诗词 文章不见了可以参考这位博主的文章 公众号的文章写得挺好的,这里简单介绍下思路及值得学习的地方 模型简介 模型不算多么复杂高大上, ...
- python输出古诗词_TensorFlow:基于RNN生成古诗词
时间:2017-07-26 发布人:SHX 浏览次数:3806 评论:0 实例来源于网络,但是以前的代码都是基于TensorFlow1.0以前的版本写的,实际运行时会报错,对于小白来说是一头雾水.这里 ...
- 记忆网络RNN、LSTM与GRU
RNN 结构 训练 应用 RNN Variants LSTM 结构 梯度消失及梯度爆炸 GRU 结构 一般的神经网络输入和输出的维度大小都是固定的,针对序列类型(尤其是变长的序列)的输入或输出数据束手 ...
最新文章
- PHP中的SESSION
- java例程练习(批量修改文件后缀名)
- java实现第三方网页获取微信用户授权后的微信用户基本信息
- springboot启动时An attempt was made to call a method that does not exist
- 设计模式:桥接模式(Bridge Pattern)
- iOS 11 下 UICollectionView 出现滚动条被 HeaderView 遮挡的问题
- python【第三篇】迭代器、生成器、闭包
- ethtool工具设置网口配置
- 【结课报告】游戏中的知识产权
- 黑苹果 hackintosh 声卡驱动
- 手机端链接拼多多的商品主图和视频抓取方法
- itextpdf生成列表基本用法
- WorldFirst澳元收款账户上线,人民币提现当天到账!
- Appium H5自动化测试
- python大数相乘
- k线图基础知识图解——单根K线的含义
- NodeJs模块化(KPD)
- 圆柱模板行业B2B站点打造MIP推送+熊掌号推送+历史普通推送插件
- 山楂整形修剪的技术方法
- html2canvas生成PDF并下载的解决方案