创建可以求导的张量
# create a tensor and requires grad
x = torch.tensor(1.).requires_grad_(True)
x = torch.tensor(1., requires_grad=True) # second choice
后向传播的使用
x = torch.tensor(2., requires_grad=True)
a = torch.add(x, 1)
b = torch.add(x, 2)
y = torch.mul(a, b)
y.backward()
print(x.grad)
autograd的基本使用
x = torch.tensor(2., requires_grad=True)
a = torch.add(x, 1)
b = torch.add(x, 2)
y = torch.mul(a, b)
grad = torch.autograd.grad(outputs=y, inputs=x)
print(grad[0])
如果对不同的变量求导要有一个retain_graph的操作,也就是说保存原本的计算图
x = torch.tensor(2.).requires_grad_()
y = torch.tensor(3.).requires_grad_()
z = x * x * y
grad_x = torch.autograd.grad(outputs=z, inputs=x, retain_graph=True)
grad_y = torch.autograd.grad(outputs=z, inputs=y)
print(grad_x[0], grad_y[0])
如果要对高阶导数那么需要创建一个低阶导数的计算图
x = torch.tensor(2.).requires_grad_()
y = torch.tensor(3.).requires_grad_()
z = x * x * y
grad_x = torch.autograd.grad(outputs=z, inputs=x, create_graph=True)
grad_xx = torch.autograd.grad(outputs=grad_x, inputs=x)
print(grad_xx[0])
如果要向量对向量求导,得到的是一个矩阵,需要和一个向量相乘才能得到一个向量。所以需要一个grad_outputs的操作
x = torch.tensor([1., 2.]).requires_grad_()
y = x * x
grad_x = torch.autograd.grad(outputs=y,
inputs=x, grad_outputs=torch.ones_like(y))
print(grad_x[0])
如果要阻断对于某一个变量的求导,那么需要一个detach的操作
x = torch.tensor([2.], requires_grad=True)
a = torch.add(x, 1).detach()
b = torch.add(x, 2)
y = torch.mul(a, b)
y.backward()
当两个张量不存在关系的时候,求导就会报错。为了避免报错,可以加一条allow_unused=True
x = torch.tensor([2.], requires_grad=True)
y = torch.tensor([2.], requires_grad=True)
grad_x = torch.autograd.grad(outputs=y, inputs=x,
grad_outputs=torch.ones_like(y),allow_unused=True)
print(grad_x[0])
本文通过多个实例介绍PyTorch中自动求导机制的使用方法,包括创建可求导张量、进行后向传播、对不同变量求导、高阶导数计算及向量对向量求导等,并演示了如何避免错误和特殊操作。
9632

被折叠的 条评论
为什么被折叠?



