RNN代码拆解

rnn对于一些初学者来说被当成直接跳过的内容,因为如果需要使用RNN,那还不如直接用LSTM,好吧这个思路貌似也没什么问题,但是对于学习这件事情来讲的话,其实RNN是一个新型的网络结构,跳出神经网络的那个固定模式的开始,对大家学习还是有百利而无一害的。

拆了的RNN

[RNN]的经典过程本站也做过讲解,可以跳转过去看看完全的RNN样子,本节就是要将这一结构拆开来看的。

rnn_0.jpg

上图就是其中一个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方法是怎么回事?我们来看下一个图。

rnn_1.jpg

当调用call方法的时候会有两个输出,output和h1,这个时候看上面这个图是不是很好了解,h1就是原来的h0,而output就是我们的输出数据,如果不是最后一层还可以往下传播。

你是不是有个很大的疑问,这RNN一般都是调用很多次的,你就让我这么调用?当然不是,我们实际应用中会使用tf.nn.dynamic_rnn函数。

outputs, state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state)

是不是很方便,这个也是我们经常使用的模型的样子。

总结

有些问题看起来很复杂,其实拆解以后就比较好的理解。

# coding 
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×