利用LSTM在Keras中进行二维(位置)时间序列预测

时间:2017-07-14 14:39:02

标签: keras lstm

我正在尝试使用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)

0 个答案:

没有答案