Согласно вашему комментарию:
[Данные], которые у меня есть, похожи на 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(...)
эквивалентны.