6/8日整理
在TensorFlow中如何构建RNN网络。
在TensorFlow中定义了5个关于cell的类,具体定义为
定义好cell类之后,还需要将它们连接起来构成RNN网络。TensorFlow中有几种现成的构建网络模式,是封装好的函数,直接调用即可。
静态RNN构建。
TensorFlow中提供了一个构建静态RNN的函数static_rnn,定义如下:
def static_rnn(cell, inputs, initial_state=None, dtype=None, sequence_length=None, scope=None):
具体参数说明如下。
● cell:生成好的cell类对象。
● inputs:输入数据,一定是list或者二维张量,list的顺序就是时间序列。元素就是每一个序列的值。
● initial_state:初始化cell状态。
● dtype:期望输出和初始化state的类型。
● sequence_length:每一个输入的序列长度。
● scope:命名空间。
● 返回值有两个,一个是结果,一个是cell状态,我们只关注结果即可,结果也是一个list。输入是多少个时序,list里面就会输出多少个元素。
动态RNN构建。
关于动态RNN函数dynamic_rnn的定义如下:
def dynamic_rnn (cell, inputs, sequence_length=None, initial_state=None, dtype=None, parallel_iterations=None, swap_memory=False, time_major=False, scope=None):
具体参数说明如下。
● cell:生成好的cell类对象。
● inputs:输入数据,是一个张量,一般是三维张量,[batch_size, max_time, …]。其中batch_size表示一次的批次数量,max_time表示时间序列总数,后面是具体数据。
● initial_state:初始化cell状态。
● dtype:期望输出和初始化state的类型。
● sequence_length:每一个输入的序列长度。
●time_major:为默认值False时,input的shape为[batch_size, max_time, …]。如果是True, shape为[max_time, batch_size, …]。
● scope:命名空间。
● 返回值:一个是结果,一个是cell状态,结果是以[batch_size, max_time, …]形式的张量。
动态RNN存在很多容易出错的地方,尤其在输出部分,它是以批次优先的矩阵。因为我们需要取最后一个时序的输出,所以需要转置成时间优先的形式。
通过静态生成的RNN网络,生成过程所需要的时间会更长,网络所占的内存会更多,导出的模型会更大。模型中会带有每个序列中间态的信息,利于调试。通过动态生成的RNN网络,所占用的内存较少,导出的模型较小。模型中只会有最后的状诚。使用时支持不同的序列个数。