Модель LSTM Mutli Step Forecast

1

Я пытаюсь реализовать многоступенчатую систему прогнозирования LSTM в Keras. Форма данных выглядит так:

X : (5831, 48, 1)
y : (5831, 1, 12)

Модель, которую я пытаюсь использовать, такова:

power_in = Input(shape=(X.shape[1], X.shape[2]))


power_lstm = LSTM(50, recurrent_dropout=0.4128,
                  dropout=0.412563, kernel_initializer=power_lstm_init, return_sequences=True)(power_in)

main_out = TimeDistributed(Dense(12, kernel_initializer=power_lstm_init))(power_lstm)

При попытке обучить модель следующим образом:

hist = forecaster.fit([X], y, epochs=325, batch_size=16, validation_data=([X_valid], y_valid), verbose=1, shuffle=False)

Я получаю следующую ошибку:

ValueError: Error when checking target: expected time_distributed_16 to have shape (48, 12) but got array with shape (1, 12)

Как это исправить?

  • 0
    Вы должны предоставить 48 временных шагов в y , у вас есть только 1.
  • 0
    да уж. Я не много работал с TimeDistributed . Как данные должны быть подготовлены.? данные, которые у меня есть, как t-48, t-47, t-46, ....., t-1 как прошлые данные и t + 1, t + 2, ......, t + 12 как значения, которые я хочу прогнозировать
Теги:
machine-learning
keras
lstm
time-series

1 ответ

1
Лучший ответ

Согласно вашему комментарию:

[Данные] я имеют значения t-48, t-47, t-46,....., t-1 как прошлые данные и t + 1, t + 2,......, t +12 как значения, которые я хочу прогнозировать

вам может не понадобиться использовать слой TimeDistributed вообще: сначала удалите аргумент resturn_sequences=True для слоя LSTM. После этого уровень LSTM будет кодировать входные временные интервалы прошлого в векторе формы (50,). Теперь вы можете подать его прямо на слой Dense с 12 единицами:

# make sure the labels have are in shape (num_samples, 12)
y = np.reshape(y, (-1, 12))

power_in = Input(shape=(X.shape[1:],))
power_lstm = LSTM(50, recurrent_dropout=0.4128,
                  dropout=0.412563,
                  kernel_initializer=power_lstm_init)(power_in)

main_out = Dense(12, kernel_initializer=power_lstm_init)(power_lstm)

В качестве альтернативы, если вы хотите использовать слой TimeDistributed и считаете, что вывод является самой последовательностью, мы можем явно задействовать эту временную зависимость в нашей модели, используя другой слой LSTM перед слоем Dense (с добавлением слоя RepeatVector после первый слой LSTM, чтобы сделать свой вывод timseries длиной 12, то есть такой же, как длина выходных временных рядов):

# make sure the labels have are in shape (num_samples, 12, 1)
y = np.reshape(y, (-1, 12, 1))

power_in = Input(shape=(48,1))
power_lstm = LSTM(50, recurrent_dropout=0.4128,
                  dropout=0.412563,
                  kernel_initializer=power_lstm_init)(power_in)

rep = RepeatVector(12)(power_lstm)
out_lstm = LSTM(32, return_sequences=True)(rep)
main_out = TimeDistributed(Dense(1))(out_lstm)

model = Model(power_in, main_out)
model.summary()

Резюме модели:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         (None, 48, 1)             0         
_________________________________________________________________
lstm_3 (LSTM)                (None, 50)                10400     
_________________________________________________________________
repeat_vector_2 (RepeatVecto (None, 12, 50)            0         
_________________________________________________________________
lstm_4 (LSTM)                (None, 12, 32)            10624     
_________________________________________________________________
time_distributed_1 (TimeDist (None, 12, 1)             33        
=================================================================
Total params: 21,057
Trainable params: 21,057
Non-trainable params: 0
_________________________________________________________________

Конечно, в обеих моделях вам может понадобиться настроить гиперпараметры (например, количество слоев LSTM, размер слоев LSTM и т.д.), Чтобы иметь возможность точно сравнивать их и достигать хороших результатов.


Замечание: на самом деле, по вашему сценарию, вам не нужно использовать слой TimeDistributed вообще, потому что (TimeDistributed) слой Dense применяется на последней оси. Поэтому TimeDistributed(Dense(...)) и Dense(...) эквивалентны.

  • 0
    Отличный ответ. Можете ли вы объяснить, как я могу расширить это решение для разных серий?
  • 0
    Я пытаюсь предсказать следующие 12 временных шагов серии, заданной за последние 48 временных шагов. Я не должен идти с TimeDistributed .?
Показать ещё 16 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню