Python 训练LSTM自动编码器获得NaN/超高MSE损耗
我在试着训练一个LSTM ae。 这就像一个seq2seq模型,你把一个信号放进去,得到一个重建的信号序列。我使用的序列应该很简单。损失函数和度量是MSE。前一百个时代进展顺利。然而,经过一些时期,我得到了MSE,这是超高,有时去南。我不知道这是什么原因。 你能检查一下代码并给我一个提示吗? 序列在之前得到了规范化,所以它在[0,1]范围内,它怎么会产生如此高的MSE错误? 这是我从训练集中得到的输入序列:Python 训练LSTM自动编码器获得NaN/超高MSE损耗,python,tensorflow,keras,deep-learning,lstm,Python,Tensorflow,Keras,Deep Learning,Lstm,我在试着训练一个LSTM ae。 这就像一个seq2seq模型,你把一个信号放进去,得到一个重建的信号序列。我使用的序列应该很简单。损失函数和度量是MSE。前一百个时代进展顺利。然而,经过一些时期,我得到了MSE,这是超高,有时去南。我不知道这是什么原因。 你能检查一下代码并给我一个提示吗? 序列在之前得到了规范化,所以它在[0,1]范围内,它怎么会产生如此高的MSE错误? 这是我从训练集中得到的输入序列: sequence1 = x_train[0][:128] 看起来像这样: 我从公共信号
sequence1 = x_train[0][:128]
看起来像这样:
我从公共信号数据集(128*1)获取数据
这是代码:(我从keras博客修改)
最初的几个时代进展顺利。所有损失约为0.003X左右。然后它突然变大,到某个非常大的数字,一直到NaN。在进行反向传播时,您可能会遇到梯度值爆炸的问题。 尝试使用ClipForm和clipvalue参数来控制渐变剪裁:
或者,您使用的学习率是多少?我还将尝试将学习率降低101001000,以检查您是否观察到相同的行为。
是罪魁祸首-请参阅。可能的解决办法:
keras.initializers.TruncatedNormal(平均值=0.0,标准差=0.01)
内核约束
,循环约束
,…)“selu”
激活,它更稳定,类似于ReLU,在某些任务上比ReLU工作得更好'relu'
的重量标准保持在1左右;您可以使用下面的函数监视l2规范。我还建议检查图层激活和渐变
def-inspect\u-weights\u-l2(型号,名称=-lstm',轴=-1):
def_get_l2(w,轴=-1):
轴=轴如果轴!=-1其他透镜(w形)-1
缩减_轴=元组([ax表示范围内的ax(len(w.shape)),如果ax!=轴])
返回np.sqrt(np.sum(np.square(w),轴=减缩_轴))
def_打印_层_l2(层,idx,轴=-1):
W=层。获取_权重()
l2_all=[]
txt=“{}”
对于w中的w:
txt+=“{.4f},{.4f}--”
l2=_get_l2(w,轴)
l2_all.extend([l2.max(),l2.mean()]))
txt=txt.rstrip(“--”)
打印(txt.格式(idx,*l2_all))
名称=[names]如果是实例(名称,str)则为其他名称
对于idx,枚举中的层(model.layers):
如果有([name in layer.name.lower()表示name in names]):
_打印层(层,idx,轴=轴)
2014年,我在François Chollet的一篇帖子中看到,人们在讨论“relu”激活是否对此负责(你也提出了建议)。建议的修复方法是使用“sigmoid”激活函数。我想问你是否知道为什么会这样(没有从你突出显示的另一篇文章中获得该信息)?@Dr.H.Lecter我不鼓励使用sigmoid;改用“tanh”
。它们都避免了递归地馈送无限激活所产生的不稳定性,也就是说,假设您馈送2
100个时间步,即2^100'tanh'
相对于'sigmoid'
而言,它具有优越的梯度后支撑和选通动态,同时也具有负面激活。非常感谢您的回答。我的错误是,他们实际上是在帖子中推荐“thanh”。
# lstm autoencoder recreate sequence
from numpy import array
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense
from keras.layers import RepeatVector
from keras.layers import TimeDistributed
from keras.utils import plot_model
from keras import regularizers
# define input sequence. sequence1 is only a one dimensional list
# reshape sequence1 input into [samples, timesteps, features]
n_in = len(sequence1)
sequence = sequence1.reshape((1, n_in, 1))
# define model
model = Sequential()
model.add(LSTM(1024, activation='relu', input_shape=(n_in,1)))
model.add(RepeatVector(n_in))
model.add(LSTM(1024, activation='relu', return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(optimizer='adam', loss='mse')
for epo in [50,100,1000,2000]:
model.fit(sequence, sequence, epochs=epo)