具有不同序列长度的多对多序列预测

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 < 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') 

但是预测真的很糟糕:

现在我的问题是:

在 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')  

预测现在看起来好多了,看起来像这样: