如何设置Keras LSTM进行时间序列预测?

3

我有一个包含600个时序点(x(t),y(t))的训练批次,其中x(t)是一个25维向量,y(t)是我的目标(1维)。我想要训练一个LSTM来预测在给定几个额外的x(t)[t> 600]的情况下,该系列将如何继续。我尝试了以下模型:

    model = Sequential() 
    model.add(LSTM(128, input_shape = (600,25), batch_size = 1, activation= 'tanh', return_sequences = True)) 
    model.add(Dense(1, activation='linear'))
    model.compile(loss='mean_squared_error', optimizer='adam')
    model.fit(trainX, trainY, epochs=20 ,verbose=2) prediction

    prediction = model.predict(testX, batch_size = 1)

拟合工作正常,但在预测步骤中我不断遇到以下错误:

    Error when checking : expected lstm_46_input to have shape (1, 600, 25) but got array with shape (1, 10, 25)

我缺少什么?

这是我的形状:

    trainX.shape = (1,600,25)
    trainY.shape = (1,600,1)
    testX.shape = (1,10,25)
2个回答

5
根据Keras文档,LSTM(或任何RNN)层的输入应该是形状为(batch_size, timesteps, input_dim)的格式,其中您的输入形状为:

trainX.shape = (1,600,25)

这意味着在训练时,您只传递了一个数据,每个时间步长有600个时间步长和25个特征。但我感觉您实际上有600个训练数据,每个数据都有25个时间步长1个时间步长的特征。我猜测您的输入形状(trainX)应该是600 x 25 x 1。训练目标(trainY)应该是600 x 1。如果我的假设是正确的,那么您的测试数据应该是10 x 25 x 1。第一个LSTM层应该写成:
    model.add(LSTM(128, input_shape = (25,1), batch_size = 1, activation= 'tanh', return_sequences = False)) 

3
如果 Y 形状正确,那么他很可能需要一个 TimeDistributed(Dense(1)),因为每个时间步都有一个输出。 - Thomas Jungblut
对于2D输入,inputs的形状为(batch_size, input_size),input_shape = (25,1)表示batch_size=25,而不是时间步长。 - mingxue

2
如果您的训练数据实际上是(1,600,25),这意味着您正在展开LSTM反馈600次。第一个输入对第600个输入有影响。如果这是您想要的,您可以使用Keras函数“pad_sequences”将零添加到测试矩阵中,使其具有形状(1,600,25)。网络应该预测零,您需要向testY中添加590个零。
如果您只想让前10个时间步骤影响当前的Y预测,则需要将trainX转换为形状(590,10,25)。输入行将类似于:
model.add(LSTM(n_hid, stateful=True, return_sequences=False, batch_input_shape=(1,nTS,x_train.shape[2])))

将其转换为所需格式的处理过程可能类似于以下内容:
def formatTS(XX, yy, window_length):
x_train = np.zeros((XX.shape[0]-window_length,window_length,XX.shape[1]))
for i in range(x_train.shape[0]):
    x_train[i] = XX[i:i+window_length,:]
y_train = yy[window_length:]
return x_train, y_train

那么,由于它已经是 (1,10,25) 的形状,所以您的测试将正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接