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

时间:2018-06-07 19:35:59

标签: machine-learning keras time-series lstm

我是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
    
  3. 还有其他/更好的解决方案吗?正在训练一个无状态LSTM,其完整序列相当于训练有状态的LSTM吗?

1 个答案:

答案 0 :(得分:2)

您是否尝试过输入不同长度的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

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