簡體   English   中英

避免numpy中exp的溢出錯誤

[英]Avoiding overflow error for exp in numpy

我在numpy中實現以下功能:

def weak_softmax(a):
    b=np.exp(a)
    return b/(1+np.sum(b))

數組a的大小很小,但條目有時可能很大,可能多達1000 因此,由於指數函數的溢出,我經常收到以下錯誤:

a=np.array([1000,1000])
a=weak_softmax(a)

上面的代碼返回向量a=[nan nan]並引發以下警告:

Warning: overflow encountered in exp

有什么聰明的方法可以避免此問題,但仍按預期返回數組b 這是因為b所有條目都小於一個,並且我認為必須可以通過一些技巧來避免此問題。

對於大小合適的c您可以簡單地將分子和分母除以相同的系數exp(c)

以下代碼使用np.finfo檢查是否可能發生溢出並計算c

def modified_soft_max(a, SAFETY=2.0):
    mrn = np.finfo(a.dtype).max # largest representable number
    thr = np.log(mrn / a.size) - SAFETY
    amx = a.max()
    if(amx > thr):
        b = np.exp(a - (amx-thr))
        return b / (np.exp(thr-amx) + b.sum())
    else:
        b = np.exp(a)
        return b / (1.0 + b.sum())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM