使用带有 keras 的 LSTM 进行多步超前预测的多输出

数据挖掘 Python 时间序列 喀拉斯 lstm
2021-09-27 16:37:32

我是深度学习和 LSTM(使用 keras)的新手。我正在尝试解决多步提前时间序列预测。我有 3 个时间序列:A、B 和 C,我想预测 C 的值。我正在训练一个 LSTM,反馈 3 个步骤的数据点来预测未来接下来的 3 个步骤。输入数据如下所示:

X = [[[A0, B0, C0],[A1, B1, C1],[A2, B2, C2]],[[ ...]]]

尺寸:(1000, 3, 3). 输出是:

y = [[C3, C4, C5],[C4, C5, C6],...]

尺寸:(1000, 3).

我正在使用一个带有 1 个隐藏层(50 个神经元)的简单 LSTM。我用 keras 设置了一个 LSTM:

n_features = 3
neurons = 50
ahead = 3
model = Sequential()
model.add(LSTM(input_dim=n_features, output_dim=neurons))
model.add(Dropout(.2))
model.add(Dense(input_dim=neurons, output_dim=ahead))
model.add(Activation('linear'))
model.compile(loss='mae', optimizer='adam')
model.fit(X, y, epochs=50)

这个模型工作正常。现在,我也想预测 B 的值(使用相同的输入)。因此,我尝试以与对具有多个特征的训练类似的方式重塑输出:

 y = [[[B3, C3],[B4, C4],[B5, C5]],[[ ...]]]

使其具有尺寸:(1000, 3, 2). 但是,这给了我一个错误:

Error when checking target: expected activation_5 to have 2 dimensions, 
but got array with shape (1000, 3, 2)

我猜网络的结构需要改变。我试图修改model.add(Dense(input_dim=neurons, output_dim=ahead))没有成功。我应该以y不同的方式重塑吗?网络结构错了吗?

1个回答
model = Sequential()
model.add(LSTM(input_dim=n_features, output_dim=neurons))
model.add(Dropout(.2))
model.add(Flatten())
model.add(Dense(ahead))
model.compile(loss='mae', optimizer='adam')
model.fit(X, y, epochs=50)

差异包括:

  • 我正在展平 LSTM 的输出,因为它会为这种场景提供一个 3D 张量和一个 Dense 层,我相信它会期望一个 2D 张量。
  • 对另一个答案中建议的更改进行了更改
  • 移除了激活层,因为Keras 密集层的默认激活是linear.