关于 np.arccos/arcsin 计算之前需要必须要 np.clip 的那件小事儿

博主在调试程序时遇到了一个棘手的问题,发现计算出的cos值超出[-1,1]范围导致np.arccos返回NaN。通过深入分析,发现问题出在内积计算的cos值没有进行有效范围限制。解决方案是在计算cos值后使用np.clip函数将其限制在合法范围内,避免了NaN的出现。这个小bug浪费了大量时间,但最终找到并修复了问题。
摘要由CSDN通过智能技术生成

这俩天天天陷入自我怀疑,为啥我写的程序bug频出?

为啥老纸写的 agent 输出的 action 会带有 NaN?
Surprise Motherf***er!!!
就爱情/学业/工作总得有一个顺的吧? F**K!!!


给 np.arccos 输入不在定义域的值,这天经地义的事儿,必须返回 NaN

在这里插入图片描述
但是,你在调用的时候,是希望算出角度的,也就是说,你已经有了 cos 值,希望反推出角度 θ \theta θ

正常情况下,你的cos值显然也是, [ − 1 , 1 ] [-1, 1] [1,1]这个范围的

但是,总会遇到非正常情况

# 计算向量 self2obj_v 和 self_angle_v 的内积
inner_product = (self2obj_v * self_angle_v).sum()  
# 内积除以二者的模长,就是夹角的 cos 值,self_angle_v  是个单位向量
cos = inner_product / np.linalg.norm(self2obj_v)    # <----------------- 问题出在这里
# 反推导 arccos 值就是你的角度
obj_angle = np.arccos(cos)

看下出问题的那行,由于他是个分数,所以可能产生异常值,而我就好巧不巧的得到了:
c o s = 1.000001 cos = 1.000001 cos=1.000001
然后,
n p . a r c c o s ( c o s ) = N a N np.arccos(cos)=NaN np.arccos(cos)=NaN
。。。。。。


我以为是激活函数的,问题,或者是什么梯度爆炸的问题,结果是这里出的错…
就,挺秃然的


所以,以后在输出的 cos 值后(如果你是通过内积计算的cos值),最好 clip 一下:

inner_product = (self2obj_v * self_angle_v).sum()  
cos = inner_product / np.linalg.norm(self2obj_v)
cos = np.clip(cos, -1, 1)      # <---------------------- 这里 clip 一下
obj_angle = np.arccos(cos)

好吧,That’s all.


这么个小bug,折腾我好几天,太过分了

单今天一下午调试的log:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值