Ответ на ваш вопрос, к сожалению, нет.Форма ввода слоя LSTM в Keras должна быть (batch_size, timesteps, features)
.Четвертое измерение невозможно.
Однако, поскольку вы, похоже, следуете подходу со скользящими окнами, я могу вам сказать, что обычным способом является (число окон) в измерении пакета.В вашем случае это будет означать, что ваша входная форма станет (450 * #window, 1080, 3)
.
Тогда для прогноза вам придется использовать только последнее окно дня, вы не можете использовать весь день.
Обратите внимание, что это, как правило, одно огромное ограничение подхода со скользящим окном.Если для хорошего прогноза нужны данные за весь день, а не только одно окно этого дня, этот подход не сработает.
Вы все еще можете попробовать и поиграть с окнами разных размеров.Если это не сработает, я бы посоветовал вам отказаться от этого подхода и использовать данные одного дня напрямую, а не делить их сначала на окна.Итак, (450, #(data of a day), 3)
будет вашей входной формой.Это правильно, что вы слышали: вы можете иметь переменную длину на оси timestep
.Чтобы достичь этого, вы должны объявить input_shape=(None, 3)
на первом уровне.
Единственным недостатком этого является то, что вы не можете собрать все свои данные в один массив numpy, потому что numpy не работает с разными размерами.Другими словами, вместо одного массива фигуры (450, #(data of a day), 3)
вам потребуется 450 массивов фигуры (1, #(data of a day), 3)
, где #(data of a day)
может каждый раз отличаться.К сожалению, model.fit()
не может быть использован для этого, поскольку он ожидает, что обучающие данные будут одним единым массивом.Вместо этого вы можете использовать model.fit_generator
и передать ему генератор, который выдает один из этих 450 маленьких массивов при каждом вызове.Посмотрите на docs для примеров того, как использовать это.Обратите внимание, что ваша тренировка может замедлиться из-за batch_size=1
.
Если это окажется проблемой, слои LSTM в Keras поддерживают маскирование.Для этого просто используйте слой Masking
как самый первый в вашей модели и объявите одно значение (обычно 0.0
, но может быть любым числом) для маскировки.Затем вы можете создать входные тензоры формы (batch_size, #max_day_data, 3)
, где все дни, в которых данные меньше, чем #max_day_data
, должны быть дополнены справа до значения, которое будет маскироваться.
Для дальнейшего чтения я настоятельно рекомендую этот ответ на LSTM.Возможно, это вдохновит вас на различные подходы, которые вы можете попробовать.Особенно возможно использование stateful
в случае, если у вас слишком много данных за один день, которые не помещаются в вашей памяти.