畅游人工智能之海--Keras教程之循环神经网络(四)
畅游人工智能之海--Keras教程之循环神经网络(四) | 自制循环神经网络
写在开篇
什么是Cell呀?Cell可以理解为循环神经网络的一个单元,如图所示。如果一个网络被定义为 \[ \begin{equation} h_t = \mathcal{F}(h_{t - 1},X_t) \end{equation} \] 那么\(\mathcal{F}\)就是这篇文章要讲的Cell。

换言之,Keras中提供了自定义循环神经网络中的每个计算单元的接口,接下来就结合官方文档给出的一个例子进行分析。
API
自定义下面的代码已经调试过,可直接运行
1 | from keras.layers import * |
其中MinimalRNNCell继承Layer类,是一个实现的Cell,按照官网的说法,call函数是必须实现的,也就是\(\mathcal{F}\) 真正做的事情,其中输入输出分别是 (input_at_t, states_at_t)
和 (output_at_t, states_at_t_plus_1)
。state_size
和output_size
也必须指明,在实现时units
通常代表output_size
。build函数在这里不是必须的,它本来是Layer类的函数,在这里override了。
封装Cell类
除了可以自定义之外,keras也提供了已经封装好了的Cell类,比如:ConvLSTM2DCell,SimpleRNNCell,GRUCell,LSTMCell。这些类的参数就不再显示在这里了,因为他们跟自己对应的Layer的参数一摸一样,举一个例子,如下所示。
1 | # 先是卷积LSTM的层的声明 |
既然参数一样,为什么还要制作两个接口呢?其实在使用cell创建RNN层时,可以一次传入多个cell,这样的Layer叫stacked RNN
,比如:
1 | cells = [MinimalRNNCell(32), MinimalRNNCell(64)] |
而通常封装的API都是一个Cell的。因此,分别给出来有一定的意义。
最后
在循环神经网络部分,总共有三种神经网络,分别是RNN,GRU,LSTM,这些都用来处理时间序列的数据。除此之外还有在gpu下使用的版本,在keras中的名字就是CuDNN**。