Модель LSTM Mutli Step Forecast - PullRequest
       19

Модель LSTM Mutli Step Forecast

0 голосов
/ 19 сентября 2018

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

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)

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

1 Ответ

0 голосов
/ 19 сентября 2018

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

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

, вам может вообще не понадобиться использовать слой TimeDistributed:во-первых, просто удалите аргумент resturn_sequences=True слоя LSTM.После этого слой LSTM будет кодировать входные временные ряды прошлого в виде вектора (50,).Теперь вы можете передать его непосредственно в плотный слой с 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 перед плотным слоем (с добавлением слоя RepeatVector после первого слоя LSTM, чтобы сделать его выходной ряд временной длины 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(...)) и Dense(...) эквивалентны.

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