nan值的出现

nan值出现的原因

NaNNot a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的[IEEE 754](https://baike.baidu.com/item/IEEE 754/3869922)浮点数标准

看完这条百科其实大家就差不多明白问题出在哪里了,后面几点是比较具体的分析,和一些例子和实际踩坑。

NaN的百度百科-答案

出现原因

  • 在使用log loss 出现了负数

    这个我们很好理解 log(-1),

    np.log(-1)
    
    nan
    
  • 学习率太大

    首先学习率太大,会出现震荡,出现震荡,会导致你的梯度值特别大,很可能出现溢出这种情况。这个梯度值可能是inf,-inf。

    而以下这些操作都会导致nan的产生,这些都是不确定的操作。

    >>> a = np.inf/np.inf
    >>> a
    nan
    
    >>> 0*np.inf
    nan
    
    
    
  • 脏数据

    一旦表达式中有了第一个nan,它就会传播,所以在调试时,通常需要找到第一个出错的

常见报错


也就是说nan和overflowError通常是相伴想随的。

  • OverflowError: int too large to convert to float

  • RuntimeWarning: overflow encountered in multiply

  • RuntimeWarning: invalid value encountered in reduce return ufunc.reduce(obj, axis, dtype, out, **passkwargs)

上面这句,提示你再进行矩阵运算时,已经出现了非法值。而这些非法值大概率是nan,那么之后所有的结果都就是null。

总结

总结:为了避免这种情况,调参时,大的不行就往小调(步子迈的大难免扯着蛋)。出现问题,不要慌,先找可能出现的非法操作。比如log loss的赋值和overflow inf。

猜你喜欢

转载自blog.csdn.net/qq_45175218/article/details/111473326