"""
softmax:y=exp(ak)/sum(exp(ak)) 可以做神经网络中的激活函数或者分类器(一般来说作为分类器的较多)
其中a表示神经元,k表示第k个神经元。而sum表示所有神经元,是求和的意思。
在计算机进行计算时由于一种四舍五入的操作,可能会导致一种毁灭性的舍入误差,即接近0的数被四舍五入为0.
在这种情况下倘若该数为分母,则会出现下溢现象,部分软件将会抛出NaN异常的占位符。
遇到这样的情况,通常可以考虑改变softmax,将其中的ak改成ak-ak(max)
"""
from numpy import *
""" 简单的softmax测试 """
a = array([3, 6, 9])
exp_a = exp(a)
print("a:", a, "exp_a:", exp_a)
sum_a = sum(exp_a)
print("sum_a:", sum_a)
softmax_a = exp_a / sum_a
print("softmax_a:", softmax_a)
sum_softmax = sum(softmax_a)
print("sum_softmax:", sum_softmax)
# a: [3 6 9] exp_a: [ 20.08553692 403.42879349 8103.08392758]
# sum_a: 8526.598257991307
# softmax_a: [0.00235563 0.04731416 0.95033021]
# sum_softmax: 1.0
""" 定义softmax函数 """
def softmax(x):
exp_x = exp(x)
sum_exp_x = sum(exp_x)
y = exp_x / sum_exp_x
return y
x = array([3, 6, 9])
print(softmax(x))
def softmax_1(n):
return lambda n: n / sum(n)
n = array([3, 6, 9])
n_exp = exp(n)
print(softmax_1(n_exp))
# <function softmax_1.<locals>.<lambda> at 0x00000218E89C9AE8> 这里得到的结果是地址,也不知道为什么。
""" softmax 的溢出问题:四舍五入的误差(NaN) 下溢; 无限接近于无穷大的上溢(inf) """
a_1 = array([1010, 900, 1000])
# exp_a_1 = exp(a_1) / sum(exp(a_1))
# print("exp_a_1:", exp_a_1) # exp_a_1: [nan nan nan]
c = max(a_1) # 1010
a_2 = a_1 - c
print("c:", c)
print("a_2:", a_2) # a_2: [ 0 -110 -10]
exp_a_2 = exp(a_2) / sum(exp(a_2))
print("exp_a_2:", exp_a_2) # exp_a_2: [9.99954602e-01 1.68883521e-48 4.53978687e-05]
softmax
最新推荐文章于 2024-08-21 09:48:53 发布