1.softmaxx函数数学表达式:
在这里插入图片描述
其中,exp(x)是指数函数。

图式公式可以理解为:假设输出层共有n个神经元,计算第k个神经元的输出y。

2.简单实现softmaxx函数:

import numpy as np

x = np.array([0.3,2.9,4.0])
exp_x = np.exp(x)
print(exp_x)
sum_x = np.sum(exp)
print(sum_x)
softmax = exp_x/sum_x
print(softmax)
>>> [ 1.34985881 18.17414537 54.59815003]
>>> 74.1221542101633
>>> [0.01821127 0.24519181 0.73659691]

3.建立softmaxx函数:

def softmax(x):

    exp_x = np.exp(x)
    sum_exp_a = np.sum(exp_x)
    softmax = exp_x/sum_exp_a

    return softmax
x = np.array([0.3,2.9,4.0])
softmax = softmax(x)
print(softmax)
>>> [0.01821127 0.24519181 0.73659691]

4.softmaxx函数的溢出问题:

问题:

softmax函数的实现中要进行指数函数的运算,但是指数函数的值很容易变得非常大。如:e的10次方会超过2000,e的40次方会变成一个后面有40个0的超大值,如果这些超大值进行除法运算,结果会出现“不确定”的情况。

import numpy as np

x = np.array([1010,1000,990])
exp_x = np.exp(x)
sum_exp_x = np.sum(exp_x)
softmax = exp_x
>>> [nan nan nan]

解决方法:
在进行softmax函数时,加上或者减去某个常数并不会改变运算的结果,为了防止溢出问题,我们可以通过减去输入信号中的最大值来解决这个问题。

  • (1)
import numpy as np

x = np.array([1010,1000,990])
c = np.max(x)    #求取最大值
print(c)
x = x-c
print(x)
exp_x = np.exp(x)
sum_exp_x = np.sum(exp_x)
softmax = exp_x/sum_exp_x
print(softmax)
>>> 1010
>>> [  0 -10 -20]
>>> [9.99954600e-01 4.53978686e-05 2.06106005e-09]
  • (2)
def softmax(X):
    exp_x = np.exp(x-np.max(x))
    sum_exp_x = np.sum(exp_x)
    y = exp_x/sum_exp_x

    return y

x = np.array([1010,1000,990])
softmax = softmax(x)
print(softmax)
>>> [9.99954600e-01 4.53978686e-05 2.06106005e-09]
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐