Я пытаюсь обернуть голову вокруг сохраняющих состояние LSTM в Керасе, поэтому я придумал следующий пример:
Я хотел бы предсказать последовательность Y (n) = X (n) + Y (n- 1).
Код для генерации данных:
samples = 1000000
X = np.random.randn(samples).reshape(1000, 100, 10, 1)
Y = np.zeros((1000, 100, 1))
for i in range(X.shape[0]):
for j in range(X[i].shape[0]):
y_it = (Y[i][j-1] if j>0 else 0)
Y[i][j] = y_it + np.sum(X[i][j])
В основном я генерирую 1000 выборок, каждая из которых содержит 100 временных рядов с 10 шагами и 1 функцией. Для каждого временного ряда у меня есть одно вычисленное значение (так, что оно много к одному).
Итак, вкратце:
X имеет форму 1000x100x10x1, а Y имеет форму 1000x100x1
Далее я делю данные на x_train, y_train
и x_test, y_test
для обучения и тестирования данных (первые 800 образцов идут на обучение, 200 для тестирования).
Я использую LSTM с отслеживанием состояния, так как сеть должна отслеживать состояние между сериями:
x_in = Input(batch_shape=[100, 10, 1])
lstm = LSTM(40, return_sequences=False, stateful=True)
dense = Dense(1)
model = keras.Model(inputs=x_in, outputs=dense(lstm(x_in)))
model.summary()
model.compile(optimizer=keras.optimizers.RMSprop(), loss='mean_squared_error', metrics=['mse'])
И мой метод обучения выглядит следующим образом:
for _ in range(100):
for i in range(x_train.shape[0]):
model.reset_states()
model.fit(x_train[i], y_train[i], epochs=1, verbose=0, batch_size=100)
Проблема в том, что результаты не очень хорошо соответствуют тестовым данным. MSE довольно большой, и вот три случайных графика, где зеленый цвет представляет прогноз и данные синего теста:
Я думал, что поддержания внутреннего состояния будет достаточно для передачи информации о результатах предыдущих шагов, но, похоже, он не работает должным образом. Я что-то упустил фундаментальное?