Многошаговое прогнозирование с использованием Keras TimeSeries приводит к потере NaN - PullRequest
0 голосов
/ 12 июня 2019

Здесь моя проблема (я думаю, она довольно общая):

У меня есть 4 раза ряд (x1, x2, x3, x4) и на основе исторических данных 'd'
[(x_1(td), x_2 (td), x_3 (td), x_4 (td), ..., (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-LearnMinMaxScaler (feature_range = (0, 1) для их изменения.

Затем я разделил их между наборами Train и Test и использую метод 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 library

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)), тогда обучение в порядке, и потери в поездах и тестовые потери плавно сходятся.

1 Ответ

0 голосов
/ 15 июня 2019

Фактически, я нашел источник моей проблемы: это связано с тем, что перед использованием TimeseriesGenerator, например, с использованием data_train, я должен использовать следующий код для получения {x1 (t), x1 (t + 1))} target

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

Но тогда последняя запись выглядит примерно так ([0.18358087, nan]), так что вычисление потерь сводится к нулю этой последней записью.

Решение - просто удалить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...