我正在尝试为 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')
我的结论是,即使是十进制也无法处理这个数字。有谁知道我可以用另一种方法来表示这些非常大的浮点数。
有一种技术可以使 softmax 函数对于
vector
中的某种值分布在计算上更加可行。也就是说,您可以从 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”超出了浮点范围并抛出此溢出错误。
如果您使用
math.exp
而不是 numpy.exp
来表示如此大的指数,您将看到它的计算结果为特殊值 inf
(无穷大)。
除此之外,我想知道为什么你会想要产生这么大的数字(不确定你是否知道它有多大。只是为了给你一个想法,宇宙中原子的数量估计在10 的 80 次方。您尝试生成的数字比该数字大得多)。