PyTorch

PyTorch #

PyTorch是一个开源的基于 Python 的深度学习库。

  • PyTorch是一个张量库,它扩展了面向数组的编程库NumPy的概念,并增加了加速GPU上计算的功能,从而提供了在CPU和GPU之间无缝切换的功能
  • PyTorch是一个自动微分引擎,也被称为autograd,它能够自动计算张量操作的梯度,简化了反向传播和模型优化。
  • PyTorch是一个深度学习库。它提供了模块化、灵活、高效的构建块,包括预训练模型、损失函数和优化器,用于设计和训练各种深度学习模型,满足研究人员和开发人员的需求。

安装PyTorch #

PyTorch可以像其他Python库或包一样安装。然而,由于PyTorch是一个包含CPU和GPU兼容代码的综合性库,因此安装可能需要额外的说明。

PyTorch有两个版本:一个是仅支持CPU计算的精简版,另一个是支持CPU和GPU计算的完整版。如果你的机器有一个支持CUDA的GPU,可以用于深度学习,建议安装GPU版本。不管怎样,在代码终端中安装PyTorch的默认命令是:

1pip install torch
2pip install numpy  

用poetry安装

1export POETRY_REQUESTS_TIMEOUT=180
2poetry add torch
3poetry add numpy

如果你的计算机支持兼容CUDA的GPU。在这种情况下,将自动安装支持通过CUDA进行GPU加速的PyTorch版本,

许多科学计算库可能不支持最新版本的Python。因此,在安装PyTorch时,建议使用比最新版本Python老一两个版本的Python。例如,如果最新版本的Python是3.13,建议使用Python 3.11或3.12。

安装PyTorch后,可以通过在Python中运行以下代码来检查您的安装是否识别NVIDIA GPU:

1import torch
2print(torch.cuda.is_available())

如果命令返回True,那就一切就绪了。如果命令返回False,说明电脑可能没有兼容的GPU,或者PyTorch无法识别它。

张量(Tensors) #

张量表示一个将向量和矩阵推广到更高维度的数学概念。张量的阶数表示维度的数量。

张量可以简单理解为一种多维数据结构,可以看作是更高维度的数组。

  • 标量(scalar):是一个简单的数字,比如5,属于0阶张量
  • 向量(vector):是一个有序的一维数组,比如[1, 2, 3],可以看作是1阶张量
  • 矩阵(matrix):是一个二维数组,可以看作是2阶张量例如:
    1[
    2 [1, 2, 3],
    3 [4, 5, 6]
    4]
    
  • 高阶张量(tensor):当我们把这些概念扩展到更多维度时,就形成了高阶张量。例如,一个3阶张量可以看作是一个包含多个矩阵的数组,4阶张量可以是一个包含多个3阶张量的数组,依此类推。

从计算的角度来看,张量充当数据容器的角色。例如,它们可以存储多维数据,每个维度代表不同的特征。像PyTorch这样的张量库能够高效地创建、操作和计算这些数组。在这种情况下,张量库的功能类似于数组库。

PyTorch张量与NumPy数组相似,但具有几个对深度学习很重要的额外特性。例如,PyTorch添加了自动微分引擎,简化了梯度计算。PyTorch张量还支持GPU计算,以加快深度神经网络训练的速度。

标量、向量、矩阵和张量 #

PyTorch张量是用于数组类结构的数据容器。标量是零维张量(仅仅是一个数字),向量是一维张量,矩阵是二维张量。对于更高维度的张量没有特定的术语。可以使用torch.tensor函数创建PyTorch的Tensor类对象,如下所示。

 1import torch
 2
 3tensor_0d = torch.tensor(1)
 4tensor_1d = torch.tensor([1, 2, 3])
 5tensor_2d = torch.tensor([[1, 2, 3], [4, 5, 6]])
 6tensor_3d = torch.tensor([[[1, 2, 3], [4, 5, 6]], [[11, 22, 33], [44, 55, 66]]])
 7
 8print(tensor_0d)
 9print(tensor_1d)
10print(tensor_2d)
11print(tensor_3d)
1tensor(1)
2tensor([1, 2, 3])
3tensor([[1, 2, 3],
4        [4, 5, 6]])
5tensor([[[ 1,  2,  3],
6         [ 4,  5,  6]],
7
8        [[11, 22, 33],
9         [44, 55, 66]]])

张量数据类型 #

PyTorch默认使用Python中64位整数数据类型。可以通过张量的.dtype属性访问其数据类型:

1print(tensor_3d.dtype)

输出:

1torch.int64

如果我们从Python浮点数创建张量,PyTorch默认会创建32位精度的张量:

1float_vec = torch.tensor([1.1, 2.2])
2print(float_vec.dtype)

输出:

1torch.float32

两种数据类型之间的选择主要是因为精度和计算效率之间的平衡。32位浮点数对大多数深度学习任务来说已经足够精确了,同时也比 64 位浮点数占用更少的内存和计算资源。此外,GPU 架构也经过优化,可以更高效地处理 32 位计算,使用这种数据类型可以显著加快模型训练和推理。

以使用张量的.to方法来改变精度。下面的代码演示了将一个64位整数张量转换为32位浮点张量:

1tensor_1d = torch.tensor([1, 2, 3])
2float_vec = tensor_1d.to(torch.float32)
3print(float_vec.dtype)

输出:

1torch.float32

关于PyTorch中可其他张量数据类型的更多信息,请查阅文档-torch.Tensor

张量常见操作 #

shape属性返回张量的形状(大小size):

1tensor_2d = torch.tensor([[1, 2, 3], [4, 5, 6]])
2print(tensor_2d.shape)

输出:

1torch.Size([2, 3])

shape属性返回[2, 3],这意味着张量有两行三列。要将张量重塑成一个3 × 2的张量,我们可以使用reshape()方法:

1print(tensor_2d.reshape(3, 2))
1tensor([[1, 2],
2        [3, 4],
3        [5, 6]])

在PyTorch中用于重塑张量的更常用命令是view()方法:

1print(tensor_2d.view(3, 2))
1tensor([[1, 2],
2        [3, 4],
3        [5, 6]])

与reshape和view类似,在许多情况下,PyTorch为执行相同的计算提供了多种语法选择。PyTorch最初遵循原始Lua Torch的语法约定,但后来应大众要求,添加了类似NumPy的语法。(PyTorch中.view().reshape()的细微差别在于它们对内存布局的处理:.view()要求原始数据必须是连续的,如果不是连续的就会失败,而.reshape()则无论如何都能工作,必要时会复制数据以确保得到期望的形状。)

可以使用.T来转置张量,这意味着沿其对角线翻转张量。注意,这类似于重塑张量,从以下结果可以看出:

1print(tensor_2d.T)
1tensor([[1, 4],
2        [2, 5],
3        [3, 6]])

在PyTorch中两个矩阵相乘的常用方法是matmul方法:

1print(tensor_2d.matmul(tensor_2d.T))
1tensor([[14, 32],
2        [32, 77]])

也可以使用@运算符,它可以更简洁地完成相同的操作:

1print(tensor_2d @ tensor_2d.T)

关于PyTorch中可其他张量操作的更多信息,请查阅文档-torch.Tensor

将模型视为计算图 #

PyTorch的自动微分引擎(也称为autograd)。PyTorch的autograd系统提供函数来自动计算动态计算图中的梯度。

计算图是一个有向图,它让我们能够表达和可视化数学表达式。在深度学习的背景下,计算图展示了计算神经网络输出所需的计算序列。我们需要用它来计算反向传播所需的梯度,反向传播是神经网络的主要训练算法。

以下代码实现了一个简单的逻辑回归分类器的前向传播(预测步骤),它可以被视为一个单层神经网络。它返回一个介于0和1之间的分数,在计算损失时将与真实的类别标签(0或1)进行比较。

 1import torch
 2import torch.nn.functional as F
 3
 4y = torch.tensor([1.0])  # 目标值(标签)
 5x1 = torch.tensor([1.1])  # 输入特征
 6w1 = torch.tensor([2.2])  # 权重
 7b = torch.tensor([0.0])  # 偏置
 8
 9# 计算线性组合
10# 计算线性输出z,即输入特征 x1 与权重 w1 的乘积再加上偏置 b。
11z = x1 * w1 + b
12# 应用激活函数
13# 使用sigmoid激活函数将线性输出 z 转换为预测值 a,使其范围在 (0, 1) 之间。
14a = torch.sigmoid(z)
15# 计算损失
16# 计算二元交叉熵损失,用于评估模型的预测值 a 与真实标签y之间的差异
17loss = F.binary_cross_entropy(a, y)
18
19print(loss)

这段代码的重点不是为了说明实现一个逻辑回归分类器,而是为了说明如何能将一系列计算视为计算图。

PyTorch在后台构建这样的计算图,我们可以利用它来计算损失函数相对于模型参数(这里是 w1 和 b)的梯度,从而训练模型。

© 2024 青蛙小白