为什么 LSTM 预测形状不符合预期?
Why are LSTM prediction shape not as expected?
我有一个包含时间戳和一个值(总共只有 2 列)的时间序列数据集,并训练 LSTM 来预测每小时的值。
所以我为模型准备的数据集如下:
取该值的前5个值作为X,该小时的观测值作为y。
然后我拆分火车并测试每个 X 和 y。
因此,在使用最小-最大缩放器缩放之后,我得到了具有以下形状的训练和数据集。
print(train_X.shape,train_y.shape,test_X.shape,test_y.shape)
(16195, 5) (16195,) (8716, 5) (8716,)
然后我通过
构建模型
model = Sequential()
model.add(LSTM(5, input_shape=(n_steps,n_features),recurrent_dropout=0.2,return_sequences=True))
model.add(BatchNormalization())
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
我拟合模型并通过
进行预测
history = model.fit(train_X, train_y, epochs=10, batch_size=64,validation_data=(test_X, test_y),shuffle=False)
#predict the instances
predicted = model.predict(test_X)
我现在预测的形状是(8716, 5, 1)
。
我猜这是不正确的,因为预测应该与 test_y 形状相同,即 (8716,)
。
所以当我重塑为逆比例
predicted=yhat.reshape(predicted.shape[0], -1).reshape(-1, 1)
inverse_predictions= scaler_y.inverse_transform(predicted)
这给出了 (43580, 1)
的形状,这是错误的,因为预测的维度是 (8716, 5, 1)
而不是 (8716,)
。
我不确定是哪个部分导致了错误。感谢任何帮助。
您可以删除 return_sequences=True
,这应该可以解决问题。
或者,您可以使用展平层,但我认为这不是您想要在此处执行的操作。
我有一个包含时间戳和一个值(总共只有 2 列)的时间序列数据集,并训练 LSTM 来预测每小时的值。
所以我为模型准备的数据集如下:
取该值的前5个值作为X,该小时的观测值作为y。 然后我拆分火车并测试每个 X 和 y。
因此,在使用最小-最大缩放器缩放之后,我得到了具有以下形状的训练和数据集。
print(train_X.shape,train_y.shape,test_X.shape,test_y.shape)
(16195, 5) (16195,) (8716, 5) (8716,)
然后我通过
构建模型 model = Sequential()
model.add(LSTM(5, input_shape=(n_steps,n_features),recurrent_dropout=0.2,return_sequences=True))
model.add(BatchNormalization())
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
我拟合模型并通过
进行预测history = model.fit(train_X, train_y, epochs=10, batch_size=64,validation_data=(test_X, test_y),shuffle=False)
#predict the instances
predicted = model.predict(test_X)
我现在预测的形状是(8716, 5, 1)
。
我猜这是不正确的,因为预测应该与 test_y 形状相同,即 (8716,)
。
所以当我重塑为逆比例
predicted=yhat.reshape(predicted.shape[0], -1).reshape(-1, 1)
inverse_predictions= scaler_y.inverse_transform(predicted)
这给出了 (43580, 1)
的形状,这是错误的,因为预测的维度是 (8716, 5, 1)
而不是 (8716,)
。
我不确定是哪个部分导致了错误。感谢任何帮助。
您可以删除 return_sequences=True
,这应该可以解决问题。
或者,您可以使用展平层,但我认为这不是您想要在此处执行的操作。