如何在keras中堆叠多个lstm?

How to stack multiple lstm in keras?

我正在使用深度学习库 keras 并尝试堆叠多个 LSTM,但没有成功。 下面是我的代码

model = Sequential()
model.add(LSTM(100,input_shape =(time_steps,vector_size)))
model.add(LSTM(100))

以上代码returns第三行错误Exception: Input 0 is incompatible with layer lstm_28: expected ndim=3, found ndim=2

输入 X 是一个形状为 (100,250,50) 的张量。我是 运行 tensorflow 后端的 keras

您需要将 return_sequences=True 添加到第一层,使其输出张量具有 ndim=3(即批量大小、时间步长、隐藏状态)。

请看下面的例子:

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

发件人:https://keras.io/getting-started/sequential-model-guide/(搜索 "stacked lstm")

对@DanielAdiwardana 的回答的详细解释。 我们需要为除最后一层之外的所有 LSTM 层添加 return_sequences=True

将此标志设置为 True 让 Keras 知道 LSTM 输出应该包含所有历史生成的输出以及时间戳 (3D)。因此,下一个 LSTM 层可以在数据上进一步工作

如果此标志为false,则LSTM仅returns最后输出(2D)。这样的输出对于另一个 LSTM 层来说不够好

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

注意::: 添加最后一个密集层以获取用户所需格式的输出。这里的 Dense(10) 表示分类任务的 one-hot 编码输出为 10 类。它可以概括为具有 'n' 个神经元用于 'n' 类.

的分类任务

如果您将 LSTM 用于 回归(或时间序列),那么您可能拥有 Dense(1)。这样只给出一个数字输出。

像这样的示例代码应该可以工作:

regressor = Sequential()

regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (33, 1)))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))

regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))

regressor.add(Dense(units = 1))

regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')

regressor.fit(X_train, y_train, epochs = 10, batch_size = 4096)