softmax

"""
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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值