【问题标题】:Why numpy shows overflow warning when calculating sigmoid function over a vector为什么在向量上计算 sigmoid 函数时 numpy 会显示溢出警告
【发布时间】:2021-08-07 12:17:45
【问题描述】:

我将 sigmoid 函数定义为

def sigmoid(x):
    return np.array(1,dtype=np.float32)/(np.array(1,dtype=np.float32)+np.e**(-x))

从某个过程,我得到一个向量V

array([-17.16755  , -43.38096  , -50.662907 ,  -4.6828723,  30.241184 ,
    33.176258 ,  -2.6549878,  39.39479  ,  30.862703 ,  43.635265 ,
    -1.6571381, -32.128    ,  29.632397 ,  49.887814 , -51.056076 ,
   -21.155422 , -15.083642 ,  -8.165374 , -30.164135 , -44.869812 ,
   -41.42827  , -51.831993 , -30.47157  ,  63.4149   , -36.810406 ,
   -91.20894  ,  34.144974 ,  25.610632 ,  31.795725 ,  30.754189 ,
    25.77716  , -36.224567 , -20.628532 ,  17.782776 , -47.377155 ,
    27.018559 , -35.27353  , -67.69212  ,  42.793926 ,  17.365631 ,
   -50.17401  ,  13.575214 , -25.257996 ,  29.324886 ,  41.678135 ,
    22.198011 , -27.206142 ,  53.277668 , -35.56072  , -40.728275 ,
   -65.53719  ,  37.86692  , -55.85548  , -41.653015 , -31.345434 ,
    28.519646 ,   3.410955 , -37.82836  , -21.12491  ,  14.327229 ,
    41.04181  ,  -5.9667635, -36.600582 , -18.411482 , -17.701595 ,
   -56.644577 , -30.59841  ,  39.21502  ,  32.131046 ,  37.98612  ,
   -38.354282 ,  53.85536  , -14.2249365, -49.56412  , -43.871513 ,
   -45.763306 , -37.88479  , -56.158215 , -46.685528 , -54.468544 ,
    43.334534 , -33.170887 , -33.829945 ,  25.237522 , -18.438    ,
   -15.322146 ,  41.810265 , -11.0000925,  37.11111  ,  22.03616  ,
   -59.27206  ,  15.850861 , -27.838043 , -37.638874 ,  36.973534 ,
    36.29362  , -41.293266 ,  34.956223 ,  19.00378  ,  -2.5246155,
    61.8252   ,  -8.748521 , -35.123108 ,  42.100964 , -21.26229  ,
   -49.73235  , -24.923735 ,  46.17717  , -11.523466 ,  53.184673 ,
   -47.184753 , -35.34979  , -34.720116 ,  39.09728  ,  39.863754 ,
    15.549853 , -13.079846 ,  45.43235  , -27.67498  , -48.726383 ,
    33.66749  ,  42.371788 ,  29.571087 , -27.311522 , -38.875412 ,
   -60.134632 , -51.25539  ,  26.069319 ], dtype=float32)

以下运行正常:

for i in V:
    sigmoid(i)

但是sigmoid(V) 返回FloatingPointError: overflow encountered in power

我发现问题是由V[25]=-91.20894产生的,这是数组中最小的数字,因此np.e**-V的结果最大。

我特别确认sigmoid(V[25]) 将返回一个有效结果2.4460271112816884e-40,但sigmoid(V[25:26]) 再次返回overflow

我想知道是否有办法快速执行此操作。

我可以通过将我的数组定义为 np.float64(实际上有效)或将点积的元素一一相乘来解决问题,但我正在执行数百万次操作,我的代码需要几分钟才能运行,所以我将不胜感激任何解决方案或指南,以避免增加计算时间。

【问题讨论】:

  • 它工作正常,可能是一些版本的变化,你检查了吗
  • @Nagakiran 我刚刚意识到,如果我构建一个数组来处理函数上方的数字,但它仍然不适用于我拥有的真实向量。我不知道如何粘贴矢量本身...
  • 请尝试检查矢量的形状和矢量的类型,这些可能在此处不匹配
  • @Nagakiran 我确定形状匹配,是一个 dtype 为 np.float32 的 64 位向量
  • @Nagakiran 另外,如果我运行 sigmoid(V.astype(np.float64)),该函数可以正常工作

标签: python numpy overflow sigmoid


【解决方案1】:

您正在使用 python 的 power 运算符,这可能是导致问题的原因。 Numpy 使用广播,因此实现要简单得多。尝试用 1 替换所有 1 数组。

所以应该是1 / (1 + np.exp(-x))

【讨论】:

  • 我刚试了,还是不行。另外,我使用了 np.array(1,dtype=np.float32) 因为我被告知这会更快,因为最好告诉 numpy 我希望它使用的数字类型(因为我正在构建一个 NN ,即使是很小的改进也非常重要)。我错了吗?
  • 如果是这种情况,您应该使用np.ones()。我不确定为什么它不工作。我已经完成了多门课程,该实施有效。你能检查一下你的 python 和 numpy 版本吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2012-09-12
  • 2016-12-05
  • 2022-08-11
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
相关资源
最近更新 更多