softmax函数
>>> a = np.array([0.3,2.9,4.0])
>>> exp_a=np.exp(a)
>>> print(exp_a)
[ 1.34985881 18.17414537 54.59815003]
>>> sum_exp_a = np.sum(exp_a)
>>> print(sum_exp_a)
74.1221542101633
>>> y=exp_a/sum_exp_a
>>> y
array([0.01821127, 0.24519181, 0.73659691])
>>>
def softmax(x):
exp_a = np.exp(x)
sum_exp_a = np.sum(exp_a)
y = exp_a /sum_exp_a
return y
以上版本有问题:
>>> a = np.array([1010,1000,990])
>>> np.exp(a)/np.sum(np.exp(a))
__main__:1: RuntimeWarning: overflow encountered in exp
__main__:1: RuntimeWarning: invalid value encountered in true_divide
array([nan, nan, nan])
>>>
公式推导:加上或者减去一个值不影响结果
>>> a - c
array([ 0, -10, -20])
>>> np.exp(a-c)/np.sum(np.exp(a-c))
array([9.99954600e-01, 4.53978686e-05, 2.06106005e-09])
>>>
改进版本
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c)
sum_exp_a = np.sum(exp_a)
y = exp_a /sum_exp_a
return y
评论(0)
您还未登录,请登录后发表或查看评论