Tensorflow 中 bidirectional_dynamic_rnn 和 stack_bidirectional_dynamic_rnn 的区别
Difference between bidirectional_dynamic_rnn and stack_bidirectional_dynamic_rnn in Tensorflow
我正在构建一个堆叠多个 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)
对比
output = tf.contrib.rnn.stack_bidirectional_dynamic_rnn(cells_fw, cells_bw, INPUT,
sequence_length=LENGTHS, dtype=tf.float32)
这两种方法有什么区别,一种比另一种更好?
如果你想要有多个层来及时向后或向前传递信息,有两种设计方法。假设前向层由两层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" Graves 等人中。总结如下:
... every hidden layer receives input from both the
forward and backward layers at the level below.
这种连接仅在未堆叠的 BiRNN(第一张图像)中隐式发生,即映射回输出时。堆叠的 BiRNN 通常对我的目的表现更好,但我想这取决于你的问题设置。但肯定值得一试!
编辑
回应您的评论:我的回答基于函数 tf.contrib.rnn.stack_bidirectional_dynamic_rnn
的文档,它说:
Stacks several bidirectional rnn layers. The combined forward and
backward layer outputs are used as input of the next layer.
tf.bidirectional_rnn does not allow to share forward and backward
information between layers.
此外,我查看了 this link 下可用的实现。
我正在构建一个堆叠多个 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)
对比
output = tf.contrib.rnn.stack_bidirectional_dynamic_rnn(cells_fw, cells_bw, INPUT,
sequence_length=LENGTHS, dtype=tf.float32)
这两种方法有什么区别,一种比另一种更好?
如果你想要有多个层来及时向后或向前传递信息,有两种设计方法。假设前向层由两层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" Graves 等人中。总结如下:
... every hidden layer receives input from both the forward and backward layers at the level below.
这种连接仅在未堆叠的 BiRNN(第一张图像)中隐式发生,即映射回输出时。堆叠的 BiRNN 通常对我的目的表现更好,但我想这取决于你的问题设置。但肯定值得一试!
编辑
回应您的评论:我的回答基于函数 tf.contrib.rnn.stack_bidirectional_dynamic_rnn
的文档,它说:
Stacks several bidirectional rnn layers. The combined forward and backward layer outputs are used as input of the next layer. tf.bidirectional_rnn does not allow to share forward and backward information between layers.
此外,我查看了 this link 下可用的实现。