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