Я строю предсказатель следа урагана, используя спутниковые данные. В многослойной модели LSTM у меня есть выходные данные, кратные множеству, с массивами ввода и вывода, соответствующими структуре [samples [time [features]]]. У меня есть в качестве особенностей входов и выходов координаты урагана, WS и других измерений.
Проблема в том, что уменьшение ошибок, и, как следствие, модель всегда предсказывает постоянную. Прочитав несколько постов, я стандартизировал данные, удалил некоторые ненужные слои, но, тем не менее, модель всегда предсказывает один и тот же результат.
Я думаю, что модель достаточно большая, функции активации имеют смысл, учитывая, что все выходы находятся в пределах [-1; 1]. Итак, мои вопросы: что я делаю не так?
Модель имеет следующий вид:
class Stacked_LSTM():
def __init__(self, training_inputs, training_outputs, n_steps_in, n_steps_out, n_features_in, n_features_out, metrics, optimizer, epochs):
self.training_inputs = training_inputs
self.training_outputs = training_outputs
self.epochs = epochs
self.n_steps_in = n_steps_in
self.n_steps_out = n_steps_out
self.n_features_in = n_features_in
self.n_features_out = n_features_out
self.metrics = metrics
self.optimizer = optimizer
self.stop = EarlyStopping(monitor='loss', min_delta=0.000000000001, patience=30)
self.model = Sequential()
self.model.add(LSTM(360, activation='tanh', return_sequences=True, input_shape=(self.n_steps_in, self.n_features_in,))) #, kernel_regularizer=regularizers.l2(0.001), not a good idea
self.model.add(layers.Dropout(0.1))
self.model.add(LSTM(360, activation='tanh'))
self.model.add(layers.Dropout(0.1))
self.model.add(Dense(self.n_features_out*self.n_steps_out))
self.model.add(Reshape((self.n_steps_out, self.n_features_out)))
self.model.compile(optimizer=self.optimizer, loss='mae', metrics=[metrics])
def fit(self):
return self.model.fit(self.training_inputs, self.training_outputs, callbacks=[self.stop], epochs=self.epochs)
def predict(self, input):
return self.model.predict(input)
Примечания 1) В этой конкретной задаче данные временного ряда не являются "непрерывными", поскольку один раз серв ie принадлежит определенному урагану. Поэтому я адаптировал тренировочные и тестовые образцы временных рядов к каждому урагану. Смысл этого в том, что я не могу использовать функцию stateful=True
в своих слоях, потому что тогда это будет означать, что модель не делает различий между различными ураганами (если мое понимание верно).
2) Нет данных изображения, поэтому не требуется сверточная модель.