【问题标题】:Very large float in pythonpython中非常大的浮点数
【发布时间】:2019-05-16 18:23:15
【问题描述】:

我正在尝试为 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')

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

【问题讨论】:

  • 我认为你使用 Decimal 不正确,你仍然在调用 math.exp(720) ,这同样存在数量太大的问题,不管你要去的事实如何将它传递给十进制,它还不知道。我想你想要 Decimal(720).exp()

标签: python-3.x machine-learning neural-network floating-point decimal


【解决方案1】:

对于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

【讨论】:

    【解决方案2】:

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

    如果您使用numpy.exp 代替math.exp 来处理如此大的指数,您将看到它的计算结果为特殊值inf(无穷大)。

    除此之外,我想知道你为什么要产生这么大的数字(不确定你是否知道它有多大。只是给你一个想法,宇宙中的原子数估计在范围为 10 到 80 的幂。您尝试生成的数字远大于此)。

    【讨论】:

    • 感谢您的回复。我现在意识到有一个更高的错误导致我的第一层产生如此大的值。产生的新值在更合理的范围内(~50-100) - 但是,当将这些值输入到下一层时,我仍然遇到同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多