python - 损失函数的爆炸式增长,LSTM 自动编码器

标签 python keras lstm autoencoder loss-function

我正在训练一个 LSTM 自动编码器,但损失函数随机上升,如下图所示:
screenshot of explosion in loss function
我尝试了多种方法来防止这种情况发生,调整批量大小,调整图层中的神经元数量,但似乎没有任何帮助。我检查了我的输入数据以查看它是否包含空值/无穷大值,但它没有,它也被标准化了。这是我的代码供引用:

model = Sequential()
model.add(Masking(mask_value=0, input_shape=(430, 3)))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2, activation='relu'))
model.add(RepeatVector(430))
model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(3)))
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

context_paths = loadFile()
X_train, X_test = train_test_split(context_paths, test_size=0.20)

history = model.fit(X_train, X_train, epochs=1, batch_size=4, verbose=1, validation_data=(X_test, X_test))

损失函数在随机时间点爆炸,有时早些,有时晚些。我读了 this关于可能的问题的线程,但是在尝试了多种方法之后,此时我不知道该怎么做才能防止损失函数随机飙升。任何建议表示赞赏。除此之外,我可以看到我的准确度并没有增加多少,所以问题可能是相互关联的。

最佳答案

两个要点:

第 1 点 正如 Daniel Möller 所强调的:
不要对 LSTM 使用“relu”,保留标准激活“tanh”。

第二点:修复爆炸梯度的一种方法是使用 剪裁规范剪辑值对于优化器

在最后两行尝试这样的事情

对于 剪裁规范 :

opt = tf.keras.optimizers.Adam(clipnorm=1.0)

对于 剪辑值 :
opt = tf.keras.optimizers.Adam(clipvalue=0.5)

请参阅此帖子以获取帮助(以前版本的 TF):
How to apply gradient clipping in TensorFlow?

这篇文章的一般解释:
https://machinelearningmastery.com/how-to-avoid-exploding-gradients-in-neural-networks-with-gradient-clipping/

关于python - 损失函数的爆炸式增长,LSTM 自动编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60776782/

相关文章:

python - 使用 Keras 进行图像分类时,神经网络训练精度太低并且预测不起作用

python - 如何保存 GridSearchCV 对象?

python - 为什么网络学习效果不高(Tensorflow - 用于文本生成的 LSTM)?

python - 使用 dropout 和 CudnnLSTM 进行训练和验证

python - 从 spacy 中的英文文本创建 CFG?

Python 认证/授权框架

python - 如何创建自定义模型类

python - 如何通过 keras LSTM 层传递这个模拟的单热编码数据?

python - 在odoo中使用同一字段添加多个条目

python - 构建正则表达式以检查特定的文本数据库格式