前言
在计算sigmoid函数值时,出现了以下警告
原因
我们观察我们的sigmoid函数
import numpy as np
# Dontla:定义sigmoid函数
def sigmoid(x):
return 1.0 / (1 + np.exp(-x))
numpy数组x中可能有绝对值比较大的负数,这样传给sigmoid函数时,分母np.exp(-x)
会非常大,导致np.exp(-x)
溢出
解决方法
1、对sigmoid函数实现的优化,使np.exp(-x)
的值始终小于1
import numpy as np
# Dontla:定义sigmoid函数
def sigmoid(inx):
if inx >= 0: # 对sigmoid函数的优化,避免了出现极大的数据溢出
return 1.0 / (1 + np.exp(-inx))
else:
return np.exp(inx) / (1 + np.exp(inx))
但在numpy数组中,你不好直接判断np.array大于零或小于零,所以需要把数组里的数字取出来一个一个判断,计算后,再重新整合:
def sigmoid(x):
x_ravel = x.ravel() # 将numpy数组展平
length = len(x_ravel)
y = []
for index in range(length):
if x_ravel[index] >= 0:
y.append(1.0 / (1 + np.exp(-x_ravel[index])))
else:
y.append(np.exp(x_ravel[index]) / (np.exp(x_ravel[index]) + 1))
return np.array(y).reshape(x.shape)
2、用这个公式替代(没试过,不知好不好用)
def logistic_function(x):
return .5 * (1 + np.tanh(.5 * x))
参考文章2:Sigmoid函数的替代:overflow encountered in exp in computing the logistic function