python中的非常大的浮子



我正在尝试为Mnist数据库构建一个神经网络。当计算softmax函数时,我收到一个错误,与"你不能存储那种大小的浮点"相同

代码如下:

def softmax(vector): # REQUIRES a unidimensional numpy array 
adjustedVals = [0] * len(vector)
totalExp = np.exp(vector)
print("totalExp equals")
print(totalExp)
totalSum = totalExp.sum()
for i in range(len(vector)):
adjustedVals[i] = (np.exp(vector[i])) / totalSum
return adjustedVals # this throws back an error sometimes?!?!

检查后,大多数建议使用十进制模块。然而,当我把这个模块的命令行中使用的值搞砸了,那就是:

from decimal import Decimal
import math
test = Decimal(math.exp(720))

我收到一个类似的错误,任何值都是math.exp(>709(.

OverflowError: (34, 'Numerical result out of range')

我的结论是,即使是十进制也无法处理这个数字。有人知道我可以用另一种方法来表示这些非常大的浮子吗。

对于vector中的某种值分布,有一种技术可以使softmax函数在计算上更可行。也就是说,您可以从每个元素中减去vector(我们称之为x_max(中的最大值。如果你回忆起softmax公式,这样的运算不会影响结果,因为它简化为结果与e^(x_max) / e^(x_max) = 1的乘积。通过这种方式,您获得的最高中间值是e^(x_max - x_max) = 1,因此可以避免溢出。

为了获得更多的解释,我推荐以下文章:https://nolanbconaway.github.io/blog/2017/softmax-numpy

如果值大于709,函数'math.exp'会超出浮点范围并引发此溢出错误。

如果使用numpy.exp而不是math.exp来表示如此大的指数,则会发现它的计算结果为特殊值inf(无穷大(。

除此之外,我想知道你为什么要产生这么大的数字(不确定你是否知道它有多大。为了给你一个想法,宇宙中原子的数量估计在10到80的幂之间。(。你试图生产的数量比这个大得多(。

最新更新