傻大方


首页 > 人文 >

深度学习深度学习(三十六)LSTM实践,自己创建文章



按关键词阅读:

小编提示您本文标题是:深度学习深度学习(三十六)LSTM实践,自己创建文章。来源是。

原理介绍完了,下面看看怎么实现LSTM。一如既往的使用tensorflow。

这个小的应用是输入一篇文章,当然,是英文的,然后通过机器学习后,我们可以复原一个类似的文章。这里说明一下,这篇文章的处理单元是单个字符。通过长短期记忆,来完成对一篇文章的内容进行学习。实际上就是任意输入一个字符,然后判断一下,这个字符后面最有可能出现的下一个字符是什么。那么下一个字符,就是本次字符的标签了。好了原理就是这样,我们直接看看如何实现吧。

首先,读入文本内容:

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

注意,凡是文本处理,一定是编码,就是把出现的内容进行0-n的编码,假设,我们只有26个小写的英文字符,那么我们可以让a=0,b=1...z=25。类似,我们在这个例子也是如此,为此,我们要做一个字典,就是哪个字符用哪个数字表示,很显然数字序号是经过排序的。

那么这个字典实际上就是vocab_to_int以及int_to_vocab这两个,一个数字编码到字符,一个是字符到编码。

好字典有了,那么原文,就可以翻译成全编码状态了,这个就是encode变量了。

下面就要进行批量处理了:

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

参见上图,我们通过编码后的文本是一个单线的一维数字数组,类似如上图第一个序列。

而我们处理的时候,通常是按照批次来完成的,这里就有了batch的概念,这就是上图第二个图的实例,

而批次,比如两个批次只是很粗暴的将原来的序列由一行等分成两行,而我们每次是多个批次,同时取n个,这个就是上图的第三层图,就是黄色部分的示意图了,这里每个批次取的长度,我们叫做step又叫上图所标识的sequence length。实现代码如下:

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

好下面,我们就要创建LSTM层了,LSTM层,在tensorflow里面是有现成的创建过程的。(LSTM是啥,出门左转吧,看本系列的上一篇文章介绍)

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

我们创建LSTM层,其实重点是两个参数,一个LSTM有多少层,一个是一层有多少个单元。

这里注意两点:

  1. LSTM的创建,是先单独建立一层(输入一层有多少个单元),然后在通过tf.contrib.rnn.MultiRNNCell函数将多层堆叠起来。是分开两步创建的。

  2. LSTM创建好后,经过LSTM计算(下面有对应的代码)后,输出的那个单元的长度,实际就是LSTM一层的单元数量

另外,LSTM因为是长期记忆,所以,是有对应状态的,这个也很重要。

然后,我们就开始计算结果了:

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

这个代码,重点是结果的处理。参数:lstm_output其实就是刚刚LSTM层计算的结果。

这个结果是一个三维的张量[batch*step*LSTMUnit]前两维,代表之前说的,一次输入的批次的字符,而最后一维,实际上就是单个字符,经过一次LSTM计算后,得出的数量,上面也说过了,这个数量就是LSTM的单层单元长度。

好,了解了这个以后,下面要做的其实就是要把这个结果进行一次展平层的神经网络计算(就是普通的隐藏层)而普通隐藏层只支持二维的,所以上面代码,头几步就是要把这个三维的张量转成二维的。怎么转呢?当然是把batch*step个字符数组部分拉平变成一维的就行了,所以转换后的张量就变成了[batch*step,LSTMUnit]的张量了。

后面的代码好动了启动单层Y=X*W+B模式,进行神经网络计算。

下面要计算lost了

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

这个很传统了,不解释。

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

然后进行梯度下降,优化。

这里值得说明的是,这里有一个叫做grad_clip的参数和处理,这里就是要保证,进行梯度下降的时候,偏差不能太大。

好下面我们把它拼凑在一起:

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

上述代码中,有一个判断,就是sampling是否为true,这是用于区分当前是训练状态还是使用状态。可以看出,训练状态是按照batch进行的,而使用状态呢,实际上每次只输入一个字符。

关键点是outputs, state = tf.nn.dynamic_rnn(cell, x_one_hot, initial_state=self.initial_state)

RNN的LSTM是要手动计算的,这个和我们熟悉的展平层和卷积层都不大一样,LSTM从建立模型开始,到后面的计算都要手动进行。

好完事后,我们进行训练:

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

注意,懒得改了,上面是调试时候的,epochs改成20才能真正训练

这里,当然了,训练的参数是这些:

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

好了,为了便于理解,上述创建模型的时候,有三处打印,分别将某些参数的形状打印出来了。

分别是:

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

从上面代码也可以看到,当每次训练后,都会把sess记录下来,便于后面使用,使用的代码如下:

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

文章|实践|创建|张量|字符|深度学习---小编总结的本文关键词

深度学习深度学习(三十六)LSTM实践,自己创建文章

哈哈,不同的输入情况下,都会给你来上一段输出的,挺有意思,有兴趣就试试吧。

这篇文章介绍了最基础的LSTM如何使用,下一篇文章介绍Embedding的用法,例子很有意思是一个词语的向量分析,用于分析同义词的时候蛮有效果的。


    稿源:(深度学习深度学习)

    【】网址:http://www.shadafang.com/c/sc202342.html

    标题:深度学习深度学习(三十六)LSTM实践,自己创建文章


    上一篇:成贵铁路首座站房主体结构封顶 预计2020年前通车

    下一篇:近日滴滴打车的事件已经很火了,滴滴打车在不久之后会消失吗?


    人文

    布司:治疗痛风,芹菜籽比非布司他还有用?药品贵但功效更强

    阅读(30)

    天津市泰达病院 李青今天有一个粉丝说:我吃了一年多的异常司他,尿酸降到两三百,腿照样一两个月疼一次,然则比来几个月吃澳大年夜利亚芹菜籽,尿酸也能降到两三百,腿也很少疼了,难道芹菜籽比异常司他还管用?这两个药到底哪个管用,信赖很多人心里都有一杆...