torch.autograd.grad的使用初步

创建可以求导的张量

# 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])

你可能感兴趣的:(python,深度学习,人工智能)