损耗函数爆炸,LSTM自动编码器

时间:2020-03-20 15:10:43

标签: python keras lstm autoencoder loss-function

我正在训练LSTM自动编码器,但是损耗函数随机上升,如下图所示: screenshot of explosion in loss function 我尝试了多种方法来防止这种情况,调整批次大小,调整层中神经元的数量,但似乎无济于事。我检查了输入数据,看是否包含null / infinity值,但不包含它,也将其标准化。这是我的代码供参考:

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主题中有关可能出现的问题的线索,但在尝试了多种操作之后,目前我不确定如何防止损失函数随机飙升。任何建议表示赞赏。除此之外,我可以看到我的准确性没有提高很多,所以问题可能是相互联系的。

2 个答案:

答案 0 :(得分:4)

两个要点:

第一点丹尼尔·莫勒(DanielMöller)强调: 对于LSTM,请勿使用“ relu”,保留标准激活为“ tanh”。

第二点:解决爆炸梯度的一种方法是对优化程序使用 clipnorm clipvalue

在最后两行尝试类似的操作

对于剪辑规范

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/

答案 1 :(得分:1)

两个主要问题:

  • 不要为'relu'使用LSTM,保留标准激活为'tanh'。因为LSTM是“循环的”,所以它们很容易累积值的增加或减少,以致于使数字无用。
  • 检查数据X_trainX_test的范围。确保它们没有太大。在-4到+4之间比较好。如果尚未对数据进行标准化,则应考虑对其进行标准化。

请注意,“准确性”对于未分类的问题没有任何意义。 (我注意到您的最终激活是“线性”的,所以您没有进行分类,对吧?)


最后,如果以上两个提示不起作用。检查您是否有一个全为零的示例,这可能正在创建“完整掩码”序列,并且此“可能”(我不知道)会导致错误。

(X_train == 0).all(axis=[1,2]).any() #should be false
相关问题