📜  Pytorch 中的变量和 autograd(1)

📅  最后修改于: 2023-12-03 15:19:37.050000             🧑  作者: Mango

Pytorch 中的变量和 autograd

Pytorch 是一个基于 Python 的科学计算库,它可以帮助我们更加方便地实现深度学习模型,其中变量和 autograd 模块是其重要的特性之一。本文将介绍 Pytorch 中的变量和 autograd 模块,以及如何使用它们来构建神经网络。

变量(Variable)

变量是 Pytorch 中的一个核心概念,它是一个可以被 autograd 自动求导的张量。变量的主要作用是保存一个值,并且可以记录下它的计算历史。当一个变量与其他变量进行运算时,会产生一个新的变量,并记录下这个运算的过程,形成一个计算图。当我们调用变量的 backward 方法时,它会自动计算梯度,并将梯度保存在变量中。

下面是一个简单的例子,展示了如何创建和使用变量。

import torch
from torch.autograd import Variable

# 创建一个变量,并赋值为 2
x = Variable(torch.Tensor([2]), requires_grad=True)

# 对变量进行运算
y = x ** 2 + 3 * x + 1

# 计算梯度并打印
y.backward()
print(x.grad)

这个例子中,我们创建了一个变量 x,并将其赋值为 2,并且设置了 requires_grad=True,这表示我们需要对该变量进行梯度计算。我们对 x 进行了简单的运算,并将结果赋值给了变量 y。接着调用了 y.backward() 方法,这会自动计算梯度,并将梯度保存在 x.grad 属性中。最后我们打印出了 x.grad,可以看到它的值为 7。

autograd 模块

autograd 模块是 Pytorch 实现自动求导的核心模块,它可以根据变量的计算历史,自动计算梯度。当我们创建变量时,可以通过设置 requires_grad=True 来指示 autograd 记录该变量的计算历史。当我们对变量进行运算时,autograd 将自动构建一张计算图,并保存下这个计算图。

当我们调用变量的 backward() 方法时,autograd 会自动计算梯度,并将梯度保存在变量的 grad 属性中。我们可以通过调用 grad 方法来获取这个变量的梯度值。

下面是一个使用 autograd 模块的例子。

import torch
from torch.autograd import Variable

# 创建两个变量,并赋值为 2 和 3
x = Variable(torch.Tensor([2]), requires_grad=True)
y = Variable(torch.Tensor([3]), requires_grad=True)

# 对变量进行运算
z = x ** 2 + 3 * x * y + y ** 2

# 计算梯度并打印
z.backward()
print(x.grad)
print(y.grad)

这个例子中,我们创建了两个变量 xy,并将它们的值分别赋值为 2 和 3,并且都设置了 requires_grad=True,表示这两个变量需要进行梯度计算。我们对 xy 进行了一些复杂的运算,将结果赋值给变量 z。接着调用了 z.backward() 方法,这会自动计算梯度,并将梯度保存在 x.grady.grad 属性中。最后我们打印出了 x.grady.grad,可以看到它们的梯度值分别为 10 和 13。

构建神经网络

我们可以利用变量和 autograd 模块来构建神经网络。通常我们需要定义一些参数,并将它们都设置为需要进行梯度计算的变量。接着我们通过计算图来构建整个神经网络,并对输出进行梯度计算。接下来我们来看一个简单的例子。

import torch
from torch.autograd import Variable

# 定义一些参数
input_size = 1
output_size = 1
hidden_size = 2

# 定义变量,并将其设置为需要进行梯度计算
x = Variable(torch.Tensor([[1.0], [2.0], [3.0]]), requires_grad=True)
y = Variable(torch.Tensor([[2.0], [4.0], [6.0]]), requires_grad=True)

# 定义神经网络
w1 = Variable(torch.randn(input_size, hidden_size), requires_grad=True)
w2 = Variable(torch.randn(hidden_size, output_size), requires_grad=True)

# 进行前向计算,并计算均方误差
h = x.mm(w1)
h_relu = h.clamp(min=0)
y_pred = h_relu.mm(w2)
loss = (y_pred - y).pow(2).sum()

# 计算梯度
loss.backward()

# 更新参数
lr = 0.01
w1.data -= lr * w1.grad.data
w2.data -= lr * w2.grad.data

# 清空梯度
w1.grad.data.zero_()
w2.grad.data.zero_()

这个例子中,我们定义了三个变量 xyloss,并将它们都设置为需要进行梯度计算的变量。接着我们定义了两个参数 w1w2,并将它们也都设置为需要进行梯度计算的变量,这两个参数分别表示神经网络的两层权重。我们通过计算图来构建神经网络,并计算出均方误差。接着调用了 loss.backward() 方法,该方法会自动计算梯度,并将梯度保存在 w1.gradw2.grad 属性中。我们根据梯度来更新参数,并将梯度清空。

总结

本文介绍了 Pytorch 中的变量和 autograd 模块,它们是构建神经网络的重要工具。变量可以保存一个值,并记录下它的计算历史。autograd 模块可以自动计算梯度,并将梯度保存在变量中。我们可以利用变量和 autograd 模块来构建神经网络,并通过梯度下降来训练网络。