Любая дополнительная функция, которую вы вычисляете из входных данных, это просто еще одна функция, поэтому:
- Вы подаете его, как другую особенность серии,
input_shape=(50, 1+extra_features)
, и вам придется объединить его перед передачей в модель. Так что да, форма ввода теперь будет (9950, 50, 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.