[PyTorch] 笔记02:Autograd 自动求导

tech2022-12-05  102

源自 PyTorch 1.4教程

Outline

Tensortorch.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是否是叶子节点。

参见Pytorch autograd,backward详解

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,则需要将该参数设置为Truecreate_graph: 当设置为True的时候可以用来计算更高阶的梯度

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】Tensor和tensor的区别

下节写如何构建神经网络

欢迎批评指正,一起学习进步!!!

最新回复(0)