基于LSTM的Keras二维(位置)时间序列预测

基于LSTM的Keras二维(位置)时间序列预测,keras,lstm,Keras,Lstm,我试图使用keraslstm实现来预测未来的一系列x,y对。x、y对指定二维平面中的位置。我想预测未来的60步 我有36k个数据对,我将它们分成30k用于训练,5880k用于测试。我通过创建一个形状(30000,60,2)的3D数组来准备训练数据,其中每个元素都是训练数据的一个60长度的滚动片段,例如[x0,y0],[x1,y1],[x59,y59],[x1,y1],[x2,y2],[x60,y60]。。。[x30000,y30000],[x30001,y30001]。。。[x30059,y30

我试图使用keraslstm实现来预测未来的一系列x,y对。x、y对指定二维平面中的位置。我想预测未来的60步

我有36k个数据对,我将它们分成30k用于训练,5880k用于测试。我通过创建一个形状(30000,60,2)的3D数组来准备训练数据,其中每个元素都是训练数据的一个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)的数组

看起来模型忽略了我的数据是二维的这一事实。很明显,我在概念上遗漏了一些东西,但我不确定它是什么。如果有人能让我走上正轨,我将不胜感激

这是我的密码:

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)

首先,您需要在网络中设置一个输出层,其大小与您的输出数据
模型相同。在LSTM层之后添加(密集(2))
,非常感谢您的回答。我这样做了,但我仍然得到同样的错误,只是这次是从致密层。我希望输出形状为(60,2),即60个二维样本。我的训练输出的形状是(30000,60,2),也将
return\u sequences=True
添加到你的LSTM层再次训练!这实际上使它运行起来。我得到了一个大小为(5880,60,2)的预测输出,这是有意义的。但是,每个元素都是1.0。你知道为什么会这样吗?你是否在规范化你的输入数据?我哪儿都看不到。此外,对于回归,您在输出层上的激活应该是线性的。首先,您需要在网络中有一个输出层,输出数据的大小<代码>模型。在LSTM层之后添加(密集(2))非常感谢您的回答。我这样做了,但我仍然得到同样的错误,只是这次是从致密层。我希望输出形状为(60,2),即60个二维样本。我的训练输出的形状是(30000,60,2),也将
return\u sequences=True
添加到你的LSTM层再次训练!这实际上使它运行起来。我得到了一个大小为(5880,60,2)的预测输出,这是有意义的。但是,每个元素都是1.0。你知道为什么会这样吗?你是否在规范化你的输入数据?我哪儿都看不到。对于回归,输出层上的激活应该是线性的