keras 中的序列预测无法用于可变长度序列预测

数据挖掘 时间序列 喀拉斯 rnn 预报
2021-09-18 15:14:09

我正在使用 keras 对浮点类型的单变量时间序列进行多步提前时间序列预测。从我得到的结果来看,这种方法效果很好。然而,训练过程中有一个重要的细节让我感到困惑:

keras 要求输入序列(X 矩阵)的序列长度等于预测范围(y 矩阵)这意味着,例如,keras 需要长度为 20 的输入序列才能预测接下来的 20 个时间步长。在给定最后 20 个时间步长的情况下,我的目标是能够预测我指定的尽可能多的时间步长使用以下代码,这是不可能的:

    import numpy as np
    from keras.layers.core import Dense, Activation, Dropout, TimeDistributedDense
    from keras.layers.recurrent import LSTM
    from keras.models import Sequential
    from keras.optimizers import RMSprop
    np.random.seed(1234)


    model = Sequential()
    layers = [1, 20, 40, 1]

    model.add(LSTM(
        input_dim=layers[0],
        output_dim=layers[1],
        return_sequences=True))
    model.add(Dropout(0.3))

    model.add(LSTM(
        layers[2],
        return_sequences=True))
    model.add(Dropout(0.3))

    model.add(TimeDistributedDense(
        output_dim=layers[3]))
    model.add(Activation("linear"))

    rms = RMSprop(lr=0.001)
    model.compile(loss="mse", optimizer=rms)
    model.fit(
        X_train, y_train,
        batch_size=512, nb_epoch=100, validation_split=0.1)

每当 X_train 和 y_train 中序列的序列长度彼此不同时,我都会遇到尺寸错误。

我做错了什么,我该如何解决?为什么我的成绩还是不错的?

问题与有关。

1个回答

不,Vanilla LSTM 不可能。这不是 Kera 问题,而是 Vanilla LSTM 的基本结构。

我认为您对 LSTM 的工作原理有些误解。你假设给定x0...x19LSTM 正在预测x20...x39. 不是这种情况。在 LSTM 中,如果您的输入序列是x0...x19那么你的输出序列是x1...x20.

为了实现你想要的,你可以使用类似 Seq2Seq 模型。