【问题标题】:Multilayered Bi-Directional Encoder for Seq2Seq in TensorflowTensorflow 中 Seq2Seq 的多层双向编码器
【发布时间】:2017-06-11 21:04:17
【问题描述】:

我正在尝试为 Seq2Seq 实现多层双向编码器。

我现在正在做的事情如下:

cell = tf.contrib.rnn.LSTMCell(num_size) 
cell = tf.nn.bidirectional_dynamic_rnn(cell_fw =encoder_cell, cell_bw =encoder_cell, .... )

这创建了一个双向 rnn,但如何使其多层化?

我想要实现的是遵循架构,其中每个 LSTM 块都是双向的,第 n 层编码器的输出进入第 n 层解码器。

我正在使用 Tensorflow 1.0 并使用 tf.contrib.seq2seq 库作为解码器。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    就这么简单:

    tf.contrib.rnn.MultiRNNCell([cell for _ in range(num_layers)])

    请注意,在这种情况下,一切都称为细胞(这是一个非常糟糕的命名),包括一个真正的单个神经单元、一个层和多个层。如 1.2 版 (https://github.com/tensorflow/tensorflow/releases) 的发行说明中所述,尽量避免创建多层的 * 操作(为了将来的兼容性)。

    【讨论】:

    • cell = tf.contrib.rnn.LSTMCell(num_size) cell = tf.contrib.rnn.MultiRNNCell([cell for _ in range(num_layers)]) 您是否建议在 bidirectional_dynamic_rnn 中使用此单元格功能 ? MultiRnnCell 只返回最后一层的输出。但是解码器需要每一层编码器的输出状态,对吧?如何实现?
    • MultiRNNCell 返回一个单元(层)列表,每个单元都具有与给定单元参数指定的相同的网络架构。您可以阅读我引用的发行说明了解详细信息。
    • 也适用于 TF 1.0 吗?我正在使用它
    • for 循环适用于所有版本,它会产生相同的结果。如果您使用 *,它可能以一种方式适用于 1.0,但在您将来升级 TensorFlow 时可能会产生不同的结果。
    • 我创建了一个 multiRNNCell 并在我的 bidirectional_dynamic_rnn 中使用了它。它返回所有层的 fw_states 和 bw_states,在连接后我传递给多层解码器 tf.contrib.rnn.dynamic_rnn_decoder 。但它标记了一个错误,它期望二维编码器状态,但由于我的编码器是多层的,它将返回所有层的编码器状态。
    猜你喜欢
    • 2018-11-21
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2018-06-04
    • 2019-01-25
    • 1970-01-01
    相关资源
    最近更新 更多