我正在建立一个具有多个LSTM叠加的动态RNN网络。我看到有两种选择
# cells_fw and cells_bw are list of cells eg LSTM cells
stacked_cell_fw = tf.contrib.rnn.MultiRNNCell(cells_fw)
stacked_cell_bw = tf.contrib.rnn.MultiRNNCell(cells_bw)
output = tf.nn.bidirectional_dynamic_rnn(
stacked_cell_fw, stacked_cell_bw, INPUT,
sequence_length=LENGTHS, dtype=tf.float32)vs
output = tf.contrib.rnn.stack_bidirectional_dynamic_rnn(cells_fw, cells_bw, INPUT,
sequence_length=LENGTHS, dtype=tf.float32)这两种方法有什么区别,其中一种比另一种更好?
发布于 2018-05-27 13:14:55
如果您希望有多个层向后或向前地传递信息,那么有两种设计方法。假设前一层由两层F1、F2和背字层组成-- B1、B2。
如果使用tf.nn.bidirectional_dynamic_rnn,模型将如下所示(时间从左到右):

如果使用tf.contrib.rnn.stack_bidirectional_dynamic_rnn,模型将如下所示:

在这里,第一层和第二层之间的黑点表示一个级联。即,前向和后向单元的输出连接在一起,并馈送到下一上层的后向和前向层。这意味着F2和B2都接收完全相同的输入,并且在后向和向前层之间有一个显式的连接。载于“深度递归神经网络语音识别” Graves等人。将此概述如下:
..。每个隐藏层在下面的水平接收来自前向和后向层的输入。
这种连接只在未堆叠的BiRNN (第一个映像)中隐式发生,即映射回输出时。就我的目的而言,堆叠的BiRNN通常表现得更好,但我想这取决于您的问题设置。但值得一试的是!
编辑
针对您的评论:我的回答是基于函数tf.contrib.rnn.stack_bidirectional_dynamic_rnn的文档,它说:
堆叠几个双向rnn层。将组合的前向和后向层输出用作下一层的输入。tf.bidirectional_rnn不允许在层间共享向前和向后的信息。
此外,我还查看了此链接下可用的实现。
https://stackoverflow.com/questions/49242266
复制相似问题