动手学深度学习-预备知识-自动微分
pytorch中包含了自动微分的函数,学习并且进行一些练习
1. 使用pytorch计算函数 f(x)=(x1^2 )*3 + 2*e^x2 在(1,1)下的偏导数
# 计算x1 和x2在 (1,1)下的梯度 x1 = torch.tensor(1.0) x2 = torch.tensor(1.0) x1.requires_grad_(True) x2.requires_grad_(True) y = x1**2 * 3 + 2 * torch.exp(x2) print("计算前的梯度", "x1_grad=", x1.grad, " x2_grad=", x2.grad) y.backward() print("计算后的梯度", "x1_grad=", x1.grad, " x2_grad=", x2.grad)
输出结果:
#计算前的梯度 x1_grad= None x2_grad= None #计算后的梯度 x1_grad= tensor(6.) x2_grad= tensor(5.4366)
2.分离出计算图
因为pytorch的反向传播会建立计算图,而我们只想获取中间值,为了完成目前可以使用detach()函数
x1 = torch.tensor(2.0) x1.requires_grad_(True) y = x1 * x1 y.backward() print(x1.grad) # 例子2 分离出计算图 x1.grad.zero_() # 清除掉梯度 y = x1 * x1 u = y.detach() # 分离出计算图,独立开来,但不能进行反向传播了 # print(u, y) # 4. 等于y的值 z = u * x1 # print(z) # 8 # print(z.sum()) # tensor(8., grad_fn=<SumBackward0>) z.sum().backward() # 这里反向传播求梯度 print(x1.grad)
输出
#tensor(4.) #tensor(4.)
3.在多分支流程中也可以创建计算图
def demo3(): # 函数内定义函数 def f(a): b = a * 2 while b.norm() < 10: #如果b的范数小于10就一直让b乘2 b = b * 2 if b.sum() > 0: c = b else: c = 100 * b return c a = torch.randn(size=(), requires_grad=True) print('a=',a) # a = torch.tensor(0.0) d = f(a) print('d=',d) d.backward() print(a.grad) print(d / a) if __name__ == "__main__": demo3()
输出结果:
#a= tensor(-0.5843, requires_grad=True) #d= tensor(-1869.6824, grad_fn=<MulBackward0>) #tensor(3200.) #tensor(3200., grad_fn=<DivBackward0>)
浙公网安备 33010602011771号