一、训练出现nan的原因
https://blog.csdn.net/ch07013224/article/details/80324373
1,检查数据。数据的label有无错误。 制作lst修改过标签
2,检查参数。保存的网络层和损失层所有的参数
3,检查是否有分母为0,或者log里为负数或者0,softmax里的exp是否太大,
根号是否有负数
1.如果在迭代的100轮以内,出现NaN,一般情况下的原因是因为你的学习率过高,需要降低学习率。可以不断降低学习率直至不出现NaN为止,一般来说低于现有学习率1-10倍即可。
2.如果当前的网络是类似于RNN的循环神经网络的话,出现NaN可能是因为梯度爆炸的原因,一个有效的方式是增加“gradient clipping”(梯度截断来解决)
3.可能用0作为了除数;
4.可能0或者负数作为自然对数
5.需要计算loss的数组越界(尤其是自己,自定义了一个新的网络,可能出现这种情况)
6.在某些涉及指数计算,可能最后算得值为INF(无穷)(比如不做其他处理的softmax中分子分母需要计算exp(x),值过大,最后可能为INF/INF,得到NaN,此时你要确认你使用的softmax中在计算exp(x)做了相关处理(比如减去最大值等等))
1,是否有脏数据
可能有,因为大的数据集还没有训练完成一遍.
2,log出现负数
二、训练loss不降得原因
https://blog.csdn.net/liuweiyuxiang/article/details/80856991
train loss 不断下降,test loss不断下降,说明网络仍在学习;
train loss 不断下降,test loss趋于不变,说明网络过拟合;
train loss 趋于不变,test loss不断下降,说明数据集100%有问题;
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。
loss不降,不收敛问题检查过程:
- 静态检查:
1,输入数据检查
1)是否输入有脏数据
2)是否输入数据label有错误
2,网络模型检测、损失检查
1)模型和损失是否合理,是否符合论文中公式
2)模型和损失初始化是否合理
- 动态检查
1,是否梯度有更新
1)学习率是否过大或者过小,不合适——》选择合适的学习率和学习算法
2)打印网络,观察网络中各个层的参数是否变化
- 迁移框架检查
1,不同框架,输入数据、模型框架、损失、参数是否一致——》参考旧框架参数
1)同一个训练集、验证集
2)同一个框架LResnet50e-IR
3) 损失 cosface/
4) 参数:优化算法,batch-norm等参数
2,不同框架,模型优化流程等是否有问题
1)sgd是如何同时更新损失中的参数和网路中的参数
3,迁移框架版本问题——》参考新框架官网文档
1)pytorch0.4~1.0问题
不同版本是否有问题
2)参考官网代码,修改官方代码
亲身实验:pytorch上LResnet50E-IR + cosface 训练不收敛原因
1,数据集问题:训练数据集没有正确检测和对齐
2,没有将loss的优化加入优化器里
3,model验证完之后忘了转回训练模式(模型里有batchnorm和dropout会出问题),model.train和model.eval相互转化,——可以解释每次eval结果会不稳定的原因
4,cosface的尺度参数s传入为1,所以开始优化下降到10就不变化,因为8万label半径为1很难训练啊!!!