Прогнозирование двумерного (позиционного) временного ряда в Керасе с использованием LSTM
Я пытаюсь использовать реализацию Keras LSTM для прогнозирования серии пар x, y в будущем. Пары x, y определяют местоположение в 2D плоскости. Я хотел бы предсказать им 60 шагов в будущее.
У меня есть 36 тыс. Пар данных, которые я разделил на 30 тыс. Для обучения и 5880 тыс. Для тестирования. Я подготовил тренировочные данные, создав трехмерный массив фигур (30000, 60, 2), где каждый элемент представляет собой фрагмент 60 обучающих данных, например, [[[x0, y0], [x1, y1], ... [x59, y59]], [x1, y1], [x2, y2], ... [x60, y60]], ... [x30000, y30000], [x30001, y30001], ... [x30059, y30059]]]. Целевые данные - это то же самое, только смещение на 60 элементов. Идея состоит в том, чтобы в основном использовать 60 пар для прогнозирования следующих 60 пар.
Я получаю следующую ошибку, указывающую, что модель ожидает, что целевые данные будут иметь только два измерения.
ValueError: Ошибка при проверке цели модели: ожидалось, что lstm_1 будет иметь 2 измерения, но получил массив с формой (30000, 60, 2)
Похоже, что модель опускает тот факт, что мои данные 2D. Очевидно, что я здесь что-то упускаю концептуально, но я не уверен, что это такое. Я был бы признателен, если бы кто-то мог поставить меня на правильный путь.
Вот мой код:
import numpy as np
from numpy import genfromtxt
from keras.models import Sequential
from keras.layers import Dense, LSTM, Activation, GRU, Dropout
TRAINING_SET_SIZE = 30000
epochs = 1
original_data = genfromtxt('training_data.txt', delimiter=',', dtype='int')
training_set = []
for i in range(len(original_data) - 120):
training_set.append(original_data[i:i+120])
training_set = np.array(training_set)
train_input = []
train_output = []
for i in range(TRAINING_SET_SIZE):
train_input.append(training_set[i][0:60])
train_output.append(training_set[i][60:120])
train_input = np.array(train_input)
train_output = np.array(train_output)
test_input = []
test_output = []
for i in range(TRAINING_SET_SIZE, len(original_data) - 120):
test_input.append(training_set[i][0:60])
test_output.append(training_set[i][60:120])
test_input = np.array(test_input)
test_output = np.array(test_output)
s = (train_input.shape[1], train_input.shape[2])
model = Sequential()
model.add(LSTM(60, input_shape=s, unroll=True))
model.compile(loss='mean_squared_error', optimizer='adam')
model.summary()
print("Inputs: {}".format(model.input_shape))
print("Outputs: {}".format(model.output_shape))
print("Actual input: {}".format(train_input.shape))
print("Actual output: {}".format(train_output.shape))
print('Training')
model.fit(train_input, train_output, validation_split=0.2, batch_size=1, epochs=epochs, verbose=1, shuffle=False)
model.save('my_model.h5')
score = model.evaluate(test_input, test_output, batch_size=1)
print(score)
print('Predicting')
predicted_output = model.predict(test_input, batch_size=1)