值错误:操作数无法与形状一起广播 - LSTM

数据挖掘 机器学习 Python 张量流 lstm
2021-09-20 17:16:05

我正在尝试LSTM使用tensorflow遵循本教程的模型。

当我尝试反转缩放以进行预测时(本教程中的第 86 行),我无法理解为什么我的测试集中出现错误。

加载数据集并创建特色后,以下是我为reframed数据集所做的,

# split into train and test sets
values = reframed.values
split_point = len(reframed)- 168

train = values[ : split_point, :]
test = values[split_point: , :]

# split into input and outputs
train_X, train_y = train[:, :-1], train[:, -1]
test_X, test_y = test[:, :-1], test[:, -1]

# reshape input to be 3D [samples, timesteps, features]
train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))

print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)
>> (2399, 1, 39) (2399,) (168, 1, 39) (168,)


# design network
model = Sequential()
model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')


# fit network
history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)

# make a prediction
yhat = model.predict(test_X)
test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))

inv_yhat = np.concatenate((yhat, test_X[:, 1:]), axis=1)

在此步骤之后,以下代码已scaler.invert_transform引发错误。

inv_yhat = scaler.inverse_transform(inv_yhat)

ValueError:操作数无法与形状一起广播 (168,39) (41,) (​​168,39)

形状,

test_X.shape
>> (168, 1, 39)

yhat.shape
>>(168,1)

inv_yhat.shape
>> (168,39)

任何帮助或建议将不胜感激!

2个回答

OP提供的答案是正确的,但我想详细说明一下,以试图阐明更多信息。

首先,您必须了解调用执行的操作

reframed = series_to_supervised(scaled, 1, 1)

在第 50 行。

简而言之,让我们假设输入具有特征(变量)n样本。m这意味着缩放后的数据框的形状是(n) x (m). 对第50行的特定调用series_to_supervised()意味着由于. 很可能,您的错误是由第 52 行引起的:(n-1) x (2m)NaNseries_to_supervised()

reframed.drop(reframed.columns[[9,10,11,12,13,14,15]], axis=1, inplace=True)

因为您可能会删除任意数量的列。该代码的结构使其根据多个时间序列的过去值(包括感兴趣的信号)预测一个时间序列。因此,您必须删除列,以便最终保留所有过去的值,以及将用作基本事实的感兴趣信号的当前值。这意味着 的形状应该在第 52 行之后。如果不是,您可能会在恢复缩放时遇到尺寸不匹配的错误。(m-1)mreframed(n-1) x (m+1)

在这一点上,我想强调一个事实,即在删除列时应该非常小心逻辑错误,因为除了第 52 行中感兴趣的信号之外,您希望删除所有内容。如果保留任何其他列,代码仍将运行,但你肯定会得到逻辑工件。

此外,如果您删除除第一列以外的任何列(在索引 0 处),则必须相应地修改第 85 行和第 90 行中的串联,否则您还将获得逻辑工件。

我想根据@Seteve Kalestad 的建议发布作为答案,以防有人遇到此问题。

答案是:反转比例时数据的形状必须与最初缩放时相同。

我在准备数据时出错。最初,当我缩放数据时,我的测试集的形状为(168,39).

正如它在错误中提到的

shapes (168,39) (41,) (168,39)

我有41专栏,应该是39

原因是 is 的形状和isyhat(168,1)形状,因为它从第 1 列开始。当它们连接起来时,它就变成了原来的样子test_X[:, 1:]168,38(168,39)scaled