我正在尝试使用Keras LSTM实现来预测未来的一系列x,y对。 x,y对指定2D平面中的位置。我想预测他们未来60步。
我有36k数据对,我将其分为30k用于训练,5880k用于测试。我已经通过创建3D形状阵列(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)