神经网络输出层设计之softmax函数
softmax函数的实现中要进行指数函数的运算,但是指数函数的值很容易变得非常大。如:e的10次方会超过2000,e的40次方会变成一个后面有40个0的超大值,如果这些超大值进行除法运算,结果会出现“不确定”的情况。在进行softmax函数时,加上或者减去某个常数并不会改变运算的结果,为了防止溢出问题,我们可以通过。图式公式可以理解为:假设输出层共有n个神经元,计算第k个神经元的输出y。其中,ex
·
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]
更多推荐
所有评论(0)