You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow中堆叠双向LSTM层的输出顺序是怎样的?

Keras Bidirectional双向LSTM层输出顺序规则

序列输出规则

你设置了merge_mode = 'concat',因此第一个返回值sequences的每个时间步输出确实是前向LSTM对应时间步输出在前,反向LSTM对应时间步输出在后拼接而成,维度为(batch_size, 序列长度, 2 * enc_units)。

状态返回规则

当return_state=True时,Bidirectional层的状态返回遵循「所有前向层状态完全排在前面,所有反向层状态完全排在后面」的规则,不会按层交叉排列前后向状态:

  • 你的代码中用StackedRNNCells堆叠了3层LSTM(注意你描述里提到的2层和代码中range(3)的写法不一致),每个LSTM层有2个状态:隐状态h、细胞态c
  • 状态的实际返回顺序为:前向第一层h → 前向第一层c → 前向第二层h → 前向第二层c → 前向第三层h → 前向第三层c → 反向第一层h → 反向第一层c → 反向第二层h → 反向第二层c → 反向第三层h → 反向第三层c

代码修正

你当前写的解包方式(forward_h1, backward_h1), (forward_c1, backward_c1)...不符合实际输出顺序,3层结构的正确写法如下:

# 原代码小笔误修正:tf.keras.layer.Bidirectional 改为 tf.keras.layers.Bidirectional
self.lstm_layer = tf.keras.layers.Bidirectional(tf.keras.layers.RNN(tf.keras.layers.StackedRNNCells([tf.keras.layers.LSTMCell(self.enc_units,recurrent_initializer='glorot_uniform') for _ in range(3)]),
                                      return_sequences=True,
                                      return_state=True), merge_mode = 'concat')

# 正确解包写法
sequences, forward_h1, forward_c1, forward_h2, forward_c2, forward_h3, forward_c3, backward_h1, backward_c1, backward_h2, backward_c2, backward_h3, backward_c3 = self.lstm_layer(x, initial_state = hidden)

内容的提问来源于stack exchange,提问作者Alejandro Mendoza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:15:01