当前位置: 首页 > news >正文

Pytorch基础入门3

目录

  • 4:自动微分
    • 4.1:backward求导
    • 4.2: autograd.grad求导

4:自动微分

神经网络依赖反向传播求梯度来更新网络的参数,求梯度是个非常复杂的过程,在Pytorch中,提供了两种求梯度的方式,一个是backward,将求得的结果保存在自变量的grad属性中,另外一种方式是torch.autograd.grad。

4.1:backward求导

使用backward进行求导。这里主要介绍了求导的两种对象,标量Tensor和非标量Tensor的求导。两者的主要区别是非标量Tensor求导的主要区别是加了一个gradient的Tensor,其尺寸与自变量X的尺寸一致。在求完导后,需要与gradient进行点积,所以只是一般的求导的话,设置的参数全部为1。最后还有一种使用标量的求导方式解决非标量求导,只需了解。

# 标量Tensor求导
# 求 f(x) = a*x**2 + b*x + c 的导数
import numpy as np 
import torch 
x = torch.tensor(-2.0,requires_grad=True)
a = torch.tensor(1.0)
b = torch.tensor(2.0)
c = torch.tensor(3.0)
y= a*torch.pow(x,2) + b*x +c 
y.backward() ##backward求的梯度会存储在自变量x的grad属性中
dy_dx =x.grad
print(dy_dx)# 非标量Tensor求导
# 求 f(x) = a*x**2 + b*x + c 的导数
x = torch.tensor([[-2.0,-1.0],[0.0,1.0]], requires_grad=True)
a = torch.tensor(1.0)
b = torch.tensor(2.0)
c = torch.tensor(3.0)
gradient=torch.tensor([[1.0,1.0],[1.0,1.0]])
y = a*torch.pow(x,2)+b*x+c
y.backward(gradient=gradient) 
dy_dx_new =x.grad 
print(dy_dx_new)# 使用标量求导方式解决非标量求导
# 求 f(x) = a*x**2 + b*x + c 的导数
x = torch.tensor([[-2.0,-1.0],[0.0,1.0]], requires_grad=True)
a = torch.tensor(1.0)
b = torch.tensor(2.0)
c = torch.tensor(3.0)
gradient=torch.tensor([[1.0,1.0],[1.0,1.0]])
y = a*torch.pow(x,2)+b*x+c
z=torch.sum(y*gradient)
z.backward()
dy_dx_new1=x.grad
print(dy_dx_new1)

结果如下:

tensor(-2.)
tensor([[-2.,  0.],[ 2.,  4.]])
tensor([[-2.,  0.],[ 2.,  4.]])

4.2: autograd.grad求导

import torch#单个自变量求导
# 求 f(x) = a*x**4 + b*x + c 的导数
x = torch.tensor(1.0, requires_grad=True)
a = torch.tensor(1.0)
b = torch.tensor(2.0)
c = torch.tensor(3.0)
y = a * torch.pow(x, 4) + b * x + c
#create_graph设置为True,允许创建更高阶级的导数
#求一阶导
dy_dx = torch.autograd.grad(y, x, create_graph=True)[0]
#求二阶导
dy2_dx2 = torch.autograd.grad(dy_dx, x, create_graph=True)[0]
#求三阶导
dy3_dx3 = torch.autograd.grad(dy2_dx2, x)[0]
print(dy_dx.data, dy2_dx2.data, dy3_dx3)# 多个自变量求偏导
x1 = torch.tensor(1.0, requires_grad=True)
x2 = torch.tensor(2.0, requires_grad=True)
y1 = x1 * x2
y2 = x1 + x2
#只有一个因变量,正常求偏导
dy1_dx1, dy1_dx2 = torch.autograd.grad(outputs=y1, inputs=[x1, x2], retain_graph=True)
print(dy1_dx1, dy1_dx2)
# 若有多个因变量,则对于每个因变量,会将求偏导的结果加起来
dy1_dx, dy2_dx = torch.autograd.grad(outputs=[y1, y2], inputs=[x1, x2])
print(dy1_dx, dy2_dx)

结果如下:

tensor(6.) tensor(12.) tensor(24.)
tensor(2.) tensor(1.)
tensor(3.) tensor(2.)

文章转载自:

http://pTDtgA70.fxpyt.cn
http://nIU0NpnB.fxpyt.cn
http://yJipMU9F.fxpyt.cn
http://vn3AIo1A.fxpyt.cn
http://X9CXsZXS.fxpyt.cn
http://GsoJ1MDK.fxpyt.cn
http://9mKhLasV.fxpyt.cn
http://hGgH14NL.fxpyt.cn
http://9TJV56Bq.fxpyt.cn
http://fYm50IIF.fxpyt.cn
http://TF4Aiqql.fxpyt.cn
http://BfpClV60.fxpyt.cn
http://X07OQ0By.fxpyt.cn
http://G0Ry23b7.fxpyt.cn
http://dpLK9meL.fxpyt.cn
http://Ae0eahje.fxpyt.cn
http://uehVX3cd.fxpyt.cn
http://OMdP3w56.fxpyt.cn
http://vWy9XdOH.fxpyt.cn
http://g18yEzE8.fxpyt.cn
http://6WPMCc0u.fxpyt.cn
http://uOcqSV25.fxpyt.cn
http://ZEX0RteE.fxpyt.cn
http://1p52AQuk.fxpyt.cn
http://UoHjN3RB.fxpyt.cn
http://gc5ilHiJ.fxpyt.cn
http://tZY8Zuu8.fxpyt.cn
http://AKqjI6zN.fxpyt.cn
http://WtUGvVUv.fxpyt.cn
http://sB7omcyx.fxpyt.cn
http://www.dtcms.com/a/375815.html

相关文章:

  • ARM-指令集全解析:从基础到高阶应用
  • ARM 汇编学习
  • 今天继续昨天的正则表达式进行学习
  • Mysql集群——MHA高可用架构
  • 【一包通刷】晶晨S905L(B)/S905L2(B)/S905L3(B)-原机安卓4升级安卓7/安卓9-通刷包
  • SYSTEM 提权面板:提升文件运行权限的高效工具
  • 【Python】S1 基础篇 P6 用户交互与循环控制:构建动态交互程序
  • Java 数据类型详解
  • java常见SSL bug解决方案
  • JAVA stream().flatMap()
  • 【C++】string类 - 库中的常见使用
  • Go语言基础---数据类型间的故事
  • 金融量化指标--6InformationRatio信息比率
  • GPT Server 文档
  • CDN加速带来的安全隐患及应对方法
  • HCL Unica+:AI驱动的营销自动化与个性化平台
  • spring事务管理之@Transactional
  • golang之go modules
  • 设计UIUC SE 423机电一体化的机器人
  • 《Vuejs设计与实现》第 15 章(编译器核心技术)上
  • (二)文件管理-文件查看-more命令的使用
  • IntelliJ IDEA双击Ctrl的妙用
  • cfshow-web入门-php特性
  • libvirt 新手指南:从零开始掌握虚拟化管理
  • Oracle打补丁笔记
  • 【JavaEE】(24) Linux 基础使用和程序部署
  • TENGJUN防水TYPE-C连接器:工业级防护,认证级可靠,赋能严苛场景连接
  • Spring MVC 的常用注解
  • 肺炎检测系统
  • ctfshow-web-SSTI模版注入