LSTM 对不同的输入返回相同的结果

数据挖掘 机器学习 深度学习 喀拉斯 张量流 lstm
2022-03-06 11:29:50

嘿大家,

我正在研究 TensorFlow 中的 LSTM 网络,该网络根据前 12 个月的相同值预测一个月内不同产品类别的价格指数值。不幸的是,我在尝试预测时遇到了一些问题。我的数据集(数据)基本上如下所示:

产品 1 价格指数 产品 2 价格指数 ... 产品 128 价格指数 产品 129 价格指数
第 1 个月 99.1 99.5 ... 100 100.2
第 2 个月 100.6 101 ... 100.3 100.6
... ... ... ... ... ...
第 305 个月 150 124 ... 135 136
第 306 个月 151 126 ... 137 136.2

我做了一些预处理,但没有进行任何重新缩放/标准化,因为输入/输出值都是从 100 开始的所有索引,因此具有相同的比例:

#Split in training and test set
train_size = int(len(data) * 0.9)
test_size = len(data) - train_size
train, test = data.iloc[0:train_size], data.iloc[train_size:len(data)]
print(len(train), len(test))

#Create dataset
def create_dataset(X, time_steps=1):
Xs, ys = [], []
for i in range(len(X) - time_steps):
    v = X.iloc[i:(i + time_steps)].values
    Xs.append(v)
    ys.append(X.iloc[i + time_steps])
return np.array(Xs), np.array(ys)

time_steps = 12
X_train, y_train = create_dataset(train, time_steps)
X_test, y_test = create_dataset(test, time_steps)
print(X_train.shape, y_train.shape)

产生以下输出:

(263, 12, 129) (263, 129)

我的模型如下所示:

tf.keras.backend.clear_session

model = tf.keras.Sequential([
  tf.keras.layers.LSTM(50, input_shape=(X_train.shape[1],X_train.shape[2])),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(129)                      
])             

model.compile(loss='mae', optimizer='adam')

history = model.fit(X_train, y_train, epochs=500, batch_size=270, validation_data=(X_test, y_test), verbose=1, shuffle=False)

它没有错误并且可以训练。但是,当它完成训练并且我尝试使用 predict 来获取 X_train 的预测值(将它们与实际值进行对比)时,我得到以下输出:

array([[3.1375432, 2.9852755, 3.4141188, ..., 3.3334997, 3.0094063,
    2.5739233],
   [3.1375432, 2.9852755, 3.4141188, ..., 3.3334997, 3.0094063,
    2.5739233],
   [3.1375432, 2.9852755, 3.4141188, ..., 3.3334997, 3.0094063,
    2.5739233],
   ...,
   [3.1375432, 2.9852755, 3.4141188, ..., 3.3334997, 3.0094063,
    2.5739233],
   [3.1375432, 2.9852755, 3.4141188, ..., 3.3334997, 3.0094063,
    2.5739233],
   [3.1375434, 2.9852755, 3.4141188, ..., 3.3334997, 3.0094063,
    2.5739233]], dtype=float32)

对于不同月份的预测,这基本上为我提供了完全相同的输出。此外,如果我尝试预测一个月,例如 X_train[1],我会从网络收到以下错误:

ValueError: Input 0 of layer sequential_11 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: (None, 129)

虽然 X_train 的形状 = (12,129),但与网络预期的形状相同。有没有人可以指出我正确的方向并告诉我我做错了什么?

谢谢!

1个回答

似乎扩展我的数据有所帮助。我参考了GitHub上的以下线程:

https://github.com/keras-team/keras/issues/1727