摘要:本篇文章将分享循环神经网络LSTM RNN如何实现回归预测。
本文分享自华为云社区《[[Python人工智能] 十四.循环神经网络LSTM RNN回归案例之sin曲线预测 丨【百变AI秀】](https://bbs.huaweicloud.com/b...)》,作者:eastmount。
一.RNN和LSTM回顾
1.RNN
(1) RNN原理
循环神经网络英文是Recurrent Neural Networks,简称RNN。假如有一组数据data0、data1、data2、data3,应用同一个神经网络预测它们,失去对应的后果。如果数据之间是有关系的,比方做菜下料的前后步骤,英文单词的程序,如何让数据之间的关联也被神经网络学习呢?这就要用到——RNN。
假如存在ABCD数字,须要预测下一个数字E,会依据后面ABCD程序进行预测,这就称为记忆。预测之前,须要回顾以前的记忆有哪些,再加上这一步新的记忆点,最终输入output,循环神经网络(RNN)就利用了这样的原理。
首先,让咱们想想人类是怎么剖析事物之间的关联或程序的。人类通常记住之前产生的事件,从而帮忙咱们后续的行为判断,那么是否能让计算机也记住之前产生的事件呢?
在剖析data0时,咱们把剖析后果存入记忆Memory中,而后当剖析data1时,神经网络(NN)会产生新的记忆,但此时新的记忆和老的记忆没有关联,如上图所示。在RNN中,咱们会简略的把老记忆调用过去剖析新记忆,如果持续剖析更多的数据时,NN就会把之前的记忆全副累积起来。
RNN构造如下图所示,依照工夫点t-1、t、t+1,每个时刻有不同的x,每次计算会思考上一步的state和这一步的x(t),再输入y值。在该数学模式中,每次RNN运行完之后都会产生s(t),当RNN要剖析x(t+1)时,此刻的y(t+1)是由s(t)和s(t+1)独特发明的,s(t)可看作上一步的记忆。多个神经网络NN的累积就转换成了循环神经网络,其简化图如下图的右边所示。
总之,只有你的数据是有程序的,就能够应用RNN,比方人类谈话的程序,电话号码的程序,图像像素排列的程序,ABC字母的程序等。在后面解说CNN原理时,它能够看做是一个滤波器滑动扫描整幅图像,通过卷积加深神经网络对图像的了解。
而RNN也有同样的扫描成果,只不过是减少了工夫程序和记忆性能。RNN通过暗藏层周期性的连贯,从而捕捉序列化数据中的动静信息,晋升预测后果。
(2) RNN利用
RNN罕用于自然语言解决、机器翻译、语音辨认、图像识别等畛域,上面简略分享RNN相干利用所对应的构造。
- RNN情感剖析: 当剖析一个人谈话情感是踊跃的还是消极的,就用如下图所示的RNN构造,它有N个输出,1个输入,最初工夫点的Y值代表最终的输入后果。
- RNN图像识别: 此时有一张图片输出X,N张对应的输入。
- RNN机器翻译: 输出和输入别离两个,对应的是中文和英文,如下图所示。
2.LSTM
接下来咱们看一个更弱小的构造,称为LSTM。
(1) 为什么要引入LSTM呢?
RNN是在有序的数据上进行学习的,RNN会像人一样对先前的数据产生记忆,但有时候也会像老爷爷一样遗记先前所说。为了解决RNN的这个弊病,提出了LTSM技术,它的英文全称是Long short-term memory,长短期记忆,也是当下最风行的RNN之一。
假如当初有一句话,如下图所示,RNN判断这句话是红烧排骨,这时须要学习,而“红烧排骨“在句子结尾。
"红烧排骨"这个词须要通过长途跋涉能力到达,要通过一系列失去误差,而后通过反向传递,它在每一步都会乘以一个权重w参数。如果乘以的权重是小于1的数,比方0.9,0.9会一直地乘以误差,最终这个值传递到初始值时,误差就隐没了,这称为梯度隐没或梯度离散。
反之,如果误差是一个很大的数,比方1.1,则这个RNN失去的值会很大,这称为梯度爆炸。
梯度隐没或梯度爆炸:在RNN中,如果你的State是一个很长的序列,假如反向传递的误差值是一个小于1的数,每次反向传递都会乘以这个数,0.9的n次方趋向于0,1.1的n次方趋向于无穷大,这就会造成梯度隐没或梯度爆炸。
这也是RNN没有复原记忆的起因,为了解决RNN梯度下降时遇到的梯度隐没或梯度爆炸问题,引入了LSTM。
(2) LSTM
LSTM是在一般的RNN下面做了一些改良,LSTM RNN多了三个控制器,即输出、输入、遗记控制器。右边多了个条主线,例如电影的主线剧情,而本来的RNN体系变成了分线剧情,并且三个控制器都在分线上。
- 输出控制器(write gate): 在输出input时设置一个gate,gate的作用是判断要不要写入这个input到咱们的内存Memory中,它相当于一个参数,也是能够被训练的,这个参数就是用来管制要不要记住当下这个点。
- 输入控制器(read gate): 在输入地位的gate,判断要不要读取当初的Memory。
- 遗记控制器(forget gate): 解决地位的遗记控制器,判断要不要遗记之前的Memory。
LSTM工作原理为:如果分线剧情对于最终后果非常重要,输出控制器会将这个分线剧情按重要水平写入主线剧情,再进行剖析;如果分线剧情扭转了咱们之前的想法,那么遗记控制器会将某些主线剧情遗记,而后按比例替换新剧情,所以主线剧情的更新就取决于输出和遗记管制;最初的输入会基于主线剧情和分线剧情。
通过这三个gate可能很好地管制咱们的RNN,基于这些管制机制,LSTM是延缓记忆的良药,从而带来更好的后果。
二.LSTM RNN回归案例阐明
后面咱们解说了RNN、CNN的分类问题,这篇文章将分享一个回归问题。在LSTM RNN回归案例中,咱们想要用蓝色的虚线预测红色的实线,因为sin曲线是波浪循环,所以RNN会用一段序列来预测另一段序列。
代码根本构造包含:
(1) 生成数据的函数get_batch()
(2) 主体LSTM RNN
(3) 三层神经网络,包含input_layer、cell、output_layer,和之前分类RNN的构造一样。
(4) 计算误差函数 computer_cost
(5) 误差weight和偏置biases
(6) 主函数建设LSTM RNN模型
(7) TensorBoard可视化神经网络模型,matplotlib可视化拟合曲线、
最初再补充下BPTT,就开始咱们的代码编写。
(1) 一般RNN
假如咱们训练含有1000000个数据的序列,如果全副训练的话,整个的序列都feed进RNN中,容易造成梯度隐没或爆炸的问题。所以解决的办法就是截断反向流传 (Truncated Backpropagation,BPTT) ,咱们将序列截断来进行训练(num_steps)。
个别截断的反向流传是:在以后工夫t,往前反向流传num_steps步即可。如下图,长度为6的序列,截断步数是3,Initial State和Final State在RNN Cell中传递。
(2) TensorFlow版本的BPTT
然而Tensorflow中的实现并不是这样,它是将长度为6的序列分为了两局部,每一部分长度为3,前一部分计算失去的final state用于下一部分计算的initial state。如下图所示,每个batch进行独自的截断反向流传。此时的batch会保留Final State,并作为下一个batch的初始化State。
参考:深度学习(07)RNN-循环神经网络-02-Tensorflow中的实现 - 莫失莫忘Lawlite
三.代码实现
第一步,关上Anaconda,而后抉择曾经搭建好的“tensorflow”环境,运行Spyder。
第二步,导入扩大包。
第三步,编写生成数据的函数get_batch(),它生成了sin曲线的序列。
此时的输入后果如下图所示,留神它只是模仿的预期曲线,还不是咱们神经网络学习的构造。
第四步,编写LSTMRNN类,它用于定义咱们的循环神经网络构造,初始化操作和所需变量。
初始化init()函数的参数包含:
• n_steps示意batch中的步骤,共有3步。
• input_size示意传入batch data时,每个input的长度,该实例中input_size和output_size均为1。如下图所示,假如咱们batch长度为一个周期(0-6),每个input是线的x值,input size示意每个工夫点有多少个值,只有一个点故为1。
• output_size示意输入的值,输入对应input线的y值,其大小值为1。
• cell_size示意RNN Cell的个数,其值为10。
• batch_size示意一次性传给神经网络的batch数量,设置为50。
该局部代码如下,留神xs和ys的形态。同时,咱们须要应用Tensorboard可视化RNN的构造,所以调用tf.name_scope()设置各神经层和变量的命名空间名称,详见第五篇文章。
第五步,接着开始编写三个函数(三层神经网络),它是RNN的外围构造。
这三个函数也是减少在LSTMRNN的Class中,外围代码及具体正文如下所示:
留神,下面调用了reshape()进行形态更新,为什么要将三维变量改成二维呢?因为只有变成二维变量之后,能力计算W*X+B。
第六步,定义计算误差函数。
这里须要留神:咱们应用了seq2seq函数。它求出的loss是整个batch每一步的loss,而后把每一步loss进行sum求和,变成了整个TensorFlow的loss,再除以batch size均匀,最终失去这个batch的总cost,它是一个scalar数字。
前面的文章咱们会具体写一篇机器翻译相干的内容,并应用seq2seq模型。
Seq2Seq模型是输入的长度不确定时采纳的模型,这种状况个别是在机器翻译的工作中呈现,将一句中文翻译成英文,那么这句英文的长度有可能会比中文短,也有可能会比中文长,所以输入的长度就不确定了。如下图所,输出的中文长度为4,输入的英文长度为2。
在网络结构中,输出一个中文序列,而后输入它对应的中文翻译,输入的局部的后果预测前面,依据下面的例子,也就是先输入“machine”,将"machine"作为下一次的输出,接着输入"learning",这样就能输入任意长的序列。
机器翻译、人机对话、聊天机器人等等,这些都是利用在当今社会都或多或少的使用到了咱们这里所说的Seq2Seq。
第七步,定义msr_error计算函数、误差计算函数和偏置计算函数。
写到这里,整个Class就定义实现。
第八步,接下来定义主函数,进行训练和预测操作,这里先尝试TensorBoard可视化展示。
四.残缺代码及可视化展现
该阶段的残缺代码如下,咱们先尝试运行下代码:
此时会在Python文件目录下新建一个“logs”文件夹和events的文件,如下图所示。
接下来尝试关上它。首先调出Anaconda Prompt,并激活TensorFlow,接着去到events文件的目录,调用命令“tensorboard --logdir=logs运行即可,如下图所示。留神,这里只须要指引到文件夹,它就会主动索引到你的文件。
此时拜访网址“http://localhost:6006/”,抉择“Graphs”,运行之后如下图所示,咱们的神经网络就呈现了。
神经网络构造如下图所示,包含输出层、LSTM层、输入层、cost误差计算、train训练等。
具体构造如下图所示:
通常咱们会将train局部搁置一边,选中“train”而后鼠标右键点击“Remove from main graph”。外围构造如下,in_hidden是承受输出的第一层,之后是LSTM_cell,最初是输入层out_hidden。
- in_hidden: 包含了权重Weights和biases,计算公式Wx_plus_b。同时,它包含了reshape操作,2_2D和2_3D。
- out_hidden: 包含了权重weights、偏置biases、计算公式Wx_plus_b、二维数据2_2D,并且输入后果为cost。
- cost: 计算误差。
- 两头是LSTM_cell: 包含RNN循环神经网络,初始化initial_state,之后会被state更新替换。
留神版本问题,读者能够联合本人的TensorFlow版本进行适当批改运行。作者版本版本信息为:Python3.6、Anaconda3、Win10、Tensorflow1.15.0。
如果您报错 AttributeError: module ‘tensorflow._api.v1.nn’ has no attribute ‘seq2seq’,这是TensorFlow 版本升级,办法调用更改。解决形式:
如果您报错 TypeError: msr_error() got an unexpected keyword argument ‘labels’,msr_error() 函数失去一个意外的要害参数 ‘lables’。其解决形式:定义msr_error() 函数时,应用 labels,logits 指定,将
改为:
如果您报错 ValueError: Variable in_hidden/weights already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? ,则重新启动kernel即可运行。
五.预测及曲线拟合
最初,咱们在主函数中编写RNN训练学习和预测的代码。
首先咱们来测试cost学习的后果。代码如下,if判断中cell_init_state为后面已初始化的state,之后更新state(model.cell_init_state: state ),其实就是将Final State换成下一个batch的Initial State,从而合乎咱们定义的构造。
每隔20步输入后果,如下所示,误差从最后的33到最初的0.335,神经网络在一直学习,误差在一直减小。
接下来减少matplotlib可视化的sin曲线动静拟合过程,最终残缺代码如下所示:
写道这里,这篇文章终于写完了。文章十分长,但心愿对您有所帮忙。LSTM RNN通过一组数据预测另一组数据。预测成果如下图所示,红色的实线示意须要预测的线,蓝色的虚线示意RNN学习的线,它们在一直地迫近,蓝线学到了红线的法则,最终将蓝线根本拟合到红线上。
六.总结
本文介绍完了,更多TensorFlow深度学习文章会持续分享,接下来咱们会分享监督学习、GAN、机器翻译、文本辨认、图像识别、语音辨认等内容。如果读者有什么想学习的,也能够私聊我,我去学习并利用到你的畛域。
最初,心愿这篇基础性文章对您有所帮忙,如果文章中存在谬误或不足之处,还请海涵~作为人工智能的菜鸟,我心愿本人能不断进步并深刻,后续将它利用于图像识别、网络安全、反抗样本等畛域,领导大家撰写简略的学术论文,一起加油!
代码下载地址(欢送大家关注点赞):
https://github.com/eastmounty...
https://github.com/eastmounty...
点击关注,第一工夫理解华为云陈腐技术~