具有不同序列长度的多对多序列预测
Many to many sequence prediction with different sequence length
我的问题是使用 Keras 的 LSTM 层在给定先前时间步 (t_{-n_pre}, t_{-n_pre+1} ... t_{-1})
的情况下预测一系列值 (t_0, t_1, ... t_{n_post-1})
。
Keras 很好地支持以下两种情况:
n_post == 1
(多对一预测)
n_post == n_pre
(多对多
预测具有相同的序列长度)
但不是 n_post < n_pre
.
的版本
为了说明我的需要,我使用正弦波构建了一个简单的玩具示例。
多对一模型预测
使用以下模型:
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=False))
model.add(Dense(1))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
预测如下:
多对多模型预测 n_pre == n_post
网络学会用 n_pre == n_post 很好地拟合正弦波,模型如下:
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
多对多模型预测 n_post < n_pre
但是现在,假设我的数据如下所示:
dataX 或输入:(nb_samples, nb_timesteps, nb_features) -> (1000, 50, 1)
dataY 或输出:(nb_samples, nb_timesteps, nb_features) -> (1000, 10, 1)
经过一些研究,我找到了一种在 Keras 中处理这些输入大小的方法,使用的模型如下:
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=False))
model.add(RepeatVector(10))
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
但是预测真的很糟糕:
现在我的问题是:
- 我如何使用
n_post < n_pre
构建一个不会丢失信息的模型,因为它有一个 return_sequences=False
?
- 使用
n_post == n_pre
然后裁剪输出(训练后)对我不起作用,因为它仍然会尝试适应很多时间步长,而神经网络只能预测前几个时间步长(其他的没有很好的相关性并且会扭曲结果)
在 Keras Github 页面上问了这个问题后,我得到了答案,我 post 在这里是为了完整性。
解决方案是使用第二个 LSTM 层,在使用 RepeatVector
将输出整形为所需的输出步数后。
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=False))
model.add(RepeatVector(10))
model.add(LSTM(output_dim=hidden_neurons, return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
预测现在看起来好多了,看起来像这样:
我的问题是使用 Keras 的 LSTM 层在给定先前时间步 (t_{-n_pre}, t_{-n_pre+1} ... t_{-1})
的情况下预测一系列值 (t_0, t_1, ... t_{n_post-1})
。
Keras 很好地支持以下两种情况:
n_post == 1
(多对一预测)n_post == n_pre
(多对多 预测具有相同的序列长度)
但不是 n_post < n_pre
.
为了说明我的需要,我使用正弦波构建了一个简单的玩具示例。
多对一模型预测
使用以下模型:
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=False))
model.add(Dense(1))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
预测如下:
多对多模型预测 n_pre == n_post
网络学会用 n_pre == n_post 很好地拟合正弦波,模型如下:
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
多对多模型预测 n_post < n_pre
但是现在,假设我的数据如下所示:
dataX 或输入:(nb_samples, nb_timesteps, nb_features) -> (1000, 50, 1)
dataY 或输出:(nb_samples, nb_timesteps, nb_features) -> (1000, 10, 1)
经过一些研究,我找到了一种在 Keras 中处理这些输入大小的方法,使用的模型如下:
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=False))
model.add(RepeatVector(10))
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
但是预测真的很糟糕:
现在我的问题是:
- 我如何使用
n_post < n_pre
构建一个不会丢失信息的模型,因为它有一个return_sequences=False
? - 使用
n_post == n_pre
然后裁剪输出(训练后)对我不起作用,因为它仍然会尝试适应很多时间步长,而神经网络只能预测前几个时间步长(其他的没有很好的相关性并且会扭曲结果)
在 Keras Github 页面上问了这个问题后,我得到了答案,我 post 在这里是为了完整性。
解决方案是使用第二个 LSTM 层,在使用 RepeatVector
将输出整形为所需的输出步数后。
model = Sequential()
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=False))
model.add(RepeatVector(10))
model.add(LSTM(output_dim=hidden_neurons, return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear'))
model.compile(loss='mean_squared_error', optimizer='rmsprop')
预测现在看起来好多了,看起来像这样: