有状态LSTM的迭代时间序列的回归预测

时间:2020-04-21 19:49:38

标签: python-3.x keras lstm-stateful

我试图围绕Keras中的有状态LSTM进行研究,所以我想到了以下示例:

我想对序列Y(n)= X(n)+ Y(n-1)进行预测。

用于生成数据的代码为:

samples = 1000000
X = np.random.randn(samples).reshape(1000, 100, 10, 1)
Y = np.zeros((1000, 100, 1))
for i in range(X.shape[0]):
    for j in range(X[i].shape[0]):
        y_it = (Y[i][j-1] if j>0 else 0)
        Y[i][j] = y_it + np.sum(X[i][j])

基本上,我正在生成1000个样本,每个样本包含100个具有10个步骤和1个特征的时间序列。对于每个时间序列,我都有一个计算值(所以它是多对一的)。

所以简而言之:

X的形状为1000x100x10x1,Y的形状为1000x100x1

我进一步将数据分为x_train, y_trainx_test, y_test进行训练和数据测试(前800个样本进行训练,200个用于测试)。

我使用的是有状态LSTM,因为网络需要跟踪系列之间的状态:

x_in = Input(batch_shape=[100, 10, 1])
lstm = LSTM(40, return_sequences=False, stateful=True)
dense = Dense(1)
model = keras.Model(inputs=x_in, outputs=dense(lstm(x_in)))
model.summary()
model.compile(optimizer=keras.optimizers.RMSprop(), loss='mean_squared_error', metrics=['mse'])

我的训练方法如下:

for _ in range(100):
    for i in range(x_train.shape[0]):
        model.reset_states()
        model.fit(x_train[i], y_train[i], epochs=1, verbose=0, batch_size=100)

问题是结果与测试数据不太吻合。 MSE很大,这是三个随机图,其中绿色代表预测和蓝色测试数据: enter image description here

enter image description here enter image description here

我当时认为保持内部状态足以传递有关先前步骤结果的信息,但似乎效果不佳。我缺少基本的东西吗?

0 个答案:

没有答案