首页 文章

在Keras训练LSTM,时间序列不同

提问于
浏览
0

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

  • 将较短的系列延伸一些默认值(0),即对于上面的例子,我们将有以下批次:
d1, ..., d10
d15, ..., d20, 0, 0, 0, 0, 0
  • 计算长度的GCD,将系列切成碎片,并使用有状态的LSTM,即:
d1, ..., d5
d6, ..., d10
reset_state
d15, ..., d20

还有其他/更好的解决方案吗?正在训练一个没有状态的LSTM,其完整序列相当于训练有状态的LSTM吗?

1 回答

  • 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
    

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

相关问题