【6-1】RNN循环神经网络

一、问题:如何利用神经网络处理序列问题(语音、文本)?

在MNIST手写数字识别中,输入一张图片,得到一个结果,输入另一张图片,得到另一个结果,输入的样本是相互独立的,输出的结果之间也不会相互影响。也就是说,这时处理的数据是IID(独立同分布)数据,但序列类的数据却不满足IID特征,所以RNN出场了。

二、RNN的结构

看到hello,wor__!你肯定会轻而易举地预测出后两个字符为ld。

RNN结构如下:

左侧:x是输入,s相当于隐藏层,o是输出。U、V、W都是权值矩阵。为什么称之为循环那?因为隐藏层的输出不光传给了下一个节点,也传给了它本身。展开如右:t代表时刻,st是时刻t时的记忆,st不仅与t时刻的输入有关,还与上一个时刻的记忆st-1有关,故st=f(Uxt+Wst-1),ot是t时刻的输出,比如是预测下个词的时候,可能是softmax输出的每个候选词的概率。不仅与当前的输入有关,还与之前的记忆有关。图中也可以发现:W、U、V没有变过,所以RNN的权值矩阵是共享的,这样就大大减少了训练的参数。

这两个图都是一个意思:不仅与当前输入有关系,还有上一时刻的记忆有关系,就和电容这种记忆性元件是一个道理。但是,RNN的记忆是有限的,它不可能把所有的都记住。所以,LSTM又出来解决这个问题了。

 三、LSTM(Long Short Term Memory)网络

在看电影的时候,情节发展往往要根据之前的细节来推断,因为作者往往藏了伏笔。但RNN网络的记忆细胞随着时间的推移,有些内容它就会忘掉,记不住之前的伏笔。但是LSTM的记忆细胞会把该记住的记住,把该忽略的忽略。

上图是简单的RNN网络结构。

这是LSTM结构。它对状态是否参与输入以及状态的更新做了灵活的选择,也就是它可以过滤掉不想再记住的东西,还可以再往里加一些新的东西。

这种结构的核心思想是引入了一个叫“细胞状态(cell state)”的连接,这个细胞状态用来存放想要记忆的东西,同时在里面加了3个门。

细胞状态Ct在行走的过程中,总会遇到各种操作。也许乘,也许加。这些都是它走过了一扇又一扇门实现的。

第一个要过的忘记门:把以前的状态忘记,即决定丢弃什么信息。

经过这一步,就选出来了那些不想要的东西,ft的值在0—1之间,0表示完全舍弃,1表示完全保留。

下一个要过输入门:决定加入什么新的状态,即更新细胞状态。

然后就是细胞状态的更新。

最后过输出门:把更新后的状态和输入一起输出。

四、手写数字识别参考小程序:

 1 import tensorflow as tf
 2 from tensorflow.examples.tutorials.mnist import input_data
 3
 4 #载入数据集
 5 mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
 6
 7 # 输入图片是28*28
 8 n_inputs = 28 #输入一行,一行有28个数据,输入神经元,每次输入一行
 9 max_time = 28 #一共28行,每次输入一行,一共需要输入28次
10 lstm_size = 100 #隐层单元
11 n_classes = 10 # 10个分类
12 batch_size = 50 #每批次50个样本
13 n_batch = mnist.train.num_examples // batch_size #计算一共有多少个批次
14
15 #这里的none表示第一个维度可以是任意的长度
16 x = tf.placeholder(tf.float32,[None,784])
17 #正确的标签
18 y = tf.placeholder(tf.float32,[None,10])
19
20 #初始化权值
21 weights = tf.Variable(tf.truncated_normal([lstm_size, n_classes], stddev=0.1))
22 #初始化偏置值
23 biases = tf.Variable(tf.constant(0.1, shape=[n_classes]))
24
25
26 #定义RNN网络
27 def RNN(X,weights,biases):
28     # inputs=[batch_size, max_time, n_inputs]
29     inputs = tf.reshape(X,[-1,max_time,n_inputs])  #X由50*784转化成50*28*28
30     #定义LSTM基本CELL
31     lstm_cell = tf.contrib.rnn.core_rnn_cell.BasicLSTMCell(lstm_size)
32     # final_state[0]是cell state
33     # final_state[1]是hidden_state
34     outputs,final_state = tf.nn.dynamic_rnn(lstm_cell,inputs,dtype=tf.float32)
35     results = tf.nn.softmax(tf.matmul(final_state[1],weights) + biases)
36     return results
37
38
39 #计算RNN的返回结果
40 prediction= RNN(x, weights, biases)
41 #损失函数
42 cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y))
43 #使用AdamOptimizer进行优化
44 train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
45 #结果存放在一个布尔型列表中
46 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(prediction,1))#argmax返回一维张量中最大的值所在的位置
47 #求准确率
48 accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#把correct_prediction变为float32类型
49 #初始化
50 init = tf.global_variables_initializer()
51
52 with tf.Session() as sess:
53     sess.run(init)
54     for epoch in range(6):
55         for batch in range(n_batch):
56             batch_xs,batch_ys =  mnist.train.next_batch(batch_size)
57             sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})
58
59         acc = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
60         print ("Iter " + str(epoch) + ", Testing Accuracy= " + str(acc))
 1 Extracting MNIST_data/train-images-idx3-ubyte.gz
 2 Extracting MNIST_data/train-labels-idx1-ubyte.gz
 3 Extracting MNIST_data/t10k-images-idx3-ubyte.gz
 4 Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
 5 Iter 0, Testing Accuracy= 0.7221
 6 Iter 1, Testing Accuracy= 0.8016
 7 Iter 2, Testing Accuracy= 0.8763
 8 Iter 3, Testing Accuracy= 0.9103
 9 Iter 4, Testing Accuracy= 0.9223
10 Iter 5, Testing Accuracy= 0.9311

关于dynamic_rnn定义中的参数:

  • cell:生成好的cell类对象。
  • inputs:输入数据,是一个张量,一般是三维张量:[batch_size,max_time,...],其中batch_size表示一次的批次数量,max_time表示时间序列总数,后面是具体数据。
  • sequence_length:每一个输入的序列长度。

返回值:一个是结果,一个是cell状态,结果是以[batch_size,max_time,...]形式的张量。

结论上来说,如果cell为LSTM,那 state是个tuple,分别代表ht和ct,其中ht与outputs中的对应的最后一个时刻的输出相等,假设state形状为[ 2,batch_size, cell.output_size ],outputs形状为 [ batch_size, max_time, cell.output_size ],那么state[ 1, batch_size, : ] == outputs[ batch_size, -1, : ]。【参考:https://blog.csdn.net/u010960155/article/details/81707498

2019-06-18 21:12:44

原文地址:https://www.cnblogs.com/direwolf22/p/11008465.html

时间: 2024-10-02 10:13:55

【6-1】RNN循环神经网络的相关文章

TensorFlow框架(6)之RNN循环神经网络详解

1. RNN循环神经网络 1.1 结构 循环神经网络(recurrent neural network,RNN)源自于1982年由Saratha Sathasivam 提出的霍普菲尔德网络.RNN的主要用途是处理和预测序列数据.全连接的前馈神经网络和卷积神经网络模型中,网络结构都是从输入层到隐藏层再到输出层,层与层之间是全连接或部分连接的,但每层之间的节点是无连接的. 图 11 RNN-rolled 如图 11所示是一个典型的循环神经网络.对于循环神经网络,一个非常重要的概念就是时刻.循环神经网

CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)

CNN(卷积神经网络).RNN(循环神经网络).DNN(深度神经网络)的内部网络结构有什么区别? DNN以神经网络为载体,重在深度,可以说是一个统称.RNN,回归型网络,用于序列数据,并且有了一定的记忆效应,辅之以lstm.CNN应该侧重空间映射,图像数据尤为贴合此场景. DNN以神经网络为载体,重在深度,可以说是一个统称.RNN,回归型网络,用于序列数据,并且有了一定的记忆效应,辅之以lstm.CNN应该侧重空间映射,图像数据尤为贴合此场景. Stanford University CS231

RNN 循环神经网络-BF 求导过程

RNN 循环神经网络-BF 求导过程 所有的RNN都具有一种重复神经网络模块的链式形式.在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层 在时间视角上的显示为下图: 求导BP 更新参数值 整体误差E等于每个时刻E_t的误差之和 整体损失对U/V/W进行求偏导 \[ ΔU=\frac{\partial E}{\partial U}=\sum_t \frac{\partial e_t}{\partial U} \] \[ ΔV=\frac{\partial E}{\par

RNN循环神经网络学习——概述

循环神经网络(Recurrent Neural NetWork,RNN)是一种将节点定向连接成环的人工神经网络,其内部状态可以展示动态时序行为. 循环神经网络的主要用途是处理和预测序列数据.循环神经网络最初就是为了刻画一个序列当前的输出与之前信息的关系.从网络结构上来看,循环神经网络会记忆之前的信息,并利用之前的信息影响后面节点的输出.也就是说,循环神经网络的隐藏层之间的节点是有连接的,隐藏层的输入不仅包含输入层的输出,还包括上一时刻隐藏层的输出. 如图为典型的RNN结构示意图.RNN主体结构的

RNN循环神经网络实现预测比特币价格过程详解

http://c.biancheng.net/view/1950.html 本节将介绍如何利用 RNN 预测未来的比特币价格. 核心思想是过去观察到的价格时间序列为未来价格提供了一个很好的预估器.给定时间间隔的比特币值通过https://www.coindesk.com/api/的 API 下载,以下是 API 文档的一部分: 经 MIT 授权许可,本节将使用https://github.com/guillaume-chevalier/seq2seq-signal-prediction中的代码.

RNN循环神经网络(Recurrent Neural Network)学习

一.RNN简介 1.)什么是RNN? RNN是一种特殊的神经网络结构,考虑前一时刻的输入,且赋予了网络对前面的内容的一种'记忆'功能. 2.)RNN可以解决什么问题? 时间先后顺序的问题都可以使用RNN来解决,比如:音乐,翻译,造句,语音识别,视频图像预测,语言处理等等,后来经过变种甚至可以达到CNN的作用 具体例子1 Car which.............,() ..........使用RNN可以预测括号里面的内容应该为 is/was. 2 学习莎士比亚写的诗词,然后进行模仿 3 你想为

循环神经网络(RNN)模型与前向反向传播算法

在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系.今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Recurrent Neural Networks ,以下简称RNN),它广泛的用于自然语言处理中的语音识别,手写书别以及机器翻译等领域. 1. RNN概述 在前面讲到的DNN和CNN中,训练样本的输入和输出是比较的确定的.但是有一类问题DNN和CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不

循环神经网络RNN公式推导走读

0语言模型-N-Gram 语言模型就是给定句子前面部分,预测后面缺失部分 eg.我昨天上学迟到了,老师批评了____. N-Gram模型: ,对一句话切词 我 昨天 上学 迟到 了 ,老师 批评 了 ____. 2-N-Gram 会在语料库中找 了 后面最可能的词: 3-N-Gram 会在预料库中找 批评了 后面最可能的词: 4-N-Gram 的内存耗费就非常巨大了(语料库中保存所有的四个词的预料组合). 1.1单向循环神经网络 一个单隐层结构示意图: 参数:输入到隐层的权重U.隐层到输出的权重

《转》循环神经网络(RNN, Recurrent Neural Networks)学习笔记:基础理论

转自 http://blog.csdn.net/xingzhedai/article/details/53144126 更多参考:http://blog.csdn.net/mafeiyu80/article/details/51446558 http://blog.csdn.net/caimouse/article/details/70225998 http://kubicode.me/2017/05/15/Deep%20Learning/Understanding-about-RNN/ RNN