loss突然变为nan?你可能踩了sqrt()的坑

在自定义GPS距离误差损失函数时,作者遭遇了loss突变为nan的困扰。通过深入分析,发现tf.sqrt()函数在0处不可导是问题根源。最终通过在sqrt()内添加极小数避免了此问题。

这几天在写一个网络模型,需要自定义损失函数,关于gps距离误差计算的,写完之后,噩梦开始了…
训练过程中loss总是莫名其妙的突然变为nan,网上查阅了许多资料,做了各种尝试,比如调整学习率、调整batch大小、调整网络复杂度、梯度裁剪、过滤脏数据、检查是否存在除0、log(0), 加入BatchNormalization层等,无奈还是会出现loss变为nan的问题。
后来分析loss函数本身,发现唯一可能出现问题的地方是下面这行代码里的tf.sqrt()函数:

return K.mean(tf.sqrt(tf.add(tf.square(lx), tf.square(ly))))

于是,又上网查发现tensorflow或者pytorch在loss函数中使用sqrt可能导致loss训练变为nan的问题,原因如下:
sqrt()即x^1/2,在x=0处不可导,前向传播过程中,loss的计算不会出问题,但在反向传播进行梯度计算的时候可能会遇到在0处求导的情况,这也是loss突然变为nan的原因,在sqrt()添加一个极小数之后得到解决:

return K.mean(tf.sqrt(tf.add(tf.add(tf.square(lx), tf.square(ly)), 1e-10)))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值