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

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

概念

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

标签:Python,softmax,反向传播
0
投稿

猜你喜欢

  • python实现百度关键词排名查询

    2023-01-19 12:26:58
  • 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    2023-06-04 19:17:50
  • python Django编写接口并用Jmeter测试的方法

    2021-12-07 21:47:09
  • opencv-python 开发环境的安装、配置教程详解

    2022-04-25 22:14:58
  • Python3实现的字典、列表和json对象互转功能示例

    2022-11-10 11:04:51
  • 使用python制作游戏下载进度条的代码(程序说明见注释)

    2023-06-15 00:39:52
  • 解析python的局部变量和全局变量

    2023-08-23 18:17:01
  • python调用百度语音识别api

    2023-02-13 10:23:48
  • vue实现购物车加减

    2023-07-02 17:10:04
  • python 提高开发效率的5个小技巧

    2022-05-11 00:55:09
  • python实现简单聊天应用 python群聊和点对点均实现

    2023-01-16 08:35:55
  • vue使用element-resize-detector监听元素宽度变化方式

    2024-05-29 22:29:26
  • vue实现评论列表功能

    2023-07-02 17:05:29
  • 使用Python写一个贪吃蛇游戏实例代码

    2023-07-05 18:25:02
  • ASP XML编程objXML.async = False

    2011-04-21 10:55:00
  • 详解Docker创建Mysql容器并通过命令行连接到容器

    2024-01-24 22:25:18
  • 菜鸟大讲堂:如何查看mysql版本的四种方法

    2009-09-05 09:54:00
  • JS不同加载方式下的window.onload

    2009-05-21 18:09:00
  • Python利用FlashText算法实现替换字符串

    2023-05-17 06:18:11
  • asp如何在本地机器上创建缓存?

    2010-06-18 19:27:00
  • asp之家 网络编程 m.aspxhome.com