softmax函数以及Python实现
softmax函数
softmax函数一般用于分类问题的输出层。
分类问题中使用的softmax函数的表现形式如下
exp(x)是表示ex的指数函数,上面的式子表示假设输出层共有n个神经元,计算第k个神经元的输出y k。分子是输入信号ak的指数函数,分母是所有输入信号的指数函数的和。
如果用图表示softmax函数的话,如下图。softmax函数的输出通过箭头与所有的输入信号相连。这是因为重softmax函数的式子可以看出,分母是需要所有的输入信号的加和。所以输出层的各个神经元都受到所有输入信号的影响。
softmax函数的Python实现
# softmax函数的Python实现
# 这个Python的实现完全是依照上面的式子来写的
a = np.array([0.3, 2.9, 4.0])
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
# 其每一步运行的结果可如下图
如果要经常使用softmax函数的话,可以把他定义成一个函数
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
实现softmax函数时的注意事项
所以softmax函数的实现可以进行如下改进。
对改进的解释
通过上面的例子所示,通过减去输入信号中的最大值,我们发现原来为nan的值(无法计算的值),现在被正确的计算了。综上我们就重新修改了softmax的实现函数
在这里插入代码片
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c) # 解决exp计算溢出问题
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
由于softmax函数最终输出的每一个类别的大小就对应上一层输入的大小,所以一般在进行分类的时候就不用softmax,但是在进行学习建立模型的时候还是需要softmax函数这一层的。