逐步理解RNN循环神经网络:
先了解一下最基本的单层网络,它的结构如图:
输入是x,经过变换Wx+b和激活函数f得到输出y。
前面状态输出会影响后面状态输出的情况有下面几种:
为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。先从h1的计算开始看:
每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这点非常重要。
依次计算(使用相同的参数U、W、b)
对h1进行一次变换,得到输出y1
同样使用相同的V和c得到y2、y3、y4
模型构造完成,输入x1,…,xn,输出y1,…,yn,输入和输出序列等长。
时间步time_steps问题的理解:
执行一次call方法,就进行一步转化,从h0->h1:
cell = tf.nn.rnn_cell.BasicRNNCell(num_units=128) 调用一次call方法
使用tf.nn.dynamic_rnn一次执行多步(参数中用到时间步time_steps):
输入数据的格式为(batch_size, time_steps, input_size) time_steps为时间步,表示序列本身的长度,长度为10的句子对应的time_steps就等于10,这样就可以直接输入x1,...,x10,得到h1,...,h10
outputs, state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state)
得到的outputs就是time_steps步里所有的输出。它的形状为(batch_size, time_steps, cell.output_size)。state是最后一步的隐状态,它的形状为(batch_size, cell.state_size)。
堆叠RNNCell
单层RNN的能力有限,我们需要多层的RNN。将x输入第一层RNN的后得到隐层状态h,这个隐层状态就相当于第二层RNN的输入,第二层RNN的隐层状态又相当于第三层RNN的输入,以此类推。在TensorFlow中,可以使用tf.nn.rnn_cell.MultiRNNCell函数对RNNCell进行堆叠
def get_a_cell():
return tf.nn.rnn_cell.BasicRNNCell(num_units=128) #每层128个状态
# 用tf.nn.rnn_cell MultiRNNCell创建3层RNN
cell = tf.nn.rnn_cell.MultiRNNCell([get_a_cell() for _ in range(3)]) # 3层RNN