Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 训练LSTM自动编码器获得NaN/超高MSE损耗_Python_Tensorflow_Keras_Deep Learning_Lstm - Fatal编程技术网

Python 训练LSTM自动编码器获得NaN/超高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] 看起来像这样: 我从公共信号

我在试着训练一个LSTM ae。 这就像一个seq2seq模型,你把一个信号放进去,得到一个重建的信号序列。我使用的序列应该很简单。损失函数和度量是MSE。前一百个时代进展顺利。然而,经过一些时期,我得到了MSE,这是超高,有时去南。我不知道这是什么原因。 你能检查一下代码并给我一个提示吗? 序列在之前得到了规范化,所以它在[0,1]范围内,它怎么会产生如此高的MSE错误? 这是我从训练集中得到的输入序列:

sequence1 = x_train[0][:128]
看起来像这样:

我从公共信号数据集(128*1)获取数据 这是代码:(我从keras博客修改)


最初的几个时代进展顺利。所有损失约为0.003X左右。然后它突然变大,到某个非常大的数字,一直到NaN。

在进行反向传播时,您可能会遇到梯度值爆炸的问题。 尝试使用ClipForm和clipvalue参数来控制渐变剪裁:


或者,您使用的学习率是多少?我还将尝试将学习率降低101001000,以检查您是否观察到相同的行为。

是罪魁祸首-请参阅。可能的解决办法:

  • 将权重初始化为较小的值,例如,
    keras.initializers.TruncatedNormal(平均值=0.0,标准差=0.01)
  • 剪辑权重(初始化时,或通过
    内核约束
    循环约束
    ,…)
  • 增重衰变
  • 使用热身学习率方案(低开始,逐渐增加)
  • 使用
    “selu”
    激活,它更稳定,类似于ReLU,在某些任务上比ReLU工作得更好
  • 由于你的训练在很多时期都是稳定的,3听起来是最有希望的,因为似乎最终你的体重标准会变得太大,梯度会爆炸。通常,我建议将
    '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)