网络编程
位置:首页>> 网络编程>> Python编程>> Python实现softmax反向传播的示例代码

Python实现softmax反向传播的示例代码

作者:SugerOO  发布时间:2021-02-24 10:54:02 

标签:Python,softmax,反向传播

概念

softmax函数是常用的输出层函数,常用来解决互斥标签的多分类问题。当然由于他是非线性函数,也可以作为隐藏层函数使用

反向传播求导

可以看到,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]))

来源:https://blog.csdn.net/SugerOO/article/details/130032515

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com