在自定義神經(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
如果這篇文章大家覺得有意義的話請多多點贊、收藏支持,也可以在下面點擊“贊賞支持”按鈕打賞支持我喲~