上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技术框架中非常流行的一个框架。