首页 文章

LSTM结果似乎又被转移了一段时间

提问于
浏览
1

使用LSTM和Keras,我构建了一个简单的时间序列预测模型,其工作方式如下:假设我拥有过去10个时间段内的数据(标准化并准备用于训练),模型预测前两个时间段的值 .

我的数据形状类似于:

X = [[[1,2,3,4,5,6,7,8,9,10],[2,3,4,5,6,7,8,9,10,11],[3] ,4,5,6,7,8,9,10,11,12]]]

Y = [[11,12],[12,13],[14,15]]

该模型由一个LSTM层组成,该层具有rnn_size个节点数以及一个丢失层 .

model = Sequential()

    model.add(LSTM(rnn_size,
    batch_input_shape=(batch_size, X.shape[1], 
    X.shape[2]),stateful=True,dropout=dropout))

    model.add(Dropout(dropout)) 
    model.add(Dense(y.shape[1]))
    adam_optimizer = keras.optimizers.Adam(clipvalue=5)
    model.compile(loss='mean_squared_error', optimizer=adam_optimizer)
    history = model.fit(X, y, batch_size=batch_size, epochs=nb_epoch, 
                    verbose=2, validation_split=0.1,shuffle=False)
    #################################    
    # Predict
    result = scaler.inverse_transform(
              model.predict_on_batch(test_values[start_date:end_date]
              .values.reshape(1, 1, -1)))

问题是时间段t 1的预测值 - 如图中所示 - 似乎在某种程度上与某个时间段t的值略有不同 .

这是(正常)行为吗?如果没有,我该如何克服它?

我想我对LSTM的工作方式有了比较好的理解,但是我无法解决这个问题 .

编辑1:

我编辑了代码以使用无状态网络配置并根据Daniel的建议编辑了形状 . 但问题仍然存在 . 奇怪的是,验证损失(MSE)总是低于训练损失 .

编辑2:

根据Marcin's请求添加的其余代码

actual value vs. predicted value for the test data set that was not shown to the model before

Validation Loss is less than Training Loss! ( small fluctuation is because of Dropout )

1 回答

  • 0

    要让LSMT理解序列,它必须具有像 (batch,timeSteps,featuresPerStep) 这样的输入形状

    所以, X.shape 必须是 (batch,10,1)

    [[[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]],
     [[2],[3],...........................,[11]],
     [........................................]]
    

    对于创建LSTM图层,您不要使用 stateful=True (如果第二个bach中的序列是第一批中序列的续集,则仅使用此选项) . 对于这个滑动窗口的情况,你不能一起修改序列 . 每个序列都是个体的 .

    LSTM(rnn_size,input_shape=(X.shape[1],X.shape[2]))
    

    这两个更改(X形状和有状态)可能会显着改变您的结果 .

相关问题