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