一、循环神经元
循环神经网络和前馈神经网络非常类似,只是在其基础上添加了反向链接,下图为一个最简单的循环神经网络,它由一个神经元接受输入,产生输出并将该输出返送给自身。

RNN通常用来处理序列数据,训练样本的格式为 X = x(1)x(2)x(3)…x(t-1)x(t),在每个时间步t,该循环神经元接收x(t)和前一个时间步长的输出y(t-1)的输出,产生当前输出y(t)(不准确,后文会解释)。如下图所示,注意:所有的这些操作都是在同一个神经元上完成的(共享w和b)

RNN的记忆能力从何而来:在时间步长t时递归神经元的输出是先前神经元中所有输入的函数。
为什么说不准确,因为时间步t-1传递给时间步t的并不是y(t-1),而是时间步t-1的单元状态h(t-1)。是不是不太好理解?看一下下图就明白了,y(t)是时间步t的输出y(t) ,h(t)=(h(t-1),x(t)) 是时间步t的单元状态,当前我们讨论的基本单元而言,输出等于状态,但在复杂的神经单元中h(t)是不等于y(t)的!总而言之传递的是单元状态!!!

我们来举个例子总结一下,假设我们要用1月1日-1月29日的气温,去预测1月30号的,那么我们就拥有了一个长度为29的由每天气温值组成个序列,X=x(0)x(1)……x(28),其中x(i)称为一个时间步(也称为时间帧),在我们的例子中x(i)代表1月i号的气温是一个数值(本例中是数值,其他应用中可也能是向量——如果去做公司收益预测,因为收益一天中的有多种因素决定的,那么x(i)就是一个向量了),讲X数据循环神经元,keras首先会将x(0)和前一时间步的单元状态(出始状态为0)输入神经元 ,得到y(1)和h(1),接着将h(1)和x(1)输入神经元得到y(2),h(2)……
二、keras实现RNN
2.1简单RNN
我们首先实现一个最简单的RNN:
  
   - 
    
     
    
    
     
       model = keras.models.Sequential([
     
    
- 
    
     
    
    
     
           keras.layers.SimpleRNN(
      1, input_shape=[
      None, 
      1])
     
    
- 
    
     
    
    
     
      ])
     
    
- 
    
     
    
    
     
      #RNN神经元不需要指定输入序列的长度。所以input_shape的第一个参数可以是none
     
    
keras.layers.SimpleRNN 具体借口如下:
  
   - 
    
     
    
    
     
      “”“
     
    
- 
    
     
    
    
     
      keras.layers.SimpleRNN(
     
    
- 
    
     
    
    
     
                     units,
     
    
- 
    
     
    
    
     
                     activation=
      'tanh',
     
    
- 
    
     
    
    
     
                     use_bias=
      True,
     
    
- 
    
     
    
    
     
                     kernel_initializer=
      'glorot_uniform',
     
    
- 
    
     
    
    
     
                     recurrent_initializer=
      'orthogonal',
     
    
- 
    
     
    
    
     
                     bias_initializer=
      'zeros',
     
    
- 
    
     
    
    
     
                     kernel_regularizer=
      None,
     
    
- 
    
     
    
    
     
                     recurrent_regularizer=
      None,
     
    
- 
    
     
    
    
     
                     bias_regularizer=
      None,
     
    
- 
    
     
    
    
     
                     activity_regularizer=
      None,
     
    
- 
    
     
    
    
     
                     kernel_constraint=
      None,
     
    
- 
    
     
    
    
     
                     recurrent_constraint=
      None,
     
    
- 
    
     
    
    
     
                     bias_constraint=
      None,
     
    
- 
    
     
    
    
     
                     dropout=
      0.,
     
    
- 
    
     
    
    
     
                     recurrent_dropout=
      0.,
     
    
- 
    
     
    
    
     
                     return_sequences=
      False,
     
    
- 
    
     
    
    
     
                     return_state=
      False,
     
    
- 
    
     
    
    
     
                     go_backwards=
      False,
     
    
- 
    
     
    
    
     
                     stateful=
      False,
     
    
- 
    
     
    
    
     
                     unroll=
      False
     
    
- 
    
     
    
    
     
      )
     
    
- 
    
     
    
    
     
      units:神经元输出的维度(例如input_shape=[
      10,
      1],units=
      3 会改变最后一位使其变为
      3)
     
    
- 
    
     
    
    
     
      return_sequences:Keras中的循环层仅返回最终输出y(t)。要使它们每个时间步长返
     
    
- 
    
     
    
    
     
      回一个输出(输出结果y(
      1)y(
      2)……y(t)),必须设置return_sequences=
      True。
     
    
- 
    
     
    
    
     
      ”“”
     
    
 2.2深度RNN
  
   - 
    
     
    
    
     
      model = keras.models.Sequential([
     
    
- 
    
     
    
    
     
          keras.layers.SimpleRNN(
      20, return_sequences=
      True, input_shape=[
      None, 
      1]),
     
    
- 
    
     
    
    
     
          keras.layers.SimpleRNN(
      20,return_sequences=
      True),
     
    
- 
    
     
    
    
     
          keras.layers.SimpleRNN(
      20),
     
    
- 
    
     
    
    
     
          keras.layers.Dense(
      1)
     
    
- 
    
     
    
    
     
      ])
     
    
输出的模型摘要如下:

这段代码实现了一个简单的网络,该网络堆叠了三个循环层和一个全连接层,具体如下:

让我们对这段代码做一点更改, 删除第二个循环层中的return_sequences=True看看会发生什么,运行后发现会报错
  
   - 
    
     
    
    
     
      model = keras.models.Sequential([
     
    
- 
    
     
    
    
     
          keras.layers.SimpleRNN(
      20, return_sequences=
      True, input_shape=[
      None, 
      1]),
     
    
- 
    
     
    
    
     
          keras.layers.SimpleRNN(
      20),
     
    
- 
    
     
    
    
     
          keras.layers.SimpleRNN(
      20),
     
    
- 
    
     
    
    
     
          keras.layers.Dense(
      1)
     
    
- 
    
     
    
    
     
      ])
     
    
报错内容如下:

这是为什么???
RNN输入数据入下图所示,我们必须始终提供一个3D张量作为输入

 输出格式为(None, None, 20) 的3D张量(batch_size,time_stamp,units)
输出格式为(None, None, 20) 的3D张量(batch_size,time_stamp,units)

输出格式为(None, 20) 的2D张量(batch_size,units)
为什么:还记得之前说的 return_sequences的作用嘛,默认情况下return_sequences=false,即只返回时间步t的输出y(t)
综上所述:rnn_2希望收到一个3D张量作为数据,而rnn_1的out_put是2D张量,所以报错。
总结:
  
   - 
    
     
    
    
     
      RNN输入总是一个 3D 数组。 (batch_size, time_steps, units)
     
    
- 
    
     
    
    
     
      RNN 的输出可以是 2D 数组或 3D 数组,具体取决于 return_sequences。
     
    
- 
    
     
    
    
     
      1、return_sequence=
      False,则输出为二维数组。(batch_size, units)
     
    
- 
    
     
    
    
     
      2、return_sequence=
      True,则输出为 3D 数组。batch_size, time_steps, units)
     
    
- 
    
     
    
    
      
     
    
转载:https://blog.csdn.net/qq_42018521/article/details/128589615
 
					