Mic*_*čka 5 python autoencoder lstm keras loss-function
我正在训练一个 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))
Run Code Online (Sandbox Code Playgroud)
损失函数在随机时间点爆炸,有时早些,有时晚些。我读到这个线程可能出现的问题,但在尝试多次后的事情这一点我不知道怎样做才能防止损失函数从随机暴涨。任何建议表示赞赏。除此之外,我可以看到我的准确度并没有增加多少,所以问题可能是相互关联的。
两个主要问题:
'relu'for LSTM,保留标准激活'tanh'。因为 LSTM 是“循环的”,所以它们很容易积累不断增长或下降的值,直到使数字变得无用。 X_train检查您的数据和的范围X_test。确保它们不要太大。-4 到 +4 之间的值比较好。如果数据尚未标准化,您应该考虑对其进行标准化。请注意,“准确性”对于未分类的问题没有任何意义。(我注意到你的最终激活是“线性”的,所以你没有进行分类,对吧?)
最后,如果上面的两个提示都不起作用。检查您是否有一个全零的示例,这可能会创建一个“全掩码”序列,并且这“可能”(我不知道)会导致错误。
(X_train == 0).all(axis=[1,2]).any() #should be false
Run Code Online (Sandbox Code Playgroud)
两个要点:
第 1 点 正如 Daniel Möller 所强调的:不要对 LSTM 使用“relu”,保留标准激活“tanh”。
第二点:修复爆炸梯度的一种方法是对优化器使用clipnorm或clipvalue
在最后两行尝试这样的事情
对于裁剪范数:
opt = tf.keras.optimizers.Adam(clipnorm=1.0)
Run Code Online (Sandbox Code Playgroud)
对于剪辑值:
opt = tf.keras.optimizers.Adam(clipvalue=0.5)
Run Code Online (Sandbox Code Playgroud)
请参阅此帖子以获取帮助(以前版本的 TF): 如何在 TensorFlow 中应用梯度裁剪?
这篇文章的一般解释:https : //machinelearningmastery.com/how-to-avoid-exploding-gradients-in-neural-networks-with-gradient-clipping/