【问题标题】:Error when running LSTM model, Loss: NaN values运行 LSTM 模型时出错,损失:NaN 值
【发布时间】:2019-05-17 23:17:06
【问题描述】:

我使用 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 的截图如下:

【问题讨论】:

  • 这似乎是梯度爆炸的问题。您可以尝试在密集层之间添加一些 Dropout 层。另外,尝试使用 RMS prop 优化器。

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


【解决方案1】:

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

根据 keras 文档:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您应该使用虚拟功能,而不是填充全零向量。也就是说,您的 one-hot 特征向量会将大小增加到 (21,),例如,[0, 0, 0, ..., 1] 的大小为 21,最后一个维度用于虚拟填充。

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

      【讨论】:

      • 我会试试这个。但这是否也意味着我的标签向量将变为 (9,) 而不是 (8,),因为它们也被填充了,并且虚拟特征将需要一个类标签?
      • 更新:我已经尝试过这个并使用了 (21,) 和 (9,) 并且仍然得到 nan 值。
      • 这意味着你的代码得到 nan 的原因不止一个。根据您问题中的信息,我看不到它。您应该添加一个小的独立代码来重现该问题。
      猜你喜欢
      • 2018-02-03
      • 2019-10-06
      • 1970-01-01
      • 2021-01-16
      • 2021-06-14
      • 1970-01-01
      • 2021-07-25
      • 2020-07-05
      • 2021-03-27
      相关资源
      最近更新 更多