pytorch基础操作(二) 自动微分

1、标量的自动微分

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、非标量的自动微分

'''
自动微分___非标量的自动微分
'''
# 对⾮标量调⽤backward需要传⼊⼀个gradient参数,该参数指定微分函数关于self的梯度。
# 在我们的例⼦中,我们只想求偏导数的和,所以传递⼀个1的梯度是合适的
x.grad.zero_()
y = x * x  # y = x * x = (x1^2 , x2^2 , x3^2 , x4^2)

# 等价于y.backward(torch.ones(len(x)))
y.sum().backward()  # y.sum()  ===> y_sum = x1^2 + x2^2 + x3^2 + x4^2

x.grad  # 求梯度,x.grad = (2x1 , 2x2 , 2x3 , 2x4)

在这里插入图片描述
在这里插入图片描述

3、分离计算

'''
分离计算

# z=B(y)、y=A(x) 求B中参数的梯度,不求A中参数的梯度
y = A(x)
z = B(y.detach())
z.backward()

y.detach()
返回一个新的tensor,从当前计算图中分离下来的,但是仍指向原变量的存放位置(内存相同),不同之处只是requires_grad为false,
得到的这个tensor不再有计算梯度的能力,反向传播时遇到该tensor将停止,不再继续传播

'''

x.grad.zero_()
y = x * x
u = y.detach()
z = u * x

z.sum().backward()  # z.sum()  ===>   z_sum = u(x1 + x2 + x3 + x4)
x.grad == u

在这里插入图片描述

4、Python控制流的梯度计算

'''
Python控制流的梯度计算

即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调⽤),我们仍然可以计算得到的变量的梯度。
'''

def f(a):
    b = a * 2
    while b.norm() < 1000:
          b = b * 2
    if b.sum() > 0:
          c = b
    else:
          c = 100 * b
    return c


# 计算梯度
a = torch.randn(size=(), requires_grad=True)
a

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个基于Python的科学计算库,它是一个用于深度学习的开源框架,具有高度灵活性和可扩展性。PyTorch的一个关键特性是它的自动微分功能,也称为自动求导功能。自动微分PyTorch中非常强大的功能,它可以自动计算函数的导数,因此可以为深度学习中的反向播算法提供支持。 在PyTorch中,我们可以使用torch.autograd包实现自动微分。该包提供了Variable类,它是一个包装Tensor的类,它不仅保存了Tensor的值,还保存了梯度信息。我们可以在Variable上执行操作,并使用.backward()方法计算梯度。 下面是PyTorch自动微分的基本示例代码: ```python import torch x = torch.tensor([3.0], requires_grad=True) y = x ** 2 + 2 * x + 1 # 计算梯度 y.backward() # 输出梯度 print(x.grad) ``` 在这个例子中,我们定义了一个变量x,并将requires_grad设置为True,以指示PyTorch需要计算x的梯度。然后我们定义了一个函数y,该函数对x进行操作。我们使用backward()方法计算y相对于x的梯度,并使用x.grad输出梯度。 这里需要注意的是,只有requires_grad=True的变量才会被计算梯度。如果我们想要计算多个变量的梯度,可以将它们放在一个元组中,然后用backward()方法。 ```python import torch x = torch.tensor([3.0], requires_grad=True) y = torch.tensor([4.0], requires_grad=True) z = x ** 2 + y ** 2 # 计算梯度 z.backward() # 输出梯度 print(x.grad) print(y.grad) ``` 在这个例子中,我们定义了两个变量x和y,并将requires_grad设置为True,以指示PyTorch需要计算它们的梯度。然后我们定义了一个函数z,该函数对x和y进行操作。我们使用backward()方法计算z相对于x和y的梯度,并使用x.grad和y.grad输出它们的梯度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值