• 在训练过程中loss出现NaN的原因以及可以采取的方法


    NaN的意思是not a number,不是一个数字。

    1、梯度爆炸

    一般loss的相关量是w——> w的相关量(更新方式)是梯度——>和梯度有关

    原因:在学习过程中,梯度变得非常大,使得学习的过程偏离了正常的轨迹。

    症状:观察输出日志(runtime log)中每次迭代的loss值,你会发现loss随着迭代有明显的增长,最后因为loss值太大以致于不能用浮点数去表示,所以变成了NaN。

    可采取的方法:(1)降低学习率,降低至少一个数量级。如果在你的模型中有多个loss层,就不能降低基础的学习率base_lr,而是要检查日志,找到产生梯度爆炸的层,然后降低该层中的loss_weight。

    2、错误的学习率策略及参数

    原因:在学习过程中,caffe不能得出一个正确的学习率,相反会得到inf或者nan的值。这些错误的学习率呈上所有的梯度使得所有参数变成无效的值。

    症状:观察输出日志(runtime log),应该可以看到学习率变成Nan.

    可采取的方法:修改文件中所有能影响学习率的参数。比如,如果你设置的学习率策略是lr_policy:"policy",而你又忘了设置最大迭代次数max_iter,那么最后你会得到lr=NaN...

    3、错误的损失函数

    原因:有时,在损失层计算损失值时会出现NaN的情况。比如,向InfogainLoss层没有归一化输入值,使用自定义的损失层等。

    症状:观察输出日志(runtime log)的时候,你可能不会发现任何异常:loss逐渐下降,然后突然出现NaN.

    可采取的方法:尝试重现该错误,打印损失层的值并调试。

    举个例子:如果有个label并没有在批量数据中出现,频率为0,结果loss出现了NaN的情况,在这种情况下,需要用足够大的batch来避免这个错误。

    4、错误的输入

    原因:你的输入中存在NaN!

    症状:一旦学习过程中碰到这种错误的输入,输出就会变成NaN。观察输出日志(runtime log)的时候,你可能也不会出现任何异常:loss逐渐下降,然后突然出现NaN.

    可采取的方法:重建你的输入数据集,确保你的训练集/验证集中没有脏数据(错误的图片文件)。调试时,使用一个简单的网络去读取输入,如果有一个输入有错误,这个网络的loss也会出现NaN.

    5、Pooling层的步长大于核的尺寸

    由于一些原因,步长stride > 核尺寸kernel_size的pooling层会出现NaN。

     参考:https://www.jianshu.com/p/9018d08773e6

  • 相关阅读:
    PHP实现大文件下载
    使用CSS样式的三种方式
    PHP工厂模式
    使用 curl 命令发送请求
    vim 基本操作
    MAC OS 各个文件夹详细介绍以及 node 安装位置
    linux find 命令
    Mac 关闭某端口程序
    glob 模式的 Linux Shell 通配符介绍
    Mac tree 输出文件树形式
  • 原文地址:https://www.cnblogs.com/zhibei/p/12358221.html
Copyright © 2020-2023  润新知