深度学习网络出现nan的原因与解决方法总结

  1. 梯度爆炸
    解决方案:
    数据归一化(减均值,除方差,加入normalization,如BN,L2 norm)
    减少学习率,减小batchsize
    加入gradient clipping

  2. 网络设计的问题
    解决方案:
    弱化场景,简化样本,参数采用典型配置,比如10万样本都是一个样本复制的,让网络拟合,如果有问题,则是网络的问题,否则是参数的问题,
    网络的问题则需要通过不断加大样本的复杂度和调整网络来改变,

  3. 出现脏数据
    进行数据清洗,有可能出现脏数据

  4. 如果在迭代的100轮以内,出现NaN,一般情况下的原因是因为你的学习率过高,需要降低学习率。可以不断降低学习率直至不出现NaN为止,一般来说低于现有学习率1-10倍即可。

  5. 如果当前的网络是类似于RNN的循环神经网络的话,出现NaN可能是因为梯度爆炸的原因,一个有效的方式是增加“gradient clipping”(梯度截断来解决)

  6. 可能用0作为了除数或者负数作为自然对数

  7. 需要计算loss的数组越界(尤其是自己,自定义了一个新的网络,可能出现这种情况)

  8. 在某些涉及指数计算,可能最后算得值为INF(无穷)(比如不做其他处理的softmax中分子分母需要计算exp(x),值过大,最后可能为INF/INF,得到NaN,此时你要确认你使用的softmax中在计算exp(x)做了相关处理(比如减去最大值等等))

  9. tensorflow训练中出现nan问题
    深度学习中对于网络的训练是参数更新的过程,需要注意一种情况就是输入数据未做归一化时,如果前向传播结果已经是[0,0,0,1,0,0,0,0]这种形式,而真实结果是[1,0,0,0,0,0,0,0,0],此时由于得出的结论不惧有概率性,而是错误的估计值,此时反向传播会使得权重和偏置值变的无穷大,导致数据溢出,也就出现了nan的问题。
    解决办法:
    a、对输入数据进行归一化处理,如将输入的图片数据除以255将其转化成0-1之间的数据;
    b、对于层数较多的情况,各层都做batch_nomorlization;
    c、对设置Weights权重使用tf.truncated_normal(0, 0.01, [3,3,1,64])生成,同时值的均值为0,方差要小一些;
    d、激活函数可以使用tanh;
    e、减小学习率 。

  10. 使用caffe训练时Loss变为nan的原因
    a. 梯度爆炸
    原因:梯度变得非常大,使得学习过程难以继续
    现象:观察log,注意每一轮迭代后的loss,loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。
    措施:
    (1)减小solver.prototxt中的base_lr,至少减小一个数量级。如果有多个loss layer,需要找出哪个损失层导致了梯度爆炸,并在train_val.prototxt中减小该层的loss_weight,而非是减小通用的base_lr。
    (2)设置clip gradient,用于限制过大的diff

    b. 不当的损失函数
    原因:有时候损失层中loss的计算可能导致NaN的出现。比如,给InfogainLoss层(信息熵损失)输入没有归一化的值,使用带有bug的自定义损失层等等。

    现象:观测训练产生的log时一开始并不能看到异常,loss也在逐步的降低,但突然之间NaN就出现了。

    措施:看看你是否能重现这个错误,在loss layer中加入一些输出以进行调试。

    示例:有一次我使用的loss归一化了batch中label错误的次数。如果某个label从未在batch中出现过,loss就会变成NaN。在这种情况下,可以用足够大的batch来尽量避免这个错误。

    c. 不当的输入
    原因:输入中就含有NaN。

    现象:每当学习的过程中碰到这个错误的输入,就会变成NaN。观察log的时候也许不能察觉任何异常,loss逐步的降低,但突然间就变成NaN了。

    措施:重整你的数据集,确保训练集和验证集里面没有损坏的图片。调试中你可以使用一个简单的网络来读取输入层,有一个缺省的loss,并过一遍所有输入,如果其中有错误的输入,这个缺省的层也会产生NaN。

    案例:有一次公司需要训练一个模型,把标注好的图片放在了七牛上,拉下来的时候发生了dns劫持,有一张图片被换成了淘宝的购物二维码,且这个二维码格式与原图的格式不符合,因此成为了一张“损坏”图片。每次训练遇到这个图片的时候就会产生NaN。良好的习惯是,你有一个检测性的网络,每次训练目标网络之前把所有的样本在这个检测性的网络里面过一遍,去掉非法值。

    d. 池化层中步长比核的尺寸大
    如下例所示,当池化层中stride > kernel的时候会在y中产生NaN

layer {
      name: "faulty_pooling"
      type: "Pooling"
      bottom: "x"
      top: "y"
      pooling_param {
      pool: AVE
      stride: 5
      kernel: 3
      }
    }

原文链接:https://www.cnblogs.com/bonelee/p/8603750.html

  • 9
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在机器学习中,annotation是指对数据进行手动标注或注释的过程,这些标注或注释可以是文本标签、图像标注、语音标注等。 annotation的目的是为了将数据转化为能够被机器学习算法处理的形式,以便于训练模型。 Label是指对于annotation标注的数据进一步给出的分类或标签,它是annotation的一种具体化。例如,对于一张图片,annotation可能会标注出它的背景、人物、物品等元素,而label则是对这些元素进一步进行分类,例如把人物分为男性和女性,或者把物品分为椅子、桌子和门等。 总的来说,annotation是一个更宽泛的概念,它指的是对数据进行手动标注的过程,而label则是annotation的一种具体化,是对于标注的数据进一步进行分类或标签的过程。 ### 回答2: 在机器学习中,Annotation(标注)和Label(标签)是两个相关但又有区别的概念。 首先,Annotation是对数据进行标记和注释的过程,它可以是人工标注或者是自动化的生成。通过Annotation,我们可以为每个数据点添加额外的信息,以帮助机器学习模型理解和学习。 而Label则是对数据的分类或者回归结果的标识。它是机器学习问题中的目标变量,用来指导模型学习和预测的目标。Label表示了我们希望模型从数据中学习到的信息。 具体来说,Annotation通常是在数据准备和预处理阶段进行的,标记者会根据任务需求为数据标注不同的属性、特征或者标识,以便用于训练和评估模型。例如,在图像识别任务中,标记者可以为每个图像标注对象的位置、形状或者类别等信息。 相比之下,Label是作为一个固定的属性与数据点相关联的。在训练模型时,我们使用带有正确Label的数据来训练模型,让模型能够学习到特征与Label之间的关系,从而进行分类、回归或者其他预测任务。例如,在垃圾邮件分类问题中,Label可能分为垃圾邮件和非垃圾邮件两个类别,模型的目标就是根据邮件的特征来准确地判断其类别。 总结来说,Annotation是对数据进行标记和注释的过程,它可以为数据添加额外的信息;而Label是用于机器学习任务中的目标变量,它指导模型的学习和预测。Annotation为Label的生成提供了基础和准备,两者相互依存且共同促进机器学习的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值