83

我正在使用深度学习库 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

4

3 回答 3

145

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

于 2016-10-31T04:27:16.873 回答
22

@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(10) 表示具有 10 个类别的分类任务的 one-hot 编码输出。它可以概括为具有“n”个神经元用于具有“n”个类别的分类任务。

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

于 2019-01-16T07:08:35.523 回答
0

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

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)
于 2020-09-07T11:11:59.443 回答