tensorflow - RNN学习文章的风格去仿写

1 . 能干什么

在知乎,博客上面会看到有人分享自己的一些有意思的项目,比如下面这些,用rnn学习一个诗歌,散文,党章,小说什么的。然后,在自己生成一些东西。比如,下面的这两个例子。作为一个初学者,自己也想搭一个模型,然后试着玩一玩。

image.png
image.png

关于RNN的模型结构的基本原理,公式推导什么的,就先不在这里展开了。下面写得是,如何用tensorflow去实现这个模型。

2. 使用tensorflow 搭建这个RNN的模型去实现
  1. 读文件,将文件里面的句子分割成词,然后变成一个list。
## 预处理数据
def read_file():
    # Text file containing words for training
    training_file = 'belling_the_cat.txt'
    content=[]
    with open(training_file,'r') as f:
        for line in f.readlines():
            # line 表示读到数据的每一行,linelist是按照空格切分成一个list
            linelist=line.strip().split()
            for i in linelist:
                content.append(i.strip())
    content=np.array(content)
    content=np.reshape(content,[-1,])  #shape (204,1)
    return content
  1. 建立字典,建立字典的目的是实现将词转换成词向量
    字典的目的是实现word-->向量,这个没有使用word2vec的算法。使用本书文本数据的词建立的向量。简化的过程,如下:
#文本数据
hello ml hello dl
#去重以后的词汇
hello ml dl
#建立字典
{'hello':0 , 'ml':1 , 'dl':2 }
#反向字典
{0:'hello' ,  1:'ml' , 2: 'dl'}

代码如下:

def mybuild_dataset(words):  
    # words -- > ['hello','hello','world','python','tensorflow','rnn']
    count = collections.Counter(words)  
    # Counter({'hello': 2, 'python': 1, 'rnn': 1, 'tensorflow': 1, 'world': 1})
    dictionary=dict()
    for key in count:
        dictionary[key]=len(dictionary)
    #dictionary -- > {'hello': 0, 'python': 3, 'rnn': 1, 'tensorflow': 2, 'world': 4}
    reverse_dictionary = dict(zip(dictionary.values(), dictionary.keys()))
    #reverse_dictionary -- > {0: 'hello', 1: 'rnn', 2: 'tensorflow', 3: 'python', 4: 'world'}
    return dictionary, reverse_dictionary  #len(dictionary)  --> 112  
  1. 建立RNN模型训练

理解一个模型,我觉得一个比较好的方式是先搞明白它训练的输入和输出。在这个模型里面,处理训练数据的输入和输出,如下所示:

#训练数据
the mice had a xxxxx

# 训练的思路是,将前三个数据作为训练的输入
[[the],[mice],[had]]  --> 转化为词向量

#将第四个词汇作为输出
['a']
#然后将输出的词汇转换成onehot的形式
[ 0,0,0,0 ...0,1,0,0  ...  0,0,0 ]   #长度是词向量字典的长度 , 置1的地方是词向量字典里面‘a’对应的输出设置为1

具体实现的代码,如下:

3.1 RNN模型的训练数据的输入

n_input = 3
offset = 是一个随机的偏移,这个是程序设计上面的一个trick,不影响理解这一段代码

# 输入x ,将前三个词汇转换成词向量
# symbols_in_keys  是一个二维的list -->  [[34], [92], [85]]
symbols_in_keys = [[dictionary[ str(training_data[i])]] for i in range(offset, offset+n_input) ]

# reshape  把他们转换成 (1, 3, 1)
symbols_in_keys = np.reshape(np.array(symbols_in_keys), [-1, n_input, 1])

3.2 RNN模型的训练数据的输出

# 这一段代码搞定是 y_true ,把第四个词转换成词向量 onehot的类型
symbols_out_onehot = np.zeros([vocab_size], dtype=float)

# str(training_data[offset+n_input])  ->  'mice'
symbols_out_onehot[dictionary[str(training_data[offset+n_input])]] = 1.0
symbols_out_onehot = np.reshape(symbols_out_onehot,[1,-1])

3.3 RNN模型的训练

def RNN(x, weights, biases):
    batch_size=1
    x = tf.reshape(x, [batch_size,n_input,1])          # (1,3,1) 相当于batch =1 
    # rnn 
    cell = tf.contrib.rnn.BasicLSTMCell(n_hidden)
    init_state = cell.zero_state(batch_size, dtype=tf.float32)
    # final_state 的维度是  batch * n_hidden                       --> 1 * 512
    # outputs     的维度是  batch * n_input(time_step) * n_hidden  --> 1 * 3  * 512
    outputs, final_state = tf.nn.dynamic_rnn(cell, x, initial_state=init_state, time_major=False)  
    
    #print ("before unstack , output shape : ",outputs.shape)   # output shape :  (1,3,512) (batch,time_step,cell_n_hidden)
    #unstack 更改维度
    outputs = tf.unstack(tf.transpose(outputs, [1,0,2]))
    #这个时候 outputs 变成了list 
    #print ("output shape[-1] 2: ",outputs[-1].shape)           # output shape :  (3,1,512), outputs[-1] shape (1,512)
    results = tf.matmul(outputs[-1], weights['out']) + biases['out']
    #(1,112)  这个的表示意义是一个(1,112)的onehot,112表示字典里面总共有112个词汇
    return results   #(1, 112)  这个表示的是一个onehot
  1. 完整代码
    https://github.com/zhaozhengcoder/Machine-Learning/tree/master/tensorflow_tutorials/ RNN学习的目录下面

训练的数据使用了伊索寓言的数据,但是数据的量很少,迭代的次数也很少。可以更换成其他的数据,然后增大迭代的次数。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容