【问题标题】:Multi-steps forecasting using Keras TimeSeries leads to loss NaN使用 Keras TimeSeries 进行多步预测导致损失 NaN
【发布时间】:2019-06-12 12:42:22
【问题描述】:

这是我的问题(我想这很笼统):

我有 4 个时间序列(x1、x2、x3、x4)并基于“d”历史数据
[(x_1 (t-d), x_2 (t-d), x_3 (t-d), x_4 (t-d),..., (x_1 (t-1), x_2 (t-1), x_3 (t-1), x_4 ( t-1)]
我想预测 [x_1 (t), x_1 (t+1)]

因此,在加载完整且没有任何 NaN 的数据后,我首先使用 Scikit-Learn MinMaxScaler (feature_range= (0, 1) 重新缩放它们。

然后,我将它们拆分为训练集和测试集,并使用 Keras TimeSeries 方法和 batch_size = 72

train_gen = TimeseriesGenerator(data_train, target_train,
                           start_index=1,
                           length=n_lags, sampling_rate=1,
                           batch_size=batch_size)

test_gen = TimeseriesGenerator(data_test, target_test,
                           start_index=1,
                           length=n_lags, sampling_rate=1,
                           batch_size=batch_size)

火车的形状(输入,目标)是
每批次训练 X、y 形状 (72, 10, 4) (72, 2)
测试也一样
每批次测试 X、y 形状 (72, 10, 4) (72, 2)

例如这里是第一批的第一个输入数据(train_gen[0][0][:3]):

array([[[0.28665611, 0.63705857, 0.32643516, 0.45493102],
        [0.26487018, 0.6301432 , 0.30965767, 0.45791034],
        [0.25228031, 0.61725465, 0.3161332 , 0.45023995],
        [0.24793654, 0.58854431, 0.32644507, 0.43765143],
        [0.25025404, 0.55537186, 0.33264606, 0.42989095],
        [0.25923045, 0.53953228, 0.32621582, 0.43297785],
        [0.27078601, 0.53333689, 0.31391997, 0.4531239 ],
        [0.28204362, 0.55253638, 0.30399583, 0.48110336],
        [0.2905511 , 0.59113979, 0.29693304, 0.50782682],
        [0.29877746, 0.65041821, 0.28764287, 0.53247815]],

       [[0.26487018, 0.6301432 , 0.30965767, 0.45791034],
        [0.25228031, 0.61725465, 0.3161332 , 0.45023995],
        [0.24793654, 0.58854431, 0.32644507, 0.43765143],
        [0.25025404, 0.55537186, 0.33264606, 0.42989095],
        [0.25923045, 0.53953228, 0.32621582, 0.43297785],
        [0.27078601, 0.53333689, 0.31391997, 0.4531239 ],
        [0.28204362, 0.55253638, 0.30399583, 0.48110336],
        [0.2905511 , 0.59113979, 0.29693304, 0.50782682],
        [0.29877746, 0.65041821, 0.28764287, 0.53247815],
        [0.30240836, 0.71207879, 0.34604287, 0.54785854]],

       [[0.25228031, 0.61725465, 0.3161332 , 0.45023995],
        [0.24793654, 0.58854431, 0.32644507, 0.43765143],
        [0.25025404, 0.55537186, 0.33264606, 0.42989095],
        [0.25923045, 0.53953228, 0.32621582, 0.43297785],
        [0.27078601, 0.53333689, 0.31391997, 0.4531239 ],
        [0.28204362, 0.55253638, 0.30399583, 0.48110336],
        [0.2905511 , 0.59113979, 0.29693304, 0.50782682],
        [0.29877746, 0.65041821, 0.28764287, 0.53247815],
        [0.30240836, 0.71207879, 0.34604287, 0.54785854],
        [0.30113961, 0.7603975 , 0.4250553 , 0.55976262]]])

以及对应的目标数组(train_gen[0][1][:3]):

array([[0.30240836, 0.30113961],
       [0.30113961, 0.30203943],
       [0.30203943, 0.31435152]])

现在我的模型使用 Keras 库非常简单

h = LSTM(50)(inputs)
output = Dense(2)(h)
model = Model(inputs,output)
model.compile(loss='mae', optimizer='adam')

当我开始训练时,问题就来了:

history = model.fit_generator(generator=train_gen,
                              epochs=50,
                              validation_data=test_gen,
                              shuffle=False)
Epoch 1/50
40/40 [==============================] - 5s 120ms/step - loss: nan - val_loss: nan
Epoch 2/50
40/40 [==============================] - 1s 37ms/step - loss: nan - val_loss: nan
Epoch 3/50
40/40 [==============================] - 2s 39ms/step - loss: nan - val_loss: nan

注意每个时期出现的“nan”(顺便说一句,在时期结束时)。

谁能给我一些关于如何找到问题的提示?我应该提一下,当输出(即目标)只是 (x1 (t) 时,学习是好的,训练损失和测试损失平滑收敛。

【问题讨论】:

    标签: keras time-series lstm


    【解决方案1】:

    事实上,我找到了问题的根源:这是因为在使用 TimeseriesGenerator 之前使用 data_train 之前,我必须使用以下代码来生成 {x1(t), x1(t+1 )} 目标

    target_train = np.transpose(np.stack((data_train[:,0],
                                      shift(data_train[:,0],-1,cval=np.NaN))))
    

    但是,最后一个条目是这样的 ([0.18358087, nan]) 所以损失的计算被最后一个条目破坏了。

    解决方法就是删除它。

    【讨论】:

      猜你喜欢
      • 2019-07-20
      • 1970-01-01
      • 2021-09-06
      • 2018-05-30
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      相关资源
      最近更新 更多