Модель прогнозирования временных рядов с LSTM в Tensorflow предсказывает постоянную - PullRequest
0 голосов
/ 31 января 2020

Я строю предсказатель следа урагана, используя спутниковые данные. В многослойной модели 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) Нет данных изображения, поэтому не требуется сверточная модель.

1 Ответ

1 голос
/ 31 января 2020

Несколько предложений, исходя из моего опыта:

  1. 4 слоя LSTM - это слишком много. Придерживайтесь двух, максимум трех.

  2. Не используйте relu в качестве активаций для LSTM.

  3. Не используйте BatchNormalization для временные ряды.

Кроме них, я бы также предложил удалить плотные слои между двумя слоями LSTM.

...