如何在Python中實現softmax反向傳播。

WBOY
發布: 2023-05-09 08:05:53
轉載
1215 人瀏覽過

反向傳播求導

可以看到,softmax 計算了多個神經元的輸入,在反向傳播求導時,需要考慮不同神經元的參數求導。

分兩種情況考慮:

  • 當求導的參數位於分子時

  • 當求導的參數位於分母時

如何在Python中實現softmax反向傳播。

#當求導的參數位於分子時:

如何在Python中實現softmax反向傳播。

當求導的參數位於分母時(ez2 or ez3這兩個是對稱的,求導結果是一樣的):

如何在Python中實現softmax反向傳播。

如何在Python中實現softmax反向傳播。

程式碼

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]))
登入後複製

以上是如何在Python中實現softmax反向傳播。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板