【问题标题】:How to stack multiple lstm in keras?如何在keras中堆叠多个lstm?
【发布时间】: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

【问题讨论】:

    标签: tensorflow deep-learning keras lstm keras-layer


    【解决方案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)
      猜你喜欢
      • 2018-07-08
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-04-11
      • 2019-07-11
      • 2021-01-09
      • 2018-04-29
      相关资源
      最近更新 更多