【问题标题】:Training LSTMs in Keras with time series of different length在 Keras 中使用不同长度的时间序列训练 LSTM
【发布时间】:2018-06-07 19:35:59
【问题描述】:

我是 Keras 的新手,想知道如何训练具有不同长度(中断)时间序列的 LTSM。例如,考虑一个从第 1 天到第 10 天的连续序列和从第 15 天到第 20 天的另一个连续序列。简单地将它们连接到一个序列可能会产生错误的结果。我看到基本上有两种选择可以使它们成形(batch_size, timesteps, output_features)

  1. 将较短的系列扩展为某个默认值 (0),即对于上面的示例,我们将有以下批次:

    d1, ..., d10
    d15, ..., d20, 0, 0, 0, 0, 0
    
  2. 计算长度的 GCD,将序列切成小块,并使用有状态的 LSTM,即:

    d1, ..., d5
    d6, ..., d10
    reset_state
    d15, ..., d20
    

还有其他/更好的解决方案吗?用完整序列训练无状态 LSTM 是否等同于用片段训练有状态 LSTM?

【问题讨论】:

    标签: machine-learning keras time-series lstm


    【解决方案1】:

    您是否尝试过为 LSTM 层提供不同长度的输入?当使用 LSTM 时,输入时间序列的长度可以不同(即使批次大小也可以从一个批次到另一个批次不同,但显然特征的维度应该是相同的)。这是 Keras 中的一个示例:

    from keras import models, layers
    
    n_feats = 32
    latent_dim = 64
    
    lstm_input = layers.Input(shape=(None, n_feats))
    lstm_output = layers.LSTM(latent_dim)(lstm_input)
    
    model = models.Model(lstm_input, lstm_output)
    model.summary()
    

    输出:

    Layer (type)                 Output Shape              Param #   
    =================================================================
    input_2 (InputLayer)         (None, None, 32)          0         
    _________________________________________________________________
    lstm_2 (LSTM)                (None, 64)                24832     
    =================================================================
    Total params: 24,832
    Trainable params: 24,832
    Non-trainable params: 0
    

    如您所见,输入层的第一和第二轴是None。这意味着它们不是预先指定的,可以是任何值。您可以将 LSTM 视为一个循环。无论输入长度如何,只要有相同长度的剩余数据向量(即n_feats),LSTM 层就会对其进行处理。因此,如上所示,LSTM 层中使用的参数数量不取决于批大小或时间序列长度(仅取决于输入特征向量的长度和 LSTM 的潜在维度)。

    import numpy as np
    
    # feed LSTM with: batch_size=10, timestamps=5
    model.predict(np.random.rand(10, 5, n_feats))   # This works
    
    # feed LSTM with: batch_size=5, timestamps=100
    model.predict(np.random.rand(5, 100, n_feats))  # This also works
    

    但是,根据您正在处理的具体问题,这可能不起作用;虽然我现在没有任何具体的例子表明这种行为可能不合适,但您应该确保所有时间序列的长度相同。

    【讨论】:

    • 非常感谢,我不知道这一点。就我而言,几乎所有时间序列都有不同的长度。所以我会简单地创建大小为 1 的批次并针对给定数量的 epoch 迭代训练它们?
    • 是的,这是一种方法(尽管正如我所提到的,根据您正在处理的问题,它可能不合适或不有意义)。正如您所提到的,另一种方法是考虑最大输入长度并使用整个训练数据中不存在的特殊值填充任何较短的序列。但是,最后,试验两者(或任何其他可能的方法)将是判断哪种方法最适合您的特定问题的最佳方式。
    • @user882903 第 1 部分) 此外,这已在 Keras github issuesData Science Stack Exchange 中讨论过。不要忘记一批中的序列应该具有相同的长度(因为它必须是张量),但它可以从一批到另一批有所不同。在极端情况下,您可以拥有batch_size=1,因此每个序列可以有不同的长度;
    • @user882903 第 2 部分) 但它可能不能很好地利用资源(即 GPU),因此会增加训练时间(同时考虑到梯度更新可能不是足够稳定,与小批量情况相比,收敛时间更长)。
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2019-05-10
    • 1970-01-01
    • 2018-01-08
    • 2019-11-25
    • 2018-01-30
    相关资源
    最近更新 更多