【发布时间】:2018-05-15 18:06:33
【问题描述】:
按照类似的question,我遇到了一个问题,我需要在 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])
y1 和 y2 的维度与 y (500, 5) 相同。但我收到以下错误:
"Error when checking target: expected dense_4 to have 3 dimensions, but got array with shape (500, 5)".
我应该如何重塑y1 和y2?或者我应该为网络设置不同的结构?
【问题讨论】:
-
您使用
(7,3)作为输入形状,但与第一个示例不同,您没有使用 LSTM,如 documentation 中所述,它将输入张量的维度从3 到 2。要使此模型正常工作,您必须在输出层之前添加 LSTM(使用return_sequence=False)或展平层 -
我添加了一个扁平层:
flat = Flatten()(m) ; outputA = Dense(ahead,activation='linear')(flat) ; outputB = Dense(ahead,activation='linear')(flat)。现在它确实训练了,但是为什么现在网络的训练速度更快了? -
@gionni 这个网络:
inputs = Input(shape=(7,6)) d1 = Dropout(0.2)(inputs) m = Dense(50,activation='linear')(d1) d2 = Dropout(0.2)(m) flat = Flatten()(d2) outputA = Dense(ahead,activation='linear')(flat) outputB = Dense(ahead,activation='linear')(flat) m = Model(inputs=[inputs], outputs=[outputA, outputB]) m.compile(optimizer='adam', loss='mae')是否等同于我的第一个示例中的网络? -
关于第一条评论:它更快,因为你没有 LSTM 层,它训练起来很慢,而 Flatten 层只是对输入张量进行重塑。同样,对于第二条评论,它不会相同,因为您没有 LSTM 层。
-
谢谢。 LSTM 层可以有多个输出吗?我的意思是,我可以重复使用我的第一个网络吗? (抱歉,对 LSTM 来说是全新的)。
标签: time-series keras lstm multi-step multipleoutputs