pytorch反向求导

#https://baijiahao.baidu.com/s?id=1673295674426968644&wfr=spider&for=pc

构建深度学习模型的基本流程就是:搭建计算图,求得损失函数,然后计算损失函数对模型参数的导数,再利用梯度下降法等方法来更新参数。搭建计算图的过程,称为“正向传播”,这个是需要我们自己动手的,因为我们需要设计我们模型的结构。由损失函数求导的过程,称为“反向传播”,

初识求导

import torch
x = torch.tensor(4.0,requires_grad=True)
x.requires_grad_(True)
y = torch.pow(x,2)
y.backward()
x.grad

tensor的创建与属性设置

tensor(data, dtype=None, device=None, requires_grad=False) -> Tensor

在tensor创建方法中有个requires_grad参数,这是表示tensor是否开启求导选项.默认是关闭的,这个参数是可以传递的例如:

import torch
x = torch.tensor([2.4,4.2],requires_grad=True)
y = torch.pow(x,2)
y.requires_grad

上面结果输出为True,当然也可以通过requires_grad_()方法设置

import torch
x =torch.arange(4.0)
print(x.requires_grad)
x.requires_grad_(True)
print(x.requires_grad)

backwrad函数详解

backward(gradient=None, retain_graph=None, create_graph=False)
规则

在pytorch里面,默认:只能是【标量】对【标量】,或者【标量】对[向量/矩阵】求导。标量可以理解为数字,向量和矩阵理解为多维数组,
上面的例子都是标量对标量求导,下来在举一个标量对向量求导。

import torch
X = torch.randn(4)
W = torch.normal(0,0.01,(4,1)).reshape(4)
W.requires_grad_(True)
y = torch.dot(X,W)
y.backward()
W.grad

上面做了一个y=X*W的计算,其中X和W都是一个向量

如果我们需要向量对向量求导,那该怎么办呢?

向量对向量求导–gradient

这是就需要使用backward参数gradient了。

X = torch.arange(4.0)
X.requires_grad_(True)
y = X *X
y.backward(torch.ones_like(y))
X.grad

需要注意的是,gradient的维度是和最终的需要求导的那个y的维度是一样的,

保留运算图——retain_graph

下面是一张计算图
在这里插入图片描述

一个计算图在进行反向求导之后,为了节省内存,这个计算图就销毁了。 如果你想再次求导,就会报错

x = torch.arange(4.0)
x.requires_grad_(True)
y = 2 * x
p = torch.pow(y,2).sum()
p.backward()
p.backward()

上面第二次执行的p.backward()就会报错,当在第一个p.backward()中加retain_graph=True就不会报错,表示在执行backwark之后不会删除计算图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值