如何在keras中堆叠多个lstm?

Posted

技术标签:

【中文标题】如何在keras中堆叠多个lstm?【英文标题】:How to stack multiple lstm in keras? 【发布时间】:2017-03-12 21:45:09 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

如果此标志为 false,则 LSTM 仅返回最后一个输出 (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 层被添加以获取用户所需格式的输出。这里 Dense(10) 表示用于具有 10 个类别的分类任务的 one-hot 编码输出。它可以概括为有 'n' 个神经元用于具有 'n' 个类的分类任务。

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

【讨论】:

最后一个 Dense 层的大小与是否使用时间序列(序列数据)无关,输出层的大小取决于您想要的输出。对于预测模型,这可能确实只是一个标量,但对于分类,您显然希望输出一个 one-hot 向量,该向量等于用户为目标创建的 one-hot 向量的大小,或者在使用稀疏分类交叉熵时创建的张量流。 【参考方案2】:

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

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)

【讨论】:

【参考方案3】:

您需要将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”)

【讨论】:

在选择 lstm 中的神经元数量时有什么最佳做法吗?我正在尝试最大化模型性能! :) 我们是否也应该设置return_state= True?它的作用是什么? 在 LSTM 中,如果选择的神经元过多,则会过拟合,如果选择的神经元过少,则会欠拟合。正确的数字取决于数据中的模式和数据集的大小(可能还有许多其他因素)。从一些小的开始,也许在 32-128 范围内,以在调试期间保持快速的训练时间。然后测试更大的值,直到结果开始恶化。 非常感谢。从昨晚开始就一直在这个问题上。由于您的回答,终于解决了。 return_state 将 LSTM 层的整个状态返回到下一个。默认值为 False,我保持这种状态。我还没有找到将其设置为 True 的理由(而不是经常使用 return_sequence=True)

以上是关于如何在keras中堆叠多个lstm?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Keras LSTM 在多变量设置中对多个时间序列进行预测?

Keras中的LSTM

如何选择 LSTM Keras 参数?

如何在 keras 中拟合两个连接 LSTM 的模型?

堆叠 LSTM 网络如何工作?

如何在 Keras 中解释 LSTM 层中的权重 [关闭]