1 前言
话说上回说到了RNNCell的基本实现,本来按照道理来说,应该介绍LSTM GRU的,但是奈何这些于我而言也是不太熟悉(然后我又悲伤的想到了那个电话,哎),所以不如先说说RNN网络的实现吧,毕竟之前熟悉的是基本的RNNCell,现在再熟悉下RNN的具体实现,那不正好可以完整的学习一个基本版的RNN么?
Tensorflow RNN源代码解析笔记1:RNNCell的基本实现
2 基本说明
Tensorflow提供了一个最基本 的rnn网络实现,具体位置是tf.nn.rnn当中。对了,这里说到的RNN网络都需要设定具体的Cell类型(也就是之前那篇文章里的RNNCell),关于RNNCell具体如何工作这里就不说了,这里主要从网络结构上来看。
那么我们首先看下定义这个基本rnn网络的一些参数:
def rnn(cell, inputs, initial_state=None, dtype=None,
sequence_length=None, scope=None):
这个RNN网络呢,是一个最基本的RNN网络,简单到什么地步呢,基本就是如下几行代码的高上大版,这个rnn所实现的核心功能就是下面这几行代码所实现的,仅仅是增加了一些更多的配置的支持而已:
```python
state = cell.zero_state(...)
outputs = []
for input_ in inputs:
output, state = cell(input_, state)
outputs.append(output)
return (outputs, state)
```
假设我们输入的序列的长度(时间)为T,那么以此使用Cell运算T次,每次的输出加入到outputs中,并且保留当前的最终state。
这里有两个必选参数和四个可选参数:
cell: 需要为RNN网络提供一个具体的Cell实例(不加修饰的RNNCell或LSTM或GRU或你自己实现的)
inputs:这个就是这个rnn网络的输入了,长度为T的一个List,List的位置表示时间(也就是时间从0到T-1),每个Tensor的形状是[batch_size,input_size],batch_size是你训练的时候,每一个batch的大小,而input_size则是输入元素的维度,这里的两个值要和上面cell里的参数对应。
上面两个参数是必选的,下面几个是可选的:
initial_state:我们知道RNN在运行之初,是需要提前设定一个隐层的状态的,设定就是在这里,一般来说他可以有默认全0的设置。特别注意的是,这里的形状要和cell的结构符合。
dtype:数据类型ÿ