多步进时间序列的多个输出使用Keras LSTM进行预测



在一个类似的问题之后,我有一个问题,我需要在3个不同的时间序列中预测许多步骤。我设法生成了一个将3个时间序列的7值作为输入的网络预测其中一个的5个未来值。输入x具有以下维度:

(500, 7, 3): 500 samples, 7 past time steps, 3 variables/time series) 

目标y具有以下维度:

(500, 5): 500 samples, 5 future time steps

LSTM网络定义为:

model = Sequential()
model.add(LSTM(input_dim=3, output_dim=10,  return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(50))
model.add(Dropout(0.2))
model.add(Dense(input_dim=10, output_dim=7))
model.add(Activation('linear'))
model.compile(loss='mae', optimizer='adam')

如果现在我想预测2个时间序列的值怎么办?

我尝试了以下代码:

inputs = Input(shape=(7,3)) # 7 past steps and variables
m = Dense(64,activation='linear')(inputs)
m = Dense(64,activation='linear')(m)
outputA = Dense(1,activation='linear')(m)
outputB = Dense(1,activation='linear')(m)
m = Model(inputs=[inputs], outputs=[outputA, outputB])
m.compile(optimizer='adam', loss='mae')
m.fit(x,[y1,y2])

y1y2都具有与y(500,5)相同的尺寸。但是我得到以下错误:

"Error when checking target: expected dense_4 to have 3 dimensions, but got array with shape (500, 5)".

我应该如何重塑y1y2?还是我应该有不同的网络结构?

遵循评论,我无法发布可读代码:

如果您想在2输出上训练网络,将架构保持在您发布的第二个网络中之一,但是使用LSTM,这应该有效:

from keras.layers import Input, Dense, Dropout, LSTM
inputs = Input(shape=(7,3)) # 7 past steps and variables
m = LSTM(10,  return_sequences=True)(inputs)
m = Dropout(0.2)(m)
m = LSTM(50)(m)
m = Dropout(0.2)(m)
outputA = Dense(5, activation='linear')(m)
outputB = Dense(5, activation='linear')(m)
m = Model(inputs=[inputs], outputs=[outputA, outputB])
m.compile(optimizer='adam', loss='mae')
m.fit(x,[y1,y2])

请注意,如果您预测的2个时间序列中的时间依赖关系相似,则此体系结构将提供良好的效果每次时间序列的结果的一种微调。另一个选择是使用2个网络,就像您提出的第一个网一样,但这将翻一番。

另一个选择是直接使LSTM输出多个值。基本想法是将您的第一个模型与return_sequence=True保持在第二个LSTM层中。这里的问题是,如果要将7个时间步长作为输入并仅获得5个输出,则需要将张量切在第一个LSTM层和输出层之间的某个位置,以便将输出时间段缩短为5。问题在于,Keras中没有实现的slice层。这是一个可以切片的自定义层。从理论上讲,我不确定这种体系结构是否有效。

最终注意:您可以不切片,而是可以转换层,使用密集来减少所需的维度,然后将其转换回原始尺寸,或类似地使用扁平 -> stranden->密集和重塑。这两个选项都将为您提供有效的体系结构(这意味着Keras都会编译和合适),但是在这两种情况下,您都会弄乱时间维度,这是不可建议的。

希望此帮助

相关内容

  • 没有找到相关文章

最新更新