Tensorflow 运行LSTM模型时出错,丢失:NaN值

Tensorflow 运行LSTM模型时出错,丢失:NaN值,tensorflow,machine-learning,keras,neural-network,lstm,Tensorflow,Machine Learning,Keras,Neural Network,Lstm,我使用Keras和Tensorflow的LSTM模型给出了损失:nan值 我曾尝试降低学习率,但仍然得到nan并降低总体准确度,并且还使用了np.any(np.isnan(x_train))检查我可能介绍自己的nan值(未发现nan)。我也读过关于爆炸梯度的文章,似乎找不到任何东西可以帮助我解决这个问题 我想我知道问题可能在哪里,但不太确定。这是我构建x\u列车的过程 例如: a = [[1,0,..0], [0,1,..0], [0,0,..1]] a.shape() # (3, 20) b

我使用Keras和Tensorflow的LSTM模型给出了
损失:nan

我曾尝试降低学习率,但仍然得到nan并降低总体准确度,并且还使用了
np.any(np.isnan(x_train))
检查我可能介绍自己的nan值(未发现nan)。我也读过关于爆炸梯度的文章,似乎找不到任何东西可以帮助我解决这个问题

我想我知道问题可能在哪里,但不太确定。这是我构建
x\u列车的过程
例如:

a = [[1,0,..0], [0,1,..0], [0,0,..1]]
a.shape() # (3, 20)

b = [[0,0,..1], [0,1,..0], [1,0,..0], [0,1,..0]]
b.shape() # (4, 20)
为了确保形状相同,我将向量
[0,0,…0]
(全部为零)附加到
a
,因此形状现在是
(4,20)

a
b
被附加以给出三维阵列形状
(2,4,20)
,这形成了
x\u序列
。但我认为在训练我的模型时,添加0的空向量出于某种原因给了我一个
损失:nan
。这就是我可能出错的地方吗

n、 b.
a+b
是一个numpy数组,而我的实际
x\u列。形状
(12281452,20)

•编辑•
model.summary()
添加如下:

x_train shape: (1228, 1452, 20)
y_train shape: (1228, 1452, 8)
x_val shape: (223, 1452, 20)
x_val shape: (223, 1452, 8)
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
unified_lstm (UnifiedLSTM)   (None, 1452, 128)         76288     
_________________________________________________________________
batch_normalization_v2 (Batc (None, 1452, 128)         512       
_________________________________________________________________
unified_lstm_1 (UnifiedLSTM) (None, 1452, 128)         131584    
_________________________________________________________________
batch_normalization_v2_1 (Ba (None, 1452, 128)         512       
_________________________________________________________________
dense (Dense)                (None, 1452, 32)          4128      
_________________________________________________________________
dense_1 (Dense)              (None, 1452, 8)           264       
=================================================================
Total params: 213,288
Trainable params: 212,776
Non-trainable params: 512
nan的截图如下:
我建议您检查以下各项:-

  • 批处理归一化层的输出。有一次,我遇到了一个类似的问题,损失是“南”。当我检查规范化输出时,它都是零。也许,这就是为什么失去了“南”
  • NAN的可能原因可能是学习率太高。试着减少它的位并检查输出
  • 如果您使用的是RMSProp,请尝试Adam
  • 由于您的
    densite_1
    层的形状为(None,8),我假设您正在处理某种分类问题。因为,我们在这里使用日志丢失,有时, 精度误差也起作用。如果使用float16,请将精度更改为float32

  • 应该使用虚拟特征,而不是填充所有零向量。也就是说,您的一个热门特征向量将大小增加到
    (21,)
    ,例如,大小为21的
    [0,0,0,…,1]
    ,最后一个维度用于虚拟填充


    我还建议您使用基于索引的输入,而不是显式的一个热向量,其中每个热向量都可以被其1的索引替换,例如,
    [0,0,1,…,0]
    变为2。Keras通过其嵌入层支持这种基于索引的输入样式。这将更易于使用,计算效率也更高。

    解决方案是使用
    掩蔽()
    KERA中可用的
    掩蔽值=0的层。这是因为当使用空向量时,通过使用keras概述的
    Masking()
    ,它们被计算到损失中,填充向量被跳过且不包括在内

    根据keras文件:


    “如果给定采样时间步的所有特征都等于mask_值,则采样时间步将在所有下游层中被屏蔽(跳过)(只要它们支持屏蔽)”

    这似乎是一个分解渐变的问题。可以尝试在密集层之间添加一些衰减层。另外,尝试使用RMS道具优化器。我会尝试这个。但这是否也意味着我的标签向量将变为(9,)而不是(8,),因为它们也被填充,并且虚拟功能将需要一个类标签?更新:我尝试了这一点,并使用了(21,)和(9,)仍然得到nan值。这意味着代码得到nan的原因不止一个。根据你问题中的信息,我看不出来。您应该添加一个小的独立代码来重现问题。