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

标签 python keras neural-network time-series lstm

我正在训练一个神经网络,通过昨天的可用性(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 个时期,批量大小为 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)

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

最佳答案

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

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

此示例可能对您有用 - 此示例使用 LSTM 来预测酒店取消预订的每周波动。

与您的示例类似,X_trainX_val 被 reshape 为样本、时间步长、特征:

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。

使用我们的示例,ARIMA 在预测酒店 1 时表现更好,但 LSTM 在预测酒店 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

最后,在使用训练集和验证集创建数据集时,您还必须确保使用正确的先前参数,即您选择回归的时间段数对照时间 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 激活函数的使用,并从那里开始工作。

关于python - 用于时间序列预测的 Keras LSTM 神经网络在模型拟合期间显示 nan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59487800/

相关文章:

python - 具有可变输入大小的 tensorflow Conv 网络的 Keras

neural-network - softmax 函数解释的导数

python - 如何调整图像大小并保持纵横比

python - 带有 Python 请求包的 Flask 服务器上的 session 不起作用

python - 使用 Selenium 启动的 Firefox 与系统默认的 Firefox 设置不同

python - 在python中循环遍历真值数组并用另一个数组中的组件替换真值

python - Keras自定义损失函数访问python全局变量时的内部机制是什么?

tensorflow - TF/Keras 稀疏分类交叉熵

python - 具有加州住房数据的神经网络

python - 如何在tensorflow中打印梯度的总和值?