AndreaDO

导航

动手学深度学习-预备知识-自动微分

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

  

  

posted on 2023-11-09 10:56  AndreaDO  阅读(30)  评论(0)    收藏  举报