GithubHelp home page GithubHelp logo

char-rnn-tf's Introduction

char-rnn-tf

本程序用于自动生成一段中文文本(训练语料是英文时也可用于生成英文文本),具体生成文本的内容和形式取决于训练语料。模型基本**和karpathy的char-rnn程序一致,利用循环神经网络(RNN)在大规模语料上训练一个language model,然后利用训练好的language model去自动生成一段文本。相比于theano版本的char-rnn模型,本模型采用了多层RNN而不是单层(tensorflow中实现一个多层RNN简直太方便了),同时还支持max、sample和beam-search多种生成策略。本程序代码参考了tensorflow官方给出的一个language model程序ptb_word_lm.py

模型结构如下图所示

model

运行说明

本代码是在Python 2 / TensorFlow 0.12版本下编写的,要在1.0版本下运行需要修改Model.py文件的三个地方:把所有的tf.nn.rnn_cell都改成tf.contrib.rnn,39行的tf.concat(1, outputs)改成tf.concat(outputs, 1),以及50行的tf.nn.seq2seq.sequence_loss_by_example改成tf.contrib.legacy_seq2seq.sequence_loss_by_example

模型参数设置(在Config.py文件中设置):

  • init_scale:参数使用均匀分布进行初始化,该值为均匀分布的上下界
  • learning_rate:学习率
  • max_grad_norm:对梯度进行规范化(gradient clipping)
  • num_layers:RNN的层级数目
  • num_steps:RNN展开的步骤数(每次训练多少个字符)
  • hidden_size:神经网络隐含层的维度
  • iteration:模型总共迭代次数
  • save_freq:每迭代多少次保存一次模型,同时进行一次生成
  • keep_prob:dropout的概率
  • batch_size:min-batch的大小
  • model_path:模型保存路径
  • 以下是generate过程需要设置的参数
  • save_time: 载入第save_time次保存的模型
  • is_sample:是否采用sample策略,设置为False是采用max策略
  • is_beams:是否采用beam-search进行解码,设置为False时不采用(相当于beam_size=1)
  • beam_size:beam-search的窗口大小
  • len_of_generation:期望生成文本的长度(包括多少个字)
  • start_sentence:期望生成文本的开始部分(可以是一个句子,一个词,也可以仅仅只是一个字)

模型训练过程

在命令行中输入:

python train.py [训练语料]

注意:训练语料为文本文件,请采用utf-8编码。

模型测试过程(文本生成过程)

在进行文本生成时,有两种策略:max和sample策略。本程序同时支持这两种策略,以及beam-search解码。(在此感谢 @fukuball对generate模型的扩展,使得generate.py程序能够以一个句子作为文本生成的开始)

在命令行中输入:

python generate.py

实验

训练语料为初高中优秀作文,语料规模为31.70MB,共包含11,264,367个字符,总共迭代次数为40次。

不同策略下的生成结果

第一个字我们选用“诚”,生成文本长度为100,在生成每个字时有两种策略(max和sample),同时在进行全局解码时可以采用beam-search或不采用,这样就有4种生成策略,以下是各种生成策略的结果:

策略1:max策略,不使用beam-search

诚信,不是一个人的生命,而是一种人生的价值。
我们的生活是一个美丽的梦,我们的梦想是我们的梦想,我们的梦想是我们的梦想,我们的梦想是我们的梦想,我们的梦想是我们的梦想,我们的梦想是我们的梦想,我们的梦

策略2:max策略,使用beam-search,beam_size=5

诚信。
一个人的生命是有限的,但是,我们每个人都有自己的价值。
我们的生活中,我们应该有一颗感恩的心,我们的人生才会更加美好,更加美好,更加美好。
人生就像一场旅行,我们每一个人都有一个属于自己的

策略3:sample策略,不使用beam-search

诚信,锲而不舍,坚韧反应,庸碌于世界世界面对。
正是最好的成功。每次想起自己的成绩来,自然不能解释可事。或许在自己考上好时还是的。无论哪是天,只要你收留这个目标呢!你就是来手,把人类分别,厚重地向他那

策略4:sample策略,使用beam-search,beam_size=2

诚然无私,那是因为我看到了另一个自己的悲伤,是因为他得到了世界上最真挚的情感。
生活是一张美丽的咖啡,温暖的人生,是最美丽的一页。
人生如梦,让我们追求不到的梦想。不管是人生中的挫折还是痛苦与痛苦,

实验结果分析:

策略1中采用max生成每个字,并且不使用beam-search进行全局解码,这种策略生成的结果很差的,随着句子长度的增加会出现重复的现象。而在策略2中,使用了beam-search进行全局解码后,结果有所提升,但局部文字仍有重复现象。策略3中,采用sample策略生成每个字,没有使用beam-search,由于sample引入了随机性,所以很好的解决文字重复出现的现象,但随机带来的弊端就是会出现局部语句不连贯的现象。策略4,相当于把max生成句子连贯和sample生成句子具有随机性两个优势进行了结合,即不会出现重复现象又能保证句子连贯。另外一方面,相比于max策略(策略1、2)中只要给定了开始字符生成的文本一定是固定的,策略4(以及策略3)具有一定的随机性,每次生成的文本都是不一样(增添生成文本的多样性),可以从生成的多个候选中选出一个最优的(有人的做法是再训练一个Ranking模型,对sample得到的多个候选进行排序,返回最好的结果或者top-n)。

char-rnn-tf's People

Contributors

fukuball avatar hit-computer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

char-rnn-tf's Issues

关于如何增量训练问题

你好!首先非常感谢你在百忙之中看我的issue,训练语料(中文)太大,无法一次性加载,我希望能够分批增量训练,就是在原来模型基础上再次使用新文章进行补充训练,需要怎么改好那?我多次尝试好像失败了。谢谢!

请问运行报错file = sys.argv[1] IndexError: list index out of range该如何解决?谢谢

2017-08-28 18:15:11,067 INFO - Traceback (most recent call last):
2017-08-28 18:15:11,067 INFO - File "train.py", line 14, in
2017-08-28 18:15:11,067 INFO - file = sys.argv[1]
2017-08-28 18:15:11,067 INFO - IndexError: list index out of range
这是我在floydhub上测试的结果
我尝试着修改了file的路径,但是不理想,不知道问题出在了哪里?
请问您有头绪么?
谢谢

ZeroDivisionError: integer division or modulo by zero 问题?

你好呀,我也在搞中文文本生成,不过刚刚才学习,资料太少了,好不容易才看见你的这个。

我想问下我运行程序的时候会出现下面的错误:
2017-07-01 22:39:07.199671: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:01:00.0)
WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.BasicLSTMCell object at 0x7ff6cc713350>: Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.
Training Epoch: 1 ...
Traceback (most recent call last):
File "train.py", line 98, in
tf.app.run()
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/platform/app.py", line 48, in run
_sys.exit(main(_sys.argv[:1] + flags_passthrough))
File "train.py", line 89, in main
train_perplexity = run_epoch(session, m, train_data, m.train_op)
File "train.py", line 66, in run_epoch
if step and step % (epoch_size // 10) == 0:
ZeroDivisionError: integer division or modulo by zero

这个是为什么呢?咋会出现这个错误啊?

新手提问

需要安装tensorflow?再运行这个程序?还是安装char-rnn?

关于 Python 版本以及 `tf.nn.seq2seq` 不存在报错的情况

将一些过程中的特殊情况列出来方便有类似问题的伙伴:

  • Python 版本应该是 Python2,如果用 Python3 需要修改源代码
  • 提示不存在 tf.nn.seq2seq 模块,把 tf.nn.seq2seq 改成 tf.contrib.legacy_seq2seq 即可
    • 看到有人说用前面的也可以运行,但我的提醒是不存在该模块,替换后可以运行
    • train.pygenerate.py 都需要更改
  • 语料不需要分词

关于run_echo()里的tf.no_op()

您好,请问为什么每次run_echo()的时候都要想graph里面塞一个no_op()的block呢?我没有太理解这个操作的理由。

我尝试将项目部署为在线服务,每次添加no_op()会导致graph越来越大,返回越来越慢。希望能解答,谢谢!

关于train里面有个地方感觉有点奇怪

raw_data = np.array(raw_data, dtype=np.int32)

data_len = len(raw_data)
batch_len = data_len // batch_size #batch_len=总batch数
data = np.zeros([batch_size, batch_len], dtype=np.int32) #整个数据拆分成一个batch_size*batch_len的二维矩阵
for i in range(batch_size):
    data[i] = raw_data[batch_len * i:batch_len * (i + 1)]#data的shape是(batch_size, batch_len),每一行是连贯的一段,一次可输入多个段
			#这里看不是很明白 data[i]是走batch_size也就是从batch的0位走向末位,比如i=0的时候,data[0]=源数据中的根据batch_len取一行放入,这个看不是很明白

感觉这里不是应该是batch方向连续的吗?为什么是batchlen方向连续呢??

Training Epoch问题

我输入命令是:python train.py all.txt(all.txt数据大小是50.7MB)
现在输出的结果是:
。。。。。。。
Using a concatenated state is slower and will soon be deprecated. Use state_is_tuple=True.
Training Epoch: 1 ...

一直显示在Training Epoch :1....
是显示在训练过程么?
还要很久么?
请教一下 谢谢!

Seed 是否可以傳一段中文字串

您好,我訓練完成後,可以使用單個字作為 seed,但不知如何傳一段中文字串作為 seed,希望可以指點一下迷津,謝謝~

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.