使用pytorch进行自动求导
import torch
# 设置x的值
x = torch.arange(4.0)
# 把结果(梯度)存储在x中,计算之后可以直接在x中拿到(x.grad)。x.grad默认是None
x.requires_grad_(True)
# 计算y
y = 2 * torch.dot(x,x)
# 求梯度(y对x每一个分量的偏导)。torch会先构造计算图,然后把x代入计算图中,得到梯度。计算图使用的方法是反向传递.
y.backward()
# 结果是正确的
print(x.grad)
结果:
tensor([ 0., 4., 8., 12.])
接下来,计算x在另一个函数中的梯度。注意:在上一个函数中已经把梯度存储在x中,使用这个x计算下一个函数的梯度时,要把x中存储的梯度清空,因为pytorch会默认累积梯度。
import torch
# 设置x的值
x = torch.arange(4.0)
# 把结果(梯度)存储在x中,计算之后可以直接在x中拿到(x.grad)。x.grad默认是None
x.requires_grad_(True)
# 计算y
y = 2 * torch.dot(x,x)
# 求梯度。torch会先构造计算图,然后把x代入计算图中,得到梯度。计算图使用的方法是反向传递
y.backward()
# 结果是正确的
print(x.grad)
# 计算下一个函数,首先需要清空梯度
x.grad.zero_()
y = x.sum()
y.backward()
print(x.grad)
结果是:
tensor([ 0., 4., 8., 12.])
tensor([1., 1., 1., 1.])
上述计算中,当x通过pytorch内置的一些运算得到y的时候,其实计算图就已经被构建起来了。如果在计算中,希望某些计算可以脱离它的计算图(就是自定义一些中间变量,这些中间变量不要包含在计算图中),可以这样做:
import torch
x = torch.arange(4.0)
x.requires_grad_(True)
y = (x * x) * x
y.sum().backward()
print(x.grad)
x.grad.zero_()
# 使用.detach()将(x * x)从计算图中脱离。程序会将(x * x)视为常量
y = (x * x).detach() * x
y.sum().backward()
print(x.grad)
结果是:
tensor([ 0., 3., 12., 27.])
tensor([0., 1., 4., 9.])