前言:前面介绍了pytorch自动求导的一些基本操作和概念,本文续接上一篇,会继续深入介绍pytorch的自动求导相关的注意事项。上一篇文章参见:pytorch自动求导Autograd系列教程(一)
1.1 方法一:通过 torch.autograd.backward()求导
前面介绍的求导的基本公式为:
y.backward(grad_tensors=None, retain_graph=None, create_graph=False),这三个参数我在前面的文章里面已经说了,
参考前面的第一篇文章,反向求导它等价于:
torch.autograd.backward(tensors,grad_tensors=None, retain_graph=None, create_graph=False), 这里的tensors参数就相当于是y,
所以:
y.backward() #标量y 等价于
torch.autograd.backward(y)。
需要注意的是,这个函数只是提供求导功能,并不返回值,返回的总是None,如下例子:
import torch
x=torch.tensor([1.0,2.0,3.0],requires_grad=True)
y=torch.tensor([4.0,5.0,6.0],requires_grad=True)
z=torch.sum(torch.pow(x,2)+torch.pow(y,3)) # z=x2+y3
torch.autograd.backward([z]) # 求导,等价于z.backward()
print(x.grad) # 获取求导的结果
print(y.grad)
'''
tensor([2., 4., 6.])
tensor([ 48., 75., 108.])
'''
注意事项:
(1)该方法只负责求导,返回的总是None,
(2)当向量对向量求导的时候,需要传递参数grad_tensor,这个参数的含义其实和前一篇文章的y.backward()里面的那个是一个含义;
(3)retain_graph=None, create_graph=False 也和前面的含义是一样的
1.2 方法二:通过torch.autograd.
grad
()来求导
除了前面的两种方法来求导以外,即
y.backward()
torch.autograd.backward(y) 这两种方法
还有一种方法,即通过torch.autograd.
grad
()来求导,先来看一下这个函数的定义。
def grad(outputs, inputs, grad_outputs=None, retain_graph=None, create_graph=False,
only_inputs=True, allow_unused=False):
'''
outputs : 函数的因变量,即需要求导的那个函数,在本例子中,为z,当然,他可以是一个tensor,也可以是几个tensor,如[tensor1,tensor2,tensor3...]
inputs : 函数的自变量,在本例中,即对应的是[x,y],他可以是一个tensor,也可以是几个tensor,如[tensor1,tensor2,tensor3...]
grad_output : 这个参数和前面两种方法中的grad_tensors是同样的含义,当出现向量对向量求导的时候需要指定该参数
'''
依然以这个例子而言,来看一下怎么做:
import torch
x=torch.tensor([1.0,2.0,3.0],requires_grad=True)
y=torch.tensor([4.0,5.0,6.0],requires_grad=True)
z=torch.sum(torch.pow(x,2)+torch.pow(y,3)) # z=x2+y3
print(torch.autograd.grad(z,[x,y])) # 求导,并且返回值
'''
(tensor([2., 4., 6.]), tensor([ 48., 75., 108.]))
'''
注意事项:
该函数会自动完成求导过程,而且会自动返回对于每一个自变量求导的结果。这是和前面不一样的地方。