我正在建立一个堆叠多个LSTM的动态RNN网络。我看到有2个选项
# 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)
两种方法之间有什么区别,哪一种比另一种更好?
答案 0 :(得分:18)
如果您希望有多个层可以及时向后或向前传递信息,有两种方法可以设计。假设前向层由两层F1,F2组成,后一层由两层B1,B2组成。
如果使用tf.nn.bidirectional_dynamic_rnn
,模型将如下所示(时间从左向右流动):
如果您使用tf.contrib.rnn.stack_bidirectional_dynamic_rnn
,模型将如下所示:
这里,第一层和第二层之间的黑点表示连续。即,前向和后向单元的输出被连接在一起并被馈送到下一个上层的后向和前向层。这意味着F2和B2都接收完全相同的输入,并且后向和前向层之间存在明确的连接。在"Speech Recognition with Deep Recurrent Neural Networks"格雷夫斯等人。总结如下:
...每个隐藏层都接收来自两者的输入 在下面的层面上的前向和后向层。
此连接仅在未堆叠的BiRNN(第一个图像)中隐式发生,即在映射回输出时。堆叠的BiRNN通常表现得更好,但我猜这取决于你的问题设置。但肯定值得尝试一下!
修改强>
回应您的评论:我的答案基于函数tf.contrib.rnn.stack_bidirectional_dynamic_rnn
的文档,其中说明了:
堆叠多个双向rnn层。结合前锋和 后向层输出用作下一层的输入。 tf.bidirectional_rnn不允许向前和向后共享 层之间的信息。
另外,我查看了this link下的可用实现。