Python实现softmax函数及注意事项

本文摘自《深度学习入门:基于Python的理论与实现》一书。

1. Softmax函数

分类问题中使用的softmax函数可以用下式表示:
在这里插入图片描述
期中, e x p ( x ) exp(x) exp(x)是表示 e x e^x ex 的指数函数 (e是纳皮尔常数2.7182 … )

s o f t m a x softmax softmax函数的分子是输入信号 a k a^k ak 的指数函数,分母是所有输入信号的指数函数的和。

2. 代码实现

def softmax(a):
	exp_a = np.exp(a)
	sum_exp_a = np.sum(exp_a)
	y = exp_a / sum_exp_a
	
	return y

3.注意事项

softmax 函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。比如, e 10 e^{10} e10 的值 会超过 20000, e 100 e^{100} e100 会变成一个后面有 40 多个 0 的超大值, e 1000 e^{1000} e1000 的结果会返回 一个表示无穷大的 inf。

例如:

>>> a = np.array([1010, 1000, 990]) 
>>> np.exp(a) / np.sum(np.exp(a))   # softmax函数的运算 
array([ nan,  nan,  nan])

改进:
(在进行softmax 的指数函数的运算时,加上 ( 或者减去 ) 某个常数并不会改变运算的结果。)
在这里插入图片描述
最终代码实现:

import numpy as np
def softmax(x):
    c = np.max(x)
    exp_a = np.exp(x - c)    # 溢出对策
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
    
    return y
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值