深度学习问题检查——训练出现nan, loss不降

一、训练出现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很难训练啊!!!

猜你喜欢

转载自blog.csdn.net/whatwho_518/article/details/89705725