Neural network 在keras中实现用于时间序列预测的MLP模型,但该模型不';我不能很好地训练

Neural network 在keras中实现用于时间序列预测的MLP模型,但该模型不';我不能很好地训练,neural-network,keras,deep-learning,Neural Network,Keras,Deep Learning,我正试图提出一个时间序列预测的MLP模型。我有138个时间序列,回望窗口=28(分成50127个时间序列用于培训,24255个时间序列用于验证)。我需要预测下一个值(timesteps=28,n_features=1)。我从一个三层网络开始,但训练不好。我试图通过增加更多的层次/更多的匈奴人来加深网络,但没有改善。在图中,您可以看到以下模型的预测结果,这是我的模型代码: inp = Input(batch_shape=(batch_size, lookback_window))

我正试图提出一个时间序列预测的MLP模型。我有138个时间序列,回望窗口=28(分成50127个时间序列用于培训,24255个时间序列用于验证)。我需要预测下一个值(timesteps=28,n_features=1)。我从一个三层网络开始,但训练不好。我试图通过增加更多的层次/更多的匈奴人来加深网络,但没有改善。在图中,您可以看到以下模型的预测结果,这是我的模型代码:

    inp = Input(batch_shape=(batch_size, lookback_window))
    first_layer = Dense(1000, input_dim=28, activation='relu')(inp)
    snd_layer = Dense(500)(first_layer)
    thirs_layer = Dense(250)(snd_layer)
    tmp = Dense(100)(thirs_layer)
    tmp2 = Dense(50)(tmp)
    tmp3 = Dense(25)(tmp2)
    out = Dense(1)(tmp3)
    model = Model(inp, out)
    model.compile(loss='mean_squared_error', optimizer='adam')
    history = model.fit(train_data, train_y,
                        epochs=1000,
                        batch_size=539,
                        validation_data=(validation_data, validation_y),
                        verbose=1,
                        shuffle=False)
我错过了什么?我怎样才能改进它


我注意到的主要问题是,在图层中没有使用非线性。我将使用relus作为隐藏层,线性层作为最终层,以防您希望值大于1/-1。如果你不想让它们成为可能,请使用tanh。通过增加数据,您的问题变得更加困难,因此您的主要线性模型严重拟合不足。

我通过以下更改获得了更好的结果:

  • 使用
    RMSprop
    代替Adam,使用
    lr=0.001
    ,如@TommasoPasini所述,将它们添加到所有致密层(最后一层除外)。它大大提高了结果

  • 纪元=3000而不是1000

但现在我认为它太过合适了。以下是结果图、验证图和列车损失图:


您是否以某种方式缩放或规范化了数据?这些预测在我看来似乎是合理的。你在这里期待什么?@sdcbr是的,我使用minMaxScale在-1和1之间缩放数据。图中显示了缩小后的值。我的直觉是,MLP不擅长捕捉长距离依赖关系(你有28个时间步长的窗口,对吗?),因此它没有利用所有这些数据。您是否尝试将回望窗口减少到3/4?如果你想保持窗口这么大,我建议你使用LSTM而不是MLP。我知道,目前有很多努力证明前馈网络在精度方面与LSTM相当,但速度要快得多(例如),只是再次尝试在所有密集层(最后一层除外)中添加“relu”。它稍微改善了预测结果,但仍然很差:(