不报错是撸代码时最大的温柔。在进行深度学习的时候,我出现了loss显示为nan的情况,并且训练集的准确率一直保持一个值不变化这种诡异情况。后来经过各种调试,发现问题出现在一张图片的标签里。这个标签是-1,然后就出现了上面的问题,修改过来就正常了。
首先还是看看我遇到的情况吧,非常诡异,如图所示:
于是我进行了各种调试,之前我看教程的时候,也进行了类似的训练,可以作为模板,我这是一个多分类的问题,可以借鉴这个200种鸟类分类的案例:200种鸟类图片分类_深度学习卷积神经网络实例
然后我去掉了图像增强以及均值方差等计算,甚至去除了网络,直接搬来了ResNet50作为自己的网络来尝试。但是还是有这问题。
那是数据集的问题?我就继续往回找,最后发现了一个问题,标签的最小值竟然是-1。按理说,标签应该从0开始。
为什么会出现-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是否合理?太大或者太小?