让我通过一个例子解释一下:
假设您有以下系列:1,2,3,4,5,6,…,100。您必须确定您的lstm将学习多少时间步长,并据此重塑数据。如下所示:
如果您决定time_steps = 5,则必须通过以下方式将时间序列重塑为样本矩阵:
1,2,3,4,5->样本1
2,3,4,5,6->样本2
3,4,5,6,7->样本3
等等…
这样,您将得到一个形状矩阵(96个样本x 5个时间步长)
该矩阵应重塑为(96 x 5 x
1),表示Keras您只有1个时间序列。如果您有更多并行的时间序列(如您的情况),则对每个时间序列执行相同的操作,因此将以每种形状(96个样本x
5个时间步长)的n个矩阵(每个时间序列一个)结束。
为了争辩,我们假设您有3个时间序列。您应该将所有三个矩阵合并为一个单一的张量形状(96个样本x 5 timeSteps x 3
timeSeries)。此示例的lstm的第一层是:
model = Sequential() model.add(LSTM(32, input_shape=(5, 3)))
32作为第一个参数完全由您决定。这意味着在每个时间点,您的3个时间序列将成为32个不同的变量作为输出空间。更容易将每个时间步骤视为具有3个输入和32个输出的完全连接的层,但计算方式与FC层不同。
如果要堆叠多个lstm层,请使用return_sequences = True参数,因此该层将输出整个预测序列,而不仅仅是最后一个值。
您的目标应该是您要预测的系列中的下一个值。
综上所述,假设您具有以下时间序列:
时间序列1(主):1、2、3、4、5、6,…,100
时间序列2(支持):2,4,6,8,10,12,…,200
时间序列3(支持):3,6,9,12,15,18,…,300
创建输入和目标张量
x -> y1,2,3,4,5-> 6
2,3,4,5,6-> 7
3,4,5,6,7-> 8
重新格式化其余的时间序列,但由于您不想预测那些序列,因此请忽略目标
建立模型
model = Sequential() model.add(LSTM(32, input_shape=(5, 3), return_sequences=True)) # Input is shape (5 timesteps x 3 timeseries), output is shape (5 timesteps x 32 variables) because return_sequences = True model.add(LSTM(8)) # output is shape (1 timesteps x 8 variables) because return_sequences = False model.add(Dense(1, activation='linear')) # output is (1 timestep x 1 output unit on dense layer). It is compare to target variable.
编译并训练。好的批处理大小是32。批处理大小是将样本矩阵拆分以加快计算速度的大小。只是不要使用statefull



