工程实践_深度学习训练模型时Loss出现NAN的原因及解决办法

原因1:梯度爆炸

产生原因:学习率过大。

解决方法:
3. 数据归一化(减均值,除方差,或者加入normalization:BN,L2 norm等)。
4. 更换参数初始化方法(对于CNN,一般用xavier或者msra的初始化方法)。
5. 减小学习率,减小Batch size。
6. 加入梯度截断(gradient clipping)。

原因2:网络结构设计问题

解决方法:

  1. 加如BN层进行归一化。
  2. 修改网络结构(如增加网络宽度、增加网络层数)。
  3. 改变层的学习率,每个层都可以设置学习率,可以尝试减小后面层的学习率。

原因3: 不同框架迁移时的代码问题

解决方法:

  1. debug不同框架下产生的代码错误。
  2. 不同框架下的函数意义不同,需要准确迁移。

原因4: 数据集的问题

1.可能数据集中存在脏数据。从而导致无法训练的问题。

解决方法:

通过设置batch_size = 1,shuffle = False,一步一步地将sample定位到了所有可能的脏数据,并且删掉。

2.可能是数据集label数量和模型中设置的label数量不一致。

原因5:损失函数设置问题

例子:

在TensorFlow中,如果使用交叉熵:cross_entry = -tf.reduce_sum(tf.log(y_conv))的话,最后softmax输出层的y_conv取值范围在[0,1]中是允许取0的,但是log(0)很有可能会导致NaN的出现。

所以在设置损失函数时要注意细节。

参考2:https://blog.csdn.net/qq_44846512/article/details/109395076

你可能感兴趣的:(DL,tensorflow,深度学习)