如何在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?的主要内容,如果未能解决你的问题,请参考以下文章