Прогнозирование двумерного (позиционного) временного ряда в Керасе с использованием 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)

0 ответов

Другие вопросы по тегам