Я пытаюсь реализовать многоступенчатую систему прогнозирования 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)
Как это исправить?
Согласно вашему комментарию:
[Данные] я имеют значения 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(...)
эквивалентны.
TimeDistributed
.?
48
временных шагов вy
, у вас есть только 1.TimeDistributed
. Как данные должны быть подготовлены.? данные, которые у меня есть, как t-48, t-47, t-46, ....., t-1 как прошлые данные и t + 1, t + 2, ......, t + 12 как значения, которые я хочу прогнозировать