Извлечение функций для Timeseries LSTM - PullRequest
0 голосов
/ 04 июля 2018

Я хочу ввести временную серию в LSTM для выполнения прогноза. Допустим, у меня есть 10000 образцов. Теперь, чтобы вставить временные ряды в мой LSTM, я изменяю его (образцы, временные шаги, функции). В моем случае я использую временные шаги = 50, чтобы создать подпоследовательности и выполнить прогноз t + 1. В итоге я получаю x.shape=(9950,50,1). Пока все хорошо.

Моя модель

model= Sequential()
model.add(LSTM(50,return_sequences=True,input_shape=(50,1)))
model.add(Dense(out_dim, activation = 'sigmoid'))
model.compile(loss='mse', optimizer='adam')

СЕЙЧАС я хочу создавать искусственные элементы, например, Я хочу использовать БПФ сигнала в качестве функции. Как я могу кормить это в моем LSTM? Законно ли просто вычислить fft, добавить его в Dataframe и изменить все вместе, чтобы я получил (9950,50,2) ??

Вопросы в основном:

  1. Как вводить искусственные объекты в LSTM?
  2. То же самое для скользящей статистики или корреляционных функций?

Заранее спасибо

1 Ответ

0 голосов
/ 04 июля 2018

Любая дополнительная функция, которую вы вычисляете из входных данных, это просто еще одна функция, поэтому:

  1. Вы подаете его, как другую особенность серии, input_shape=(50, 1+extra_features), и вам придется объединить его перед передачей в модель. Так что да, форма ввода теперь будет (9950, 50, 2).
  2. Да, вы можете предварительно вычислить эту функцию, скажем, скользящее среднее, а затем объединить ее с исходным вводом.

Вы также можете написать пользовательские слои для вычисления этих функций в модели, но модель будет вычислять их каждый раз. Если вы вычисляете его априори, преимущество заключается в том, что вы можете сохранить / кэшировать его.

Если у вас есть функции не-временных рядов, теперь вам нужно перейти на функциональный API и иметь несколько входов: 1 - это временной ряд, а другой - нет:

series_in = Input(shape=(50, 2))
other_in = Input(shape(extra_features,)) # not a timeseries just a vector
# An example graph
lstm_out = LSTM(128)(series_in)
merged = concatenate([lstm_out, other_in])
out = Dense(out_dim, activation='sigmoid')(merged)
model = Model([series_in, other_in], out)
model.compile(...)

В этом случае у нас есть 2 входа для модели и мы можем использовать вспомогательные функции в любой точке. В этом примере я объединяюсь перед финальным плотным слоем, чтобы помочь предикации вместе с функциями временных рядов, извлеченными с помощью LSTM.

...