【深度学习】pytorch自动求导

使用pytorch进行自动求导

import torch

# 设置x的值
x = torch.arange(4.0)
# 把结果(梯度)存储在x中,计算之后可以直接在x中拿到(x.grad)。x.grad默认是None
x.requires_grad_(True)
# 计算y
y = 2 * torch.dot(x,x)
# 求梯度(y对x每一个分量的偏导)。torch会先构造计算图,然后把x代入计算图中,得到梯度。计算图使用的方法是反向传递.
y.backward()
# 结果是正确的
print(x.grad)
结果:
tensor([ 0.,  4.,  8., 12.])

接下来,计算x在另一个函数中的梯度。注意:在上一个函数中已经把梯度存储在x中,使用这个x计算下一个函数的梯度时,要把x中存储的梯度清空,因为pytorch会默认累积梯度。

import torch

# 设置x的值
x = torch.arange(4.0)
# 把结果(梯度)存储在x中,计算之后可以直接在x中拿到(x.grad)。x.grad默认是None
x.requires_grad_(True)
# 计算y
y = 2 * torch.dot(x,x)
# 求梯度。torch会先构造计算图,然后把x代入计算图中,得到梯度。计算图使用的方法是反向传递
y.backward()
# 结果是正确的
print(x.grad)

# 计算下一个函数,首先需要清空梯度
x.grad.zero_()
y = x.sum()
y.backward()
print(x.grad)
结果是:
tensor([ 0.,  4.,  8., 12.])
tensor([1., 1., 1., 1.])

上述计算中,当x通过pytorch内置的一些运算得到y的时候,其实计算图就已经被构建起来了。如果在计算中,希望某些计算可以脱离它的计算图(就是自定义一些中间变量,这些中间变量不要包含在计算图中),可以这样做:

import torch

x = torch.arange(4.0)
x.requires_grad_(True)
y = (x * x) * x
y.sum().backward()
print(x.grad)

x.grad.zero_()
# 使用.detach()将(x * x)从计算图中脱离。程序会将(x * x)视为常量
y = (x * x).detach() * x
y.sum().backward()
print(x.grad)
结果是:
tensor([ 0.,  3., 12., 27.])
tensor([0., 1., 4., 9.])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值