【发布时间】:2020-08-22 02:40:31
【问题描述】:
我正在尝试训练一个回溯大约 100 步的时间序列预测模型。然而,当我第一次开始训练它时,损失总是 nan。我想仔细看看,发现即使是第一个预测(在任何学习之前,可能使用随机初始化的权重),所有的值都是 NaN。如果我减少回顾次数,那么它几乎不会出现在 1e+36 左右,这仍然是超高的,并导致梯度爆炸(我猜,仍然不太熟悉这些术语。)
这是我的架构在代码中的样子:
model = Sequential()
model.add(TimeDistributed(Conv2D(filters=3, kernel_size=5, activation='relu', input_shape=(n_features, n_steps), data_format='channels_first')))
model.add(TimeDistributed(MaxPooling2D(pool_size=5, data_format='channels_first')))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(outputs.shape[1]))
model.compile(optimizer='rmsprop', loss='mse')
输入数据包括一些降水量(大约 50-150)、温度(-10 和 25 之间)和地下水位数据(100-500 之间),输出包括地下水位预测数据。
在我看来,在没有任何训练的情况下拥有 nans 或非常高的数字很奇怪,而且我不确定这是否称为爆炸梯度,我想知道我在这里做错了什么。
【问题讨论】:
-
你试过缩放你的 X 和 y 吗?
-
@MarcoCerliani 是的,我做到了(最小-最大缩放),它工作正常,除了在实际预测中我不知道它将如何捕获可能高于或低于最小值的值数据的最大值。
标签: keras deep-learning time-series lstm