【发布时间】: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