创建可以求导的张量
# 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])