Допустим, у меня есть 2500 временных рядов класса A, каждый из которых имеет 17 временных шагов:
Time series a_1: [0, 1, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 1, 2, 3, 4]
Time series a_2: [10,11,12,13,12,11,10,11,12,13,12,11,10,11,12,13,14]
...
Times series a_2500: [3,5,7,5,3,5,7,5,3,5,7,5,3...]
И у меня есть 2500 временных рядов класса B, снова 17 временных шагов:
Time series b_1: [3, 6, 3, 4, 5, 6, 7, 1, 4, 5, 4, 1, 5, 6, 7, 4, 1]
Time series b_2: [12,41,54,64,12,53,12,12,43,21,32,1, 32,31,53,12,1]
...
Time series b_2500: [some more random numbers]
Существует только одна числовая функция для каждого временного ряда, число сверху.Я хочу обучить LSTM, используя Keras, чтобы классифицировать временные ряды в один из двух классов.Они должны быть легко различимы с помощью функций, которые требуют от LSTM понимания корреляции времени между данными, у класса A сезонный характер, а у B - нет.
Моя проблема в том, что разницамежду статическим и полнофункциональным LSTM и как построить input_dimension для сети LSTM.Насколько я понимаю, вход для LSTM определен как (batch_size, time steps, features)
.Я попытаюсь представить два варианта моделирования этой проблемы, один из которых, как я полагаю, будет «без сохранения состояния», а другой - «с полным состоянием».Если да, какой из них предпочтительнее?А если нет, то какими будут два решения?
Вариант 1 - решение без состояния
Мой X теперь (batch_size,17,1)
.Это означает, что одна партия содержит несколько временных рядов.
X будет в этом примере:
[
[[0], [1], [2], [3], [4], [3], [2], ..., [4]] # <- this here is time series a_1
[[3], [6], [3], [4], [5], [6], [7], ..., [1]] # <- this here is time series b_1
[[10], [11], [12], [13], ..., .[14]] # <- this here is time series a_2
... # <- continue for all time series for one batch
]
Теперь я могу использовать значение batch_size, равное 32, и обучать мой LSTM, используя разные временные ряды ввремя, и, предсказывая, я могу просто показать ему пакет из одного временного ряда и получить вывод?
Вариант 2 - решение с состоянием
Или мне показатьвременной ряд каждый шаг за раз, так что мой ввод (1,1,1)
, и я просто показываю его тогда для каждого временного ряда 17 раз за каждый временной шаг одной функции?Затем я бы после вызова одного временного ряда вызвал метод model.reset_states (), чтобы забыть все о новом временном ряду?
Поэтому я использую X [[[0]]]
(первый шаг по времени от a_1)), подгоните модель, покажите ее [[[1]]]
(второй шаг по времени от a_1
), подгоните модель и т. д. Если я достигну последнего временного шага в a_1
, я вызываю model.reset_state () и могу продолжить всевременные шаги от b_1
?
И для решения с сохранением состояния мне нужно использовать размер пакета 1, потому что, если бы я тренировал его с несколькими временными рядами одновременно, мне всегда приходилось бы позволять ему классифицировать несколько разСерии одновременно во время прогнозирования, поэтому я не могу использовать другой размер партии во время обучения и тестирования?