matlab损失函数出现nan,警惕!损失Loss为Nan或者超级大的原因

本文探讨了训练或预测过程中遇到损失值不正常、无穷大或nan的现象,分析了梯度爆炸、输入数据错误、损失函数设计不当、batchNorm问题以及数据加载时的Shuffle等因素可能导致这种情况,并给出了相应的解决建议,如调整学习率、检查数据、自定义检测函数等。
摘要由CSDN通过智能技术生成

前言

训练或者预测过程中经常会遇到训练损失值或者验证损失值不正常、无穷大、或者直接nan的情况:

43a56dacde12e61551634c62adae4ca8.png

遇到这样的现象,通常有以下几个原因导致:

梯度爆炸造成Loss爆炸

原因很简单,学习率较高的情况下,直接影响到每次更新值的程度比较大,走的步伐因此也会大起来。如下图,过大的学习率会导致无法顺利地到达最低点,稍有不慎就会跳出可控制区域,此时我们将要面对的就是损失成倍增大(跨量级)。

4f7a63cc831d3d9872baa5e5ce20d210.png

另外,这种情况很容易在网络层数比较深的时候出现,借用gluon的一段话:

01f64bfcb810b9c657f1d6801edf8b4d.png

这就是典型的梯度爆炸,解决方法也很简单,降低初始的学习率,并设置学习率衰减。

检查输入数据和输出数据

通常我们都会保证输入的数据是否正确(这个要是不能保证那么后续也就没必要继续了..)。一般输入不正确的话可以立马观察出来。

有两种情况可能并不是那么容易检测到:

数据比较多,99%的数据是对的,但有1%的数据不正常,或者损坏,在训练过程中这些数据往往会造成nan或者inf,这时候需要仔细挑选自己的数据,关于如何挑选数据(https://oldpan.me/archives/how-to-use-tricks-to-train-network)。

训练过程中跳出了错误的数据,这是需要在IDE或者通过其他途径对运行中的程序进行分析。

这时我们要注意的是在训练过程中的输入和输出是否正确:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>