[英]Puzzled by stacked bidirectional RNN in TensorFlow 2
我正在学习如何基于此 TensorFlow 2 NMT 教程构建 seq2seq model,并且我试图通过为编码器和解码器堆叠多个 RNN 层来扩展它。 但是,我无法检索与编码器的隐藏 state 对应的 output。
这是我在编码器中构建堆叠的双向GRUCell
层的代码:
# Encoder initializer
def __init__(self, n_layers, dropout, ...):
...
gru_cells = [layers.GRUCell(units,
recurrent_initializer='glorot_uniform',
dropout=dropout)
for _ in range(n_layers)]
self.gru = layers.Bidirectional(layers.RNN(gru_cells,
return_sequences=True,
return_state=True))
假设上面是正确的,然后我调用我创建的图层:
# Encoder call method
def call(self, inputs, state):
...
list_outputs = self.gru(inputs, initial_state=state)
print(len(list_outputs)) # test
当n_layers = 1
时, list_outputs
的长度为 3,这是根据此 SO post的预期行为。 当我将n_layers
增加 1 时,我发现输出的数量增加了 2,我认为这是新层的正向和反向最终状态。 所以2层-> 5个输出,3层-> 7个输出,等等。但是,我无法弄清楚哪个output对应于哪个层和哪个方向。
最终我想知道的是:如何在这个堆叠的双向 RNN 中获得最后一层的正向和反向最终状态? 如果我正确理解了 seq2seq model,它们构成了传递给解码器的隐藏 state。
在挖掘了RNN
和Bidirectional
类的 TensorFlow 源代码之后,我对堆叠双向 RNN 层的 output 格式的最佳猜测是以下 1+2n 元组,其中 n 是堆叠层数:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.