pytorch中的autograd(自动求导)--backward()函数参数的意义

一. 标量,向量,矩阵,张量(tensor)的区别

张量:按照任意维排列的一堆数字的推广,标量,向量,矩阵都属于张量。
标量:0维的张量,如:0,1,2…
向量:1维的张量,如:(0,1,2,3)
矩阵:2维的张量,如:((1,2,3),(4,5,6),(7,8,9))

二. backward()函数参数的意义

1. tensor无法对tensor求导

若一个mxn的矩阵需要对于rxs的矩阵进行求导,则会得到一个mxnxrxs的矩阵,若需要对维度更高的tensor求导,结果的维度会更高,无法得到与输入相同大小的梯度
因此pytorch不允许对一维及以上的张量求导,需要将需求导的张量转换为一个标量后,再进行求导。

2. 将带待求导的tensor转换为标量

#函数原型
torch.autograd.backward(tensors,grad_tensors=None,retain_graph=None,
	create_graph=False,grad_variables=None)
	
#eg1:z为tensor,需转换为标量
import torch
x = torch.randn(3,3,requires_grad=True)
y = torch.randn(3,3,requires_grad=True)

z = x*y
z.backward(torch.ones_like(z),retain_graph=True)

#eg1:z为标量,不需转换
x = torch.tensor([2.0],dtype = torch.float32,requires_grad=True)
y = torch.tensor([3.0],dtype = torch.float32,requires_grad=True)

z = x*y
z.backward(retain_graph=True)

若待求导的tensor z是标量,则无需添加tensors参数。
若待求导的tensor z不是标量,需要添加tensors参数,且参数必须与为与z大小相同tensor,将该tensor与z进行加权求和。
一般取zeros_like(z),即对z求和,作为loss值–标量,将z这个tensor对x,y两个tensor求导转化为loss标量对x,y两个tensor求导。

你可能感兴趣的:(深度学习,pytorch,神经网络,人工智能)