不报错是撸代码时最大的温柔。在进行深度学习的时候,我出现了loss显示为nan的情况,并且训练集的准确率一直保持一个值不变化这种诡异情况。后来经过各种调试,发现问题出现在一张图片的标签里。这个标签是-1,然后就出现了上面的问题,修改过来就正常了。

首先还是看看我遇到的情况吧,非常诡异,如图所示:

出现的问题

于是我进行了各种调试,之前我看教程的时候,也进行了类似的训练,可以作为模板,我这是一个多分类的问题,可以借鉴这个200种鸟类分类的案例:200种鸟类图片分类_深度学习卷积神经网络实例

然后我去掉了图像增强以及均值方差等计算,甚至去除了网络,直接搬来了ResNet50作为自己的网络来尝试。但是还是有这问题。

那是数据集的问题?我就继续往回找,最后发现了一个问题,标签的最小值竟然是-1。按理说,标签应该从0开始。

最小标签竟然是-1

为什么会出现-1呢,还是问题出现在一开始的时候,我是从1开始打标签的,然后在制作数据集的时候,通过每个都减一的方式实现了从0开始,具体的写在制作数据集的文章里:【附详细源码】深度学习之使用numpy创建自己的npy数据集。但是自己不小心打了个标签0,处理后就是标签为-1,这就造成这个惨剧,甚至折磨我一下午:

悲剧的原因


TensorFlow深度学习学习训练时出现loss为nan、测试集准确率不变化如何调试?我在处理自己的问题的时候,也搜索了大量资料,这里简单概括一下,主要是总结于知乎网友的一些经验:

  • 添加batch normalization,进行批标准化

    什么是数据批标准化?深度学习中的批标准化概念详解及其使用

  • 减小学习率

    使用Adam优化器的时候,默认学习速率为0.001,可以设置为0.0001,甚至为0,看看问题是否仍然存在。若问题消失,那说明确实是学习率的问题。若问题仍存在,再继续排查别的问题。对于分类问题,学习率太高会导致模型「顽固」地认为某些数据属于错误的类。

  • 检查原始数据是否存在缺失

    这里使用shape,看看图片的数量和标签的数量是否一样,有没有漏的或者多的。设置随机抽查几个图片和标签,看看是否统一。

  • 查看标签是否有问题

    这里也是我出现的问题,你可以查看一下标签里有哪些数,使用np.unique函数,我就是通过简单看一下最大值和最小值,发现有个-1,也是本次问题的罪魁祸首。

  • 归一化处理

    在读取图片时,查看舒服进行了归一化处理

    归一化处理

  • loss函数用的什么函数?

    具体看下面这篇文章吧:

    什么是独热编码(One-Hot Encoding)?categorical_crossentropy和sparse_categorical_crossentropy有什么区别?

  • 对于回归问题,可能出现了除0 的计算,加一个很小的余项可能可以解决
  • 数据本身,是否存在Nan,可以用numpy.any(numpy.isnan(x))检查一下input和target
  • relu和softmax两层不要连着用
  • batch size是否合理?太大或者太小?
本文标签: 深度学习TensorFlow

版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/lossNAN.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处并附带原文链接!!
▶ 站长邮箱 [email protected][email protected] ,如不方便留言可邮件联系。

小陶的个人微信公众号

学累了就来张美女照片养养眼吧,身体是革命的本钱,要多多休息哦~ 随机美女图片

最后修改:2023 年 03 月 23 日
如果觉得我的文章对你有用,请随意赞赏!