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