Keras LSTM中的训练损失为NaN

4

我在谷歌协作平台上使用GPU跑了这段代码,用于创建多层LSTM模型。它用于时间序列预测。

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM, LSTM, BatchNormalization
from keras.optimizers import SGD
model = Sequential()
model.add(LSTM(units = 50, activation = 'relu', return_sequences=True, input_shape= 
(1,len(FeaturesDataFrame.columns))))
model.add(Dropout(0.2))
model.add(LSTM(3, return_sequences=False))
model.add(Dense(1))
opt = SGD(lr=0.01, momentum=0.9, clipvalue=5.0)
model.compile(loss='mean_squared_error', optimizer=opt)

请注意,我已使用梯度裁剪技术。但是当我训练这个模型时,它返回的训练损失为nan。
history = model.fit(X_t_reshaped, train_labels, epochs=20, batch_size=96, verbose=2)

这是结果

Epoch 1/20
316/316 - 2s - loss: nan 
Epoch 2/20
316/316 - 1s - loss: nan 
Epoch 3/20
316/316 - 1s - loss: nan
Epoch 4/20
316/316 - 1s - loss: nan
Epoch 5/20
316/316 - 1s - loss: nan
Epoch 6/20
316/316 - 1s - loss: nan
Epoch 7/20
316/316 - 1s - loss: nan 
Epoch 8/20
316/316 - 1s - loss: nan 
Epoch 9/20
316/316 - 1s - loss: nan 
Epoch 10/20 
316/316 - 1s - loss: nan
Epoch 11/20
316/316 - 1s - loss: nan
Epoch 12/20
316/316 - 1s - loss: nan
Epoch 13/20
316/316 - 1s - loss: nan
Epoch 14/20
316/316 - 1s - loss: nan
Epoch 15/20
316/316 - 1s - loss: nan 
Epoch 16/20
316/316 - 1s - loss: nan
Epoch 17/20
316/316 - 1s - loss: nan
Epoch 18/20
316/316 - 1s - loss: nan
Epoch 19/20
316/316 - 1s - loss: nan
Epoch 20/20
316/316 - 1s - loss: nan

1
尝试使用更低的学习率,例如1e-4或1e-5,并查看是否有所帮助。如果是这样,您可以尝试调整学习率和其他参数,以查看是否可以避免爆炸。 - hobbs
1
@HoOman 你为什么要使用ReLU,而且你有对输入进行缩放吗? - Mustafa Aydın
@MustafaAydın,我看到这种激活方式很普遍。你有没有关于时间序列预测应用的建议? - HoOman
1个回答

15

我更熟悉PyTorch而不是Keras。然而,我仍然建议您执行以下几个步骤:

  1. 检查数据。确保您传递给模型的数据中没有缺失或空值。这是最可能的原因。一个空值将导致丢失为NaN。

  2. 您可以尝试降低学习速率(0.001或更小)和/或删除梯度裁剪。我曾经因为梯度贡献的问题而导致过NaN损失。

  3. 尝试对数据进行缩放(尽管未缩放的数据通常会导致无限损失而不是NaN损失)。使用StandardScaler或sklearn中的其他缩放器。

如果所有这些都失败了,那么我建议您只需将一些非常简单的虚拟数据传递到模型中,看看问题是否仍然存在。然后,您将知道它是代码问题还是数据问题。希望这有所帮助,如有任何问题,请随时询问。


谢谢。这是由于训练数据中存在NaN值的原因。 - HoOman
StandardScaler 为我解决了问题!无法感谢你的足够。 - Steven Magana-Zook
训练数据中的NaN值。谢谢! - Cesar Flores

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接