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

时间:2019-05-17 23:17:07

标签: tensorflow machine-learning keras neural-network lstm

我使用Keras和Tensorflow的LSTM模型给出了loss: nan值。

我曾尝试降低学习率,但仍然得到nan并降低了整体准确性,并且还使用np.any(np.isnan(x_train))来检查我可能会自我介绍的nan值(未找到nan)。我还阅读了有关爆炸梯度的文章,似乎找不到任何有助于解决我的特定问题的方法。

我认为我对问题可能出在哪里但不太确定。这是我用来构建x_train的过程 例如:

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)

附加

ab以给出3D阵列形状(2,4,20),其形式为x_train。但是我认为,由于某些原因,追加0的空向量是在训练模型时给了我loss: nan的原因。这是我可能会出问题的地方吗?

n.b。 a+b是一个numpy数组,而我实际的x_train.shape(1228, 1452, 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的屏幕截图如下: enter image description here

3 个答案:

答案 0 :(得分:0)

我建议您检查以下内容:-

  1. 批次归一化层的输出。有一次,我遇到了一个类似的问题,即损失是“难”的。当我检查归一化输出时,全为零。也许,这就是使损失成为“ nan”的原因。
  2. NaN的可能原因可能是学习率太高。尝试将其减小一点并检查输出。
  3. 如果您使用的是RMSProp,请尝试使用Adam。
  4. 由于您的dense_1层的形状为(None,8),因此我假设您正在处理某种分类问题。因为我们有时在这里使用对数丢失 精度误差也起作用。如果使用的是float16,则将精度更改为float32。

答案 1 :(得分:0)

您应该使用虚拟功能,而不是填充所有零向量。也就是说,您的热门特征向量会将尺寸增加到(21,),例如,尺寸为21的[0, 0, 0, ..., 1],最后一个尺寸用于虚拟填充。

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

答案 2 :(得分:0)

解决方案是在Masking()中使用在keras中可用的mask_value=0层。这是因为使用空向量时,如keras所述,通过使用Masking()将它们计入损失,填充向量被跳过而不包括在内。

根据keras文档:

'如果给定样本时间步长的所有特征都等于mask_value,则样本时间步长将在所有下游层中被掩蔽(跳过)(只要它们支持掩蔽)'