Pytorch自动求梯度详解

自动求梯度

Tensor

import torch
import numpy as np

创建一个Tensor,并设置requires_grad=True

x=torch.ones(2,2,requires_grad=True)
print(x)
print(x.grad_fn)
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
None
y=x+2
print(y)
print(y.grad_fn)
tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)
<AddBackward0 object at 0x000002B8D5235E88>
print(x.is_leaf,y.is_leaf)
True False
z=y*y*3
out=z.mean()
print(z,out)
tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)

通过.requires_grad_()来用in-place的方式改变requires_grad属性:

a=torch.randn(2,2)# 缺失情况下默认 requires_grad=False
a=((a*3)/(a-1))
print(a.requires_grad)

a.requires_grad_(True)
print(a.requires_grad)

b=(a*a).sum()
print(b.grad_fn)
False
True
<SumBackward0 object at 0x000002B8E09AC188>

梯度

out.backward() #等价于out.backward(torch.tensor(1.))
None

out关于x的梯度

print(x.grad)
tensor([[13.5000, 13.5000],
        [13.5000, 13.5000]])

梯度会累加,因此每次反向传播前应该将梯度清零

out2=x.sum()
out2.backward()
print(x.grad)

out3=x.sum()
x.grad.data.zero_()
out3.backward()
print(x.grad)
tensor([[15.5000, 15.5000],
        [15.5000, 15.5000]])
tensor([[1., 1.],
        [1., 1.]])

示例:

x=torch.tensor([1.0,2.0,3.0,4.0],requires_grad=True)
y=2*x
z=y.view(2,2)
print(z)
tensor([[2., 4.],
        [6., 8.]], grad_fn=<ViewBackward>)
v=torch.tensor([[1.0,0.1],[0.01,0.001]],dtype=torch.float)
z.backward(v)
print(x.grad)
tensor([2.0000, 0.2000, 0.0200, 0.0020])

中断梯度追踪的例子

x=torch.tensor(1.0,requires_grad=True)
y1=x**2
with torch.no_grad(): # y2被no_grad包裹,y2梯度不会回传
    y2=x**2
y3=y1+y2

print(x.requires_grad)
print(y1.requires_grad)
print(y2.requires_grad)
print(y3.requires_grad)
True
True
False
True
y3.backward()
print(x.grad)
tensor(2.)
x=torch.ones(1,requires_grad=True)

print(x.data)
print(x.data.requires_grad)

y=2*x
x.data*=100

y.backward()
print(x)
print(x.grad)
tensor([1.])
False
tensor([100.], requires_grad=True)
tensor([2.])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值