Python實(shí)現(xiàn)softmax反向傳播的示例代碼
概念
softmax函數(shù)是常用的輸出層函數(shù),常用來(lái)解決互斥標(biāo)簽的多分類問(wèn)題。當(dāng)然由于他是非線性函數(shù),也可以作為隱藏層函數(shù)使用
反向傳播求導(dǎo)
可以看到,softmax 計(jì)算了多個(gè)神經(jīng)元的輸入,在反向傳播求導(dǎo)時(shí),需要考慮對(duì)不同神經(jīng)元的參數(shù)求導(dǎo)。
分兩種情況考慮:
- 當(dāng)求導(dǎo)的參數(shù)位于分子時(shí)
- 當(dāng)求導(dǎo)的參數(shù)位于分母時(shí)

當(dāng)求導(dǎo)的參數(shù)位于分子時(shí):

當(dāng)求導(dǎo)的參數(shù)位于分母時(shí)(ez2 or ez3這兩個(gè)是對(duì)稱的,求導(dǎo)結(jié)果是一樣的):


代碼
import torch
import math
def my_softmax(features):
_sum = 0
for i in features:
_sum += math.e ** i
return torch.Tensor([ math.e ** i / _sum for i in features ])
def my_softmax_grad(outputs):
n = len(outputs)
grad = []
for i in range(n):
temp = []
for j in range(n):
if i == j:
temp.append(outputs[i] * (1- outputs[i]))
else:
temp.append(-outputs[j] * outputs[i])
grad.append(torch.Tensor(temp))
return grad
if __name__ == '__main__':
features = torch.randn(10)
features.requires_grad_()
torch_softmax = torch.nn.functional.softmax
p1 = torch_softmax(features,dim=0)
p2 = my_softmax(features)
print(torch.allclose(p1,p2))
n = len(p1)
p2_grad = my_softmax_grad(p2)
for i in range(n):
p1_grad = torch.autograd.grad(p1[i],features, retain_graph=True)
print(torch.allclose(p1_grad[0], p2_grad[i]))到此這篇關(guān)于Python實(shí)現(xiàn)softmax反向傳播的示例代碼的文章就介紹到這了,更多相關(guān)Python softmax 反向傳播內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
TFRecord格式存儲(chǔ)數(shù)據(jù)與隊(duì)列讀取實(shí)例
今天小編就為大家分享一篇TFRecord格式存儲(chǔ)數(shù)據(jù)與隊(duì)列讀取實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
20行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具的實(shí)現(xiàn)
這篇文章主要介紹了20行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Django 開發(fā)調(diào)試工具 Django-debug-toolbar使用詳解
這篇文章主要介紹了Django 開發(fā)調(diào)試工具 Django-debug-toolbar使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Python中使用socket發(fā)送HTTP請(qǐng)求數(shù)據(jù)接收不完整問(wèn)題解決方法
這篇文章主要介紹了Python中使用socket發(fā)送HTTP請(qǐng)求數(shù)據(jù)接收不完整問(wèn)題解決方法,本文使用一個(gè)循環(huán)解決了數(shù)據(jù)不完整問(wèn)題,需要的朋友可以參考下2015-02-02
python+mysql實(shí)現(xiàn)教務(wù)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+mysql實(shí)現(xiàn)教務(wù)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02

