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
相关产品推荐
相关产品推荐

