生成式AI实战
上QQ阅读APP看书,第一时间看更新

1.1.3 PyTorch

PyTorch是由Facebook AI Research Lab开发的一个开源机器学习库。它提供了类似于NumPy的张量计算功能,且具有强大的GPU加速支持。PyTorch以其简洁的API和用户友好的设计受到广大研究人员和开发者的喜爱,特别适合于快速原型设计和研究。

1. 安装PyTorch

在开始使用之前,需要先安装PyTorch。PyTorch官方网站提供了相关的安装命令,你可以根据自己的操作系统和开发环境(包括是否需要GPU支持)选择正确的命令。例如,在大多数情况下,如果你使用的是pip且希望在CPU上运行PyTorch,那么可以使用以下命令安装PyTorch。

Shell
pip install torch

小提示

为了减少运行时的错误,推荐使用与本书代码环境一致的PyTorch 2.1.1版本进行开发。

2. 动手实践

张量是PyTorch中的基本构建块,可以将其看作高维数组或矩阵。张量支持自动梯度计算,非常适合在神经网络中使用。

创建和操作张量的示例代码如下。

Python
import torch
# 创建一个未初始化的3×2张量
x = torch.empty(3, 2)
print(x)
# tensor([[0., 0.],
#         [0., 0.],
#         [0., 0.]])
# 创建一个随机初始化的张量
x = torch.rand(3, 2)
print(x)
# tensor([[0.5277, 0.0190],
#         [0.5107, 0.9485],
#         [0.5214, 0.6354]])
# 创建一个用0填充的张量,数据类型为long
x = torch.zeros(3, 2, dtype=torch.long)
print(x)
# tensor([[0, 0],
#         [0, 0],
#         [0, 0]])
# 直接根据数据创建张量
x = torch.tensor([[1, 2], [3, 4], [5, 6]])
print(x)
# tensor([[1, 2],
#         [3, 4],
#         [5, 6]])
# 张量加法
y = torch.rand(3, 2)
print(x + y)
# tensor([[1.4600, 2.7211],
#         [3.6706, 4.3424],
#         [5.8336, 6.1341]])
# 使用torch.add进行加法运算
result = torch.empty(3, 2)
torch.add(x, y, out=result)
print(result)
# tensor([[1.4600, 2.7211],
#         [3.6706, 4.3424],
#         [5.8336, 6.1341]])

在训练神经网络时,反向传播算法用于自动计算模型参数的梯度。在PyTorch中,autograd包提供了这项功能。当使用张量进行相关操作时,可以通过设置requires_grad为True以跟踪对张量的所有操作。

以下是autograd包的一个简单示例。

Python
import torch
# 创建张量并设置requires_grad为True以跟踪对张量的所有操作
x = torch.ones(2, 2, requires_grad=True)
print(x)
# tensor([[1., 1.],
#         [1., 1.]], requires_grad=True)
# 对张量进行操作
y = x + 2
print(y)
# tensor([[3., 3.],
#         [3., 3.]], grad_fn=<AddBackward0>)
# 因为y是操作的结果,所以它有grad_fn属性
print(y.grad_fn)
# <AddBackward0 object at 0x104bc6e50>
# 对y进行更多操作
z = y * y * 3
out = z.mean()
print(z, out)
# tensor([[27., 27.],
#         [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward0>)
# 计算梯度
out.backward()
# 打印梯度d(out)/dx
print(x.grad)
# tensor([[4.5000, 4.5000],
#         [4.5000, 4.5000]])

3. 构建神经网络

在PyTorch中,torch.nn包负责构建神经网络。nn.Module是所有神经网络模块的基类,你的模型也应该继承这个类。

以下是一个简单的前馈神经网络的实现,其中包含一个隐藏层。

Python
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 包含1个输入图像通道、6个输出通道的3×3的卷积核
        self.conv1 = nn.Conv2d(1, 6, 3)
        self.conv2 = nn.Conv2d(6, 16, 3)
        # 仿射变换:y=Wx+b
        self.fc1 = nn.Linear(16 * 6 * 6, 120)  # 6*6来自图像维度
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
    def forward(self, x):
        # 最大池化窗口(2, 2)
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = torch.flatten(x, 1)  # 除了批量维度以外展平所有维度
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x
net = Net()
print(net)

PyTorch提供了丰富的API和灵活的设计理念,非常适合进行科学研究和原型设计。目前它是整个AI技术框架中非常流行的一个框架。