繁体   English   中英

被 TensorFlow 2 中的堆叠双向 RNN 困惑

[英]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。

在挖掘了RNNBidirectional类的 TensorFlow 源代码之后,我对堆叠双向 RNN 层的 output 格式的最佳猜测是以下 1+2n 元组,其中 n 是堆叠层数:

  • [0] 跨RNN的前向和后向state串联
  • [1: len//2 + 1] 前向层的最终state,从头到尾
  • [len//2 + 1:] 反向层的最终state,从头到尾

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM