Возможно ли сделать модель LSTM с 4-х мерной формой данных? - PullRequest
0 голосов
/ 18 февраля 2019

Привет, волшебники.
У меня есть данные временных рядов, включая несколько дней.
Я пытаюсь предсказать оценку завтрашнего дня, которая находится в диапазоне от 0 до 100.
И я предполагаю, что эта оценка зависит от 3 независимых характеристик временных рядов.

Каждый день является единицей и имеет оценку, но каждая единица (день) имеет разную длину данных временного ряда.
Поскольку каждый день имеет много длины данных, я прокрутил окно, размер которого равен1080 и шаг 180 в каждый день.

Поэтому я попытался преобразовать его в (количество единиц (выборка), количество окон, размер окна, функции).
Наконец я получаю (450, #окно (не фиксированное), 1080, 3).

450 дней, каждый день имеет одинаковую длину окна (1080) и функции (3), но количество окон различается.
Я восхищен заполнением нулями, но слышал, что могу использовать динамический (?) LSTM с различной длиной ввода.

Проблема в том, что форма ввода Keras LSTM должна быть 3-х мерной.
Так что я запутался, как мне следует подогнать эту форму к модели LSTM.
Моя цель состоит в том, чтобы, когда я добавляю новый день, форма которого (# окна, 1080, 3) в модель LSTM, я хочу, чтобы онапредсказать оценку.

Не могли бы вы дать мне какие-либо предложения или советы?Спасибо.

1 Ответ

0 голосов
/ 18 февраля 2019

Ответ на ваш вопрос, к сожалению, нет.Форма ввода слоя 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 в случае, если у вас слишком много данных за один день, которые не помещаются в вашей памяти.

...