rnn对于一些初学者来说被当成直接跳过的内容,因为如果需要使用RNN,那还不如直接用LSTM,好吧这个思路貌似也没什么问题,但是对于学习这件事情来讲的话,其实RNN是一个新型的网络结构,跳出神经网络的那个固定模式的开始,对大家学习还是有百利而无一害的。
拆了的RNN
[RNN]的经典过程本站也做过讲解,可以跳转过去看看完全的RNN样子,本节就是要将这一结构拆开来看的。
上图就是其中一个RNN结构,初始化的变量$h_0$,我们数据的第一个元素$x_1$,经过函数$f$,计算结果变成了$h_1$.对应到tensorflow的实现上,就是BasicRNNCell和BasicLSTMCell,通过命名能看出,一个是RNN神经单元,一个是LSTM神经单元。
import tensorflow as tf
import numpy as np
cell = tf.nn.rnn_cell.BasicRNNCell(num_units=128) # state_size = 128
print(cell.state_size) # 128
inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_size
h0 = cell.zero_state(32, np.float32) # 通过zero_state得到一个全0的初始状态,形状为(batch_size, state_size)
output, h1 = cell.call(inputs, h0) #调用call函数
print(h1.shape) # (32, 128)
上面的实例代码就是调用了tensorflow中的代码实现,这里你可能会怀疑这个call方法是怎么回事?我们来看下一个图。
当调用call方法的时候会有两个输出,output和h1,这个时候看上面这个图是不是很好了解,h1就是原来的h0,而output就是我们的输出数据,如果不是最后一层还可以往下传播。
你是不是有个很大的疑问,这RNN一般都是调用很多次的,你就让我这么调用?当然不是,我们实际应用中会使用tf.nn.dynamic_rnn函数。
outputs, state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state)
是不是很方便,这个也是我们经常使用的模型的样子。
总结
有些问题看起来很复杂,其实拆解以后就比较好的理解。