我正在训练LSTM自动编码器,但是损耗函数随机上升,如下图所示:
我尝试了多种方法来防止这种情况,调整批次大小,调整层中神经元的数量,但似乎无济于事。我检查了输入数据,看是否包含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主题中有关可能出现的问题的线索,但在尝试了多种操作之后,目前我不确定如何防止损失函数随机飙升。任何建议表示赞赏。除此之外,我可以看到我的准确性没有提高很多,所以问题可能是相互联系的。
答案 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?
答案 1 :(得分:1)
两个主要问题:
'relu'
使用LSTM
,保留标准激活为'tanh'
。因为LSTM是“循环的”,所以它们很容易累积值的增加或减少,以致于使数字无用。 X_train
和X_test
的范围。确保它们没有太大。在-4到+4之间比较好。如果尚未对数据进行标准化,则应考虑对其进行标准化。请注意,“准确性”对于未分类的问题没有任何意义。 (我注意到您的最终激活是“线性”的,所以您没有进行分类,对吧?)
最后,如果以上两个提示不起作用。检查您是否有一个全为零的示例,这可能正在创建“完整掩码”序列,并且此“可能”(我不知道)会导致错误。
(X_train == 0).all(axis=[1,2]).any() #should be false