解決python numpy RuntimeWarning: overflow encountered in exp的較好方法

在自定義神經(jīng)網(wǎng)絡(luò)中,使用sigmoid函數(shù)時,報數(shù)據(jù)溢出overflow錯誤。

def sigmoid(self, x):
    return 1.0 / (1 + np.exp(-x))

RuntimeWarning: overflow encountered in exp
根據(jù)測試(測試代碼如下),是因為指數(shù)出現(xiàn)極大的數(shù)據(jù),導(dǎo)致np.exp運算溢出

def sigmoid(self, x):
    print(x.min())
    return 1.0 / (1 + np.exp(-x))
image.png

網(wǎng)上一般的做法為如下,但是對x為數(shù)組卻不能執(zhí)行。

def sigmoid(x):
   if x>=0: #對sigmoid函數(shù)優(yōu)化,避免出現(xiàn)極大的數(shù)據(jù)溢出
       return 1.0 / (1 + np.exp(-x))
   else:
       return np.exp(x)/(1+np.exp(x))

在我的Python中運行上述代碼,x為數(shù)組時報錯如下:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
x的值不止一個,需要對所有的x都進行判斷。
因此本人提出的較好的修改方案如下:如有疑問歡迎評論指出。

def sigmoid(self, x):
    y = x.copy()      # 對sigmoid函數(shù)優(yōu)化,避免出現(xiàn)極大的數(shù)據(jù)溢出
    y[x >= 0] = 1.0 / (1 + np.exp(-x[x >= 0]))
    y[x < 0] = np.exp(x[x < 0]) / (1 + np.exp(x[x < 0]))
    return y

如果這篇文章大家覺得有意義的話請多多點贊、收藏支持,也可以在下面點擊“贊賞支持”按鈕打賞支持我喲~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容