我正在尝试为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')
我的结论是,即使十进制也不能处理此数字。有谁知道我可以用来代表这些非常大的浮动的另一种方法。
答案 0 :(得分:0)
值大于709时,函数'math.exp'超出了浮点范围,并引发此溢出错误。
如果对如此大的指数使用“ numpy.exp”而不是“ math.exp”,您将看到它的计算结果为特殊值“ inf”(无穷大)。
所有这一切,我不知道您为什么要产生这么大的数字(不确定您知道它有多大。只是给您一个想法,宇宙中的原子数估计为范围是10到80的幂。您尝试生成的数字要大得多)。
答案 1 :(得分:0)
有一种技术可以使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