堆叠 LSTM 网络中每个 LSTM 层的输入是什么?

Lio*_*hon 2 stacked deep-learning lstm recurrent-neural-network

我在理解堆叠 LSTM 网络中层的输入-输出流时遇到了一些困难。假设我创建了一个堆叠的 LSTM 网络,如下所示:

# parameters
time_steps = 10
features = 2
input_shape = [time_steps, features]
batch_size = 32

# model
model = Sequential()
model.add(LSTM(64, input_shape=input_shape,  return_sequences=True))
model.add(LSTM(32,input_shape=input_shape))
Run Code Online (Sandbox Code Playgroud)

我们的堆叠 LSTM 网络由 2 个 LSTM 层组成,分别具有 64 个和 32 个隐藏单元。在这种情况下,我们希望在每个时间步长中,第 1 个 LSTM 层 -LSTM(64)- 将作为输入传递给第 2 个 LSTM 层 -LSTM(32)- 一个大小为 的向量[batch_size, time-step, hidden_unit_length],它表示隐藏状态当前时间步长的第 1 个 LSTM 层。让我困惑的是:

  1. 第二个 LSTM 层 -LSTM(32)- 是否接收X(t)(作为输入)第一层的隐藏状态 -LSTM(64)- 具有大小[batch_size, time-step, hidden_unit_length]并通过它自己的隐藏网络 - 在这种情况下由 32 个节点组成-?
  2. 如果第一个是真的,为什么input_shape第一个 -LSTM(64)- 和第二个 -LSTM(32)- 是一样的,当第二个只处理第一层的隐藏状态时?在我们的情况下不应该input_shape设置为[32, 10, 64]

我发现下面的 LSTM 可视化非常有用(在这里找到),但它没有扩展到 stack-lstm 网络: LSTM 工作原理

任何帮助将不胜感激。谢谢!

muj*_*iga 5

input_shape仅需要用于第一层。后续层将前一层的输出作为其输入(因此它们的input_shape参数值被忽略)

下面的模型

model = Sequential()
model.add(LSTM(64, return_sequences=True, input_shape=(5, 2)))
model.add(LSTM(32))
Run Code Online (Sandbox Code Playgroud)

代表以下架构

在此处输入图片说明

您可以从中验证它 model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_26 (LSTM)               (None, 5, 64)             17152     
_________________________________________________________________
lstm_27 (LSTM)               (None, 32)                12416     
=================================================================
Run Code Online (Sandbox Code Playgroud)

更换线路

model.add(LSTM(32))
Run Code Online (Sandbox Code Playgroud)

model.add(LSTM(32, input_shape=(1000000, 200000)))
Run Code Online (Sandbox Code Playgroud)

仍然会为您提供相同的架构(验证使用model.summary()),因为它input_shape被忽略,因为它将前一层的张量输出作为输入。

如果你需要一个序列来对架构进行排序,如下所示

在此处输入图片说明

您应该使用以下代码:

model = Sequential()
model.add(LSTM(64, return_sequences=True, input_shape=(5, 2)))
model.add(LSTM(32, return_sequences=True))
Run Code Online (Sandbox Code Playgroud)

这应该返回一个模型

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_32 (LSTM)               (None, 5, 64)             17152     
_________________________________________________________________
lstm_33 (LSTM)               (None, 5, 32)             12416     
=================================================================
Run Code Online (Sandbox Code Playgroud)