Softmax函數(shù)原理及Python實(shí)現(xiàn)過程解析
Softmax原理
Softmax函數(shù)用于將分類結(jié)果歸一化,形成一個(gè)概率分布。作用類似于二分類中的Sigmoid函數(shù)。
對(duì)于一個(gè)k維向量z,我們想把這個(gè)結(jié)果轉(zhuǎn)換為一個(gè)k個(gè)類別的概率分布p(z)。softmax可以用于實(shí)現(xiàn)上述結(jié)果,具體計(jì)算公式為:
對(duì)于k維向量z來說,其中zi∈R,我們使用指數(shù)函數(shù)變換可以將元素的取值范圍變換到(0,+∞),之后我們?cè)偎性厍蠛蛯⒔Y(jié)果縮放到[0,1],形成概率分布。
常見的其他歸一化方法,如max-min、z-score方法并不能保證各個(gè)元素為正,且和為1。
Softmax性質(zhì)
輸入向量x加上一個(gè)常數(shù)c后求softmax結(jié)算結(jié)果不變,即:
我們使用softmax(x)的第i個(gè)元素的計(jì)算來進(jìn)行證明:
函數(shù)實(shí)現(xiàn)
由于指數(shù)函數(shù)的放大作用過于明顯,如果直接使用softmax計(jì)算公式
進(jìn)行函數(shù)實(shí)現(xiàn),容易導(dǎo)致數(shù)據(jù)溢出(上溢)。所以我們?cè)诤瘮?shù)實(shí)現(xiàn)時(shí)利用其性質(zhì):先對(duì)輸入數(shù)據(jù)進(jìn)行處理,之后再利用計(jì)算公式計(jì)算。具體使得實(shí)現(xiàn)步驟為:
- 查找每個(gè)向量x的最大值c;
- 每個(gè)向量減去其最大值c, 得到向量y = x-c;
- 利用公式進(jìn)行計(jì)算,softmax(x) = softmax(x-c) = softmax(y)
代碼如下:
import numpy as np def softmax(x): """ softmax函數(shù)實(shí)現(xiàn) 參數(shù): x --- 一個(gè)二維矩陣, m * n,其中m表示向量個(gè)數(shù),n表示向量維度 返回: softmax計(jì)算結(jié)果 """ assert(len(X.shape) == 2) row_max = np.max(X, axis=axis).reshape(-1, 1) X -= row_max X_exp = np.exp(X) s = X_exp / np.sum(X_exp, axis=axis, keepdims=True) return s
測(cè)試一下:
a = [[1,2,3],[-1,-2,-3]]
b = [[1,2,3]]
c = [1,2,3]
a = np.array(a)
b = np.array(b)
c = np.array(c)print(softmax(a))
print(softmax(b))
print(softmax(c)) # error
輸出結(jié)果為:
[[ 0.09003057 0.24472847 0.66524096]
[ 0.66524096 0.24472847 0.09003057]]
[[ 0.09003057 0.24472847 0.66524096]]
Traceback (most recent call last):
assert(len(X.shape) == 2)
AssertionError
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Django實(shí)現(xiàn)將一個(gè)字典傳到前端顯示出來
這篇文章主要介紹了Django實(shí)現(xiàn)將一個(gè)字典傳到前端顯示出來,具有很好的參考價(jià)值,希望2020-04-04Python PyQt5實(shí)現(xiàn)拖放效果的原理詳解
這篇文章主要為大家詳細(xì)介紹了Python PyQt5中拖放效果的實(shí)現(xiàn)原理與實(shí)現(xiàn)代碼,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-11-11詳解利用上下文管理器擴(kuò)展Python計(jì)時(shí)器
本文將和大家一起了解什么是上下文管理器?和?Python?的?with?語句,以及如何完成自定義。然后擴(kuò)展?Timer?以便它也可以用作上下文管理器,感興趣的可以了解一下2022-06-06Python實(shí)現(xiàn)變量數(shù)值交換及判斷數(shù)組是否含有某個(gè)元素的方法
這篇文章主要介紹了Python實(shí)現(xiàn)變量數(shù)值交換及判斷數(shù)組是否含有某個(gè)元素的方法,涉及Python字符串與數(shù)組的相關(guān)賦值、判斷操作技巧,需要的朋友可以參考下2017-09-09python--shutil移動(dòng)文件到另一個(gè)路徑的操作
這篇文章主要介紹了python--shutil移動(dòng)文件到另一個(gè)路徑的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07Python圖像運(yùn)算之圖像灰度直方圖對(duì)比詳解
本篇文章將結(jié)合直方圖分別對(duì)比圖像灰度變換前后的變化,方便大家更清晰地理解灰度變換和閾值變換,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-08-08Python設(shè)計(jì)模式之享元模式原理與用法實(shí)例分析
這篇文章主要介紹了Python設(shè)計(jì)模式之享元模式原理與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了享元模式的相關(guān)概念、原理、定義及使用方法,需要的朋友可以參考下2019-01-01