[PyTorch] 笔记02:Autograd 自动求导
程序员文章站
2022-04-04 23:51:55
...
源自 PyTorch 1.4教程
Outline
- Tensor
- torch.autograd.backward
- 若结果节点为标量
- 若结果节点为矢量
[PyTorch] 笔记02:Autograd 自动求导
PyTorch中,所有神经网络的核心是 autograd 包
1 Tensor
-
torch.Tensor 是这个autograd的核心类
-
一个张量Tensor通常记录的属性如下:
- data:存储的数据信息
- requires_grad: 设置为True则表示该Tensor需要求导
- grad: 该Tensor的梯度值,每次在计算backward时都需要将前一时刻的梯度归零,否则梯度值会一直累加
- grad_fn: 叶子节点(即自变量)通常为None,只有结果节点(即因变量)的grad_fn才有效,用于指示梯度函数是哪种类型。
- is_leaf: 用来指示该Tensor是否是叶子节点。
- requires_grad=True
- 追踪对应张量的所有操作
- 默认requires_grad为Flase
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
#输出
False
True
- .detach() 方法
- 阻止张量被追踪
- 调用 .detach() 方法将其与计算历史分离,并阻止它未来的计算记录被跟踪
- with torch.no_grad():
- 为了防止跟踪历史记录(和使用内存),可以将代码块包装在 with torch.no_grad(): 中
- grad_fn
- 只有因变量有其属性
x=torch.tensor(1.0,requires_grad=True)
y=torch.tensor(2.0,requires_grad=True)
z=x+y
print(x,y,z)
#输出
tensor(1., requires_grad=True) tensor(2., requires_grad=True) tensor(3., grad_fn=<AddBackward0>)
2 torch.autograd.backward
源代码接口
torch.autograd.backward(
tensors,
grad_tensors=None,
retain_graph=None,
create_graph=False)
- 参数含义
- tensor: 用于计算梯度的tensor
torch.autograd.backward(tensor) 与 tensor.backward()写法等价 - grad_tensors: 在计算矩阵的梯度时会用到。他其实也是一个tensor,shape一般需要和前面的tensor保持一致
- retain_graph: 通常在调用一次backward后,pytorch会自动把计算图销毁,所以要想对某个变量重复调用backward,则需要将该参数设置为True
- create_graph: 当设置为True的时候可以用来计算更高阶的梯度
- tensor: 用于计算梯度的tensor
2.1 若结果节点为标量
- 标量可理解为一维的
- 直接应用backward即可
- 参考示例如下:
x=torch.tensor(3.0,requires_grad=True)
y=torch.tensor(7.0,requires_grad=True)
z=x+y
z.backward()
#返回x,y的梯度,z的值
print(x.grad,y.grad,z)
#输出
tensor(1.) tensor(1.) tensor(10., grad_fn=<AddBackward0>)
2.2 若结果为矢量
- 矢量可理解为高维,多维
- 参考了pytorch中文文档和知乎的文章,感觉知乎的文章更好理解,但其本质上是一样的,即传入一个与前面张量tensor相同的一个张量
- 参考示例如下:
x=torch.ones(4,requires_grad=True) #x=[x1,x2,x3,x4]
#print(x.type()) torch.FloatTensor
z=x+2 #z=[x1+2,x2+2,x3+2,x4+2]
#若传入的都是1
z.backward(torch.ones_like(z))
#若传入的是自己设定的
#z.backward(torch.Tensor([1,2,3,4])) #z=[x1+2,2(x2+2),3(x3+2),4(x4+2)] 注意类型的匹配 Tensor默认为torch.FloatTensor型
#z.backward(torch.tensor([1.,2.,3.,4.])) #z=[x1+2,2(x2+2),3(x3+2),4(x4+2)]
print(x.grad)
#输出
tensor([1., 1., 1., 1.])
#tensor([1., 2., 3., 4.])
在写的过程中发现tensor和Tensor原来是不一样的
- torch.Tensor
- 默认的tensor类型(torch.FlaotTensor)的简称
- torch.tensor
- 根据后面的data创建Tensor,Tensor类型根据数据进行推断。
下节写如何构建神经网络
欢迎批评指正,一起学习进步!!!
推荐阅读
-
pytorch代码示例笔记 -- Autograd
-
PyTorch 的 自动求导(Autograd)
-
详解pytorch中的自动求导Autograd,彻底理解gradient参数
-
PyTorch自动求导:Autograd包案例详解
-
【教程|60分钟快速入门】02-Autograd:自动微分
-
2 PyTorch 官网教材之 autograd 自动微分
-
Autograd:Pytorch 中的自动微分机制讲解
-
pytorch中的Autograd(自动微分)
-
PyTorch - Autograd: Automatic Differentiation(自动微分)
-
【Pytorch】2 Autograd 自动微分