用于时间序列预测的 Keras LSTM 神经网络在模型拟合期间显示 nan

Posted

技术标签:

【中文标题】用于时间序列预测的 Keras LSTM 神经网络在模型拟合期间显示 nan【英文标题】:Keras LSTM neural network for Time Series Predictions shows nan during model fit 【发布时间】:2020-04-16 15:49:48 【问题描述】:

我正在训练一个神经网络,通过传递昨天的可用性(144 个样本)来预测一整天的可用性(144 个样本,6 个特征)。我很难找到好的资源或关于如何定义神经网络来预测回归问题中的时间序列的解释。训练被定义为一个有监督的学习问题。我对神经网络的定义是,

lstm_neurons = 30

model = Sequential()
model.add(LSTM(lstm_neurons * 2, input_shape=(self.train_x.shape[1], sel    f.train_x.shape[2]), return_sequences=True))
model.add(LSTM(lstm_neurons * 2))
model.add(Dense(len_day, activation='softmax'))

model.compile(loss='mean_squared_error', optimizer='adam', metrics = [rm    se, 'mae', 'mape'])

我正在训练 20 个 epoch,批量大小为 200,其中使用的数据集具有以下形状,

Train X (9631, 144, 6)
Train Y (9631, 144)
Test X (137, 144, 6)
Test Y (137, 144)
Validation X (3990, 144, 6)
Validation Y (3990, 144)

所有这些都会在lossrmsemae 的训练期间产生 nan 值...虽然这看起来是个问题,但我可以使用生成的模型来生成预测,它们看起来不错.

【问题讨论】:

你的数据标准化了吗?如果不是,这可能有助于解决您的问题,请查看这篇关于如何为 LSTM -RNN ***.com/questions/43467597/… 标准化您的数据的帖子以及关于 LSTM-RNN 的数据标准化的讨论***.com/questions/43467597/… 应该注意,虽然归一化是该过程的关键部分,但 OP 应该知道这仍然会返回读数 - 只有它们会非常虚假,即相比而言,损失读数会非常大处理缩放数据。因此,虽然未能规范化可能会返回 nan 值,但并非在所有情况下都是如此。 【参考方案1】:

要问的第一个问题 - 您是否尝试根据将可用性解释为概率度量来预测时间序列?

softmax 激活函数在 this scenario 下效果最好 - 但实际上当您尝试预测间隔时间序列时,您可能会错误指定它 - 因此您为什么要为您的结果。

这个例子可能对你有用 - LSTM 用于这个例子来预测酒店取消的每周波动。

与您的示例类似,X_trainX_val 被重新塑造为 样本、时间步长、特征

X_train = np.reshape(X_train, (X_train.shape[0], 1, X_train.shape[1]))
X_val = np.reshape(X_val, (X_val.shape[0], 1, X_val.shape[1]))

LSTM网络定义如下:

# Generate LSTM network
model = tf.keras.Sequential()
model.add(LSTM(4, input_shape=(1, previous)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train, Y_train, epochs=20, batch_size=1, verbose=2)

如您所见,均方误差用作损失函数,因为所讨论的抵消变量是区间(即可以取很宽范围的值,并且不一定受任何限制)特定的规模)。

我只能推测,因为我没有看到您的数据或结果,但是在不合适时将 softmax 定义为您的激活函数可能会出错 - 我怀疑这种情况是您还使用均方误差作为损失度量。

在上面的例子中,Dense 层本身并没有指定激活函数。

就如何选择验证使用 LSTM 进行的时间序列预测是否有效而言,一个潜在的好主意是将结果与更简单的时间序列模型的结果进行比较;例如阿里玛。

使用我们的示例,ARIMA 在预测 Hotel 1 时表现更好,而 LSTM 在预测 Hotel 2 时表现更好:

H1 Results

Reading     ARIMA   LSTM
MDA     0.86    0.8
RMSE    57.95   63.89
MFE     -12.72  -54.25

H2 Results

Reading     ARIMA   LSTM
MDA     0.86    0.8
RMSE    274.07  95.28
MFE     156.32  38.65

最后,在使用训练集和验证集创建数据集时,您还必须确保使用正确的 previous 参数,即您选择回归的时间段数反对时间 t 的观察结果。

例如,您使用的是昨天的可用性 - 但您可能会发现模型在使用前 5 或 10 天时得到了改进。

# Number of previous
previous = 5
X_train, Y_train = create_dataset(train, previous)
X_val, Y_val = create_dataset(val, previous)

在您的情况下,我首先要检查的是 softmax 激活函数的使用,然后从那里开始工作。

【讨论】:

以上是关于用于时间序列预测的 Keras LSTM 神经网络在模型拟合期间显示 nan的主要内容,如果未能解决你的问题,请参考以下文章

Keras LSTM实现多维输入输出时序预测实践详解

LSTM Keras 网络的常量输出和预测语法

用于 Keras 中句子相似性的具有 LSTM 的连体网络定期给出相同的结果

Keras深度学习实战(33)——基于LSTM的序列预测模型

为啥用于预测的 Keras LSTM 批量大小必须与拟合批量大小相同?

带有 LSTM 单元的 Keras RNN 用于基于多个输入时间序列预测多个输出时间序列