欢迎访问宙启技术站
智能推送

PyTorch中torch.autograd的变量操作和求导示例

发布时间:2024-01-03 06:03:19

在PyTorch中,torch.autograd模块提供了自动求导的功能。它可以跟踪和计算计算图中的梯度,以便进行反向传播。本文将介绍torch.autograd中的变量操作和求导示例,并提供相应的使用例子。

## 变量操作

### 创建变量

可以使用torch.Tensor类创建变量。例如,我们可以使用以下代码创建一个具有随机值的张量:

import torch

x = torch.randn(3, requires_grad=True)

这里的requires_grad参数用于指定是否跟踪该张量的梯度。在上述示例中,x是一个形状为(3,)的张量,并且会被跟踪梯度。

### 运算

可以对变量执行各种运算操作,生成新的变量。这些运算操作将会被记录在计算图中,以便于求导。

例如,我们可以使用以下代码对两个变量进行加法操作:

import torch

x = torch.randn(3, requires_grad=True)
y = torch.randn(3, requires_grad=True)

z = x + y

在上述示例中,xy是两个形状为(3,)的张量。通过操作符+对它们进行相加,得到新的变量zz将会自动跟踪梯度,这意味着我们可以计算相对于z的梯度。

### 改变形状

可以使用view()方法改变变量的形状。这类似于reshape()方法,但是view()不会进行数据的复制,而只是改变张量的视图。

例如,我们可以使用以下代码将一个形状为(2, 2)的张量转换为形状为(4,)的张量:

import torch

x = torch.randn(2, 2, requires_grad=True)

y = x.view(4)

在上述示例中,x是一个形状为(2, 2)的张量,y是形状为(4,)的张量。

### 不记录梯度

有时候,我们可能希望不记录某些操作的梯度。可以使用torch.no_grad()上下文管理器来实现。

例如,我们可以使用以下代码将x的梯度计算过程排除在计算图之外:

import torch

x = torch.randn(3, requires_grad=True)

with torch.no_grad():
    y = x * 2

在上述示例中,yx的两倍,但是我们不希望y被跟踪梯度。

## 求导示例

### 标量求导

为了计算某个标量相对于某个变量的导数,我们可以使用变量的backward()方法。

例如,我们可以使用以下代码计算标量y相对于变量x的导数:

import torch

x = torch.tensor(2.0, requires_grad=True)

y = x**2 + 2*x + 1

y.backward()

print(x.grad)

输出结果将是9.0,这是因为导数为4*x + 2,在x=2时,结果为9.0。

### 向量求导

如果我们有一个向量,我们可以计算向量相对于某个变量的雅可比矩阵。在PyTorch中,可以使用torch.autograd.grad()方法来实现。

例如,我们可以使用以下代码计算向量y相对于向量x的雅可比矩阵:

import torch

x = torch.tensor([2.0, 3.0], requires_grad=True)

y = x**2 + 2*x + 1

torch.autograd.grad(y, x)

输出结果将是一个向量:tensor([6., 8.]),这是因为导数为[4*x[0] + 2, 4*x[1] + 2],在x=[2.0, 3.0]时,结果为[6.0, 8.0]。

### 多次求导

在计算图中,可以多次调用backward()方法进行多次求导。每次求导后,变量的梯度将会累积。

例如,我们可以使用以下代码计算y相对于x的导数的导数:

import torch

x = torch.tensor(2.0, requires_grad=True)

y = x**2 + 2*x + 1

y.backward()
print(x.grad)

x.grad.zero_()  # 清除之前的梯度

y.backward()
print(x.grad)

输出结果将是9.09.0,这是因为 次求导后,梯度被累积为9.0,在第二次求导前,需要将梯度清零。

这就是PyTorch中torch.autograd的变量操作和求导的示例和使用例子。它提供了一种方便的方法来自动跟踪和计算变量的梯度,以便进行反向传播。希望本文对你理解和使用torch.autograd有所帮助!