У меня есть модель lstm, которая предсказывает временные ряды.Перед распространением входных данных на скрытые слои объекты проходят через маскирующий слой, который маскирует наблюдения для строк, в которых все столбцы содержат значение 0. Все последовательности наблюдений имеют переменную длину, после чего дополняются, чтобы получить одинаковую длину, например.[1 2 3 4 0 0], [8 5 0 0 0 0]
Желая проверить мою метрику производительности во время проверки и тестирования, я перезаписываю данные обучения и предоставляю данные обучения в виде validation_data для модели.Точно так же я предоставляю данные обучения для model.predict ().Во время обучения ошибки валидации становятся очень низкими, как и должно быть.Однако после прогнозирования в тестировании и использования той же метрики производительности ошибка выше.Глядя на цель обучения данных и прогнозируемых значений.Я вижу странную картину.главным образом, что модель хорошо предсказывает исходную последовательность, кроме последней, но затем дополняет остальную часть последовательности определенным случайным числом.например, [0.8 2 3 -1.222 -1.222 -1.222] Мне кажется, что model.predict () плохо фиксирует количество заполнений нулями, что означает, что он начинает заполнять один раз слишком рано.В результате показатель эффективности значительно отличается от показателя валидации.
Есть ли разница между функцией прогнозирования, используемой во время проверки, и функцией прогнозирования после тренировки?Если есть разница.Можно ли вызвать функцию прогнозирования, используемую во время проверки?Кроме того, есть идеи, как это решить?Ниже приведен код сети и полный код и примеры данных, найденные здесь .
def network_structure(self):
"""
create a keras neural network
:return: an lstm keras model
"""
# keras requires a input layer
input_ = keras.layers.Input(
shape=(self.window_len, self.n_features)
)
# masking is to make sure the model doesn't fit the zero paddings
masking = keras.layers.Masking(mask_value=0.)(input_)
# hidden layer 1 with he_normal initializer. return sequence is to
# return the out of the layer in the same
# shape as the input layer
lstm_h1 = keras.layers.LSTM(self.hl1, dropout=self.dropout,
kernel_initializer='he_normal',
return_sequences=True)(masking)
# hidden layer 1
lstm_h2 = keras.layers.LSTM(self.hl2, dropout=self.dropout,
kernel_initializer='he_normal',
return_sequences=True)(lstm_h1)
# dense output layer of single output
cte = keras.layers.Dense(
1,
activation='linear',
name='CTE',
)(lstm_h2)
ate = keras.layers.Dense(
1,
activation='linear',
name='ATE',
)(lstm_h2)
pae = keras.layers.Dense(
1,
activation='linear',
name='PAE',
)(lstm_h2)
model = keras.models.Model(
inputs=input_,
outputs=[cte, ate, pae]
)
return model