2. PyTorch 基本概念与张量操作
在上一节中,我们详细介绍了如何在不同操作系统上搭建 PyTorch 环境,确保读者能够顺利开启深度学习之旅。本节将深入探讨 PyTorch 的基本概念和张量操作,这是理解和使用 PyTorch 进行深度学习开发的基础。
2.1 PyTorch 的基本概念
2.1.1 张量(Tensor)
张量是 PyTorch 中最基本的数据结构,类似于 NumPy 中的数组,但张量可以在 GPU 上进行高效的计算。张量可以有任意维度,例如:
- 0 维张量:标量(scalar),例如
torch.tensor(5)
。 - 1 维张量:向量(vector),例如
torch.tensor([1, 2, 3])
。 - 2 维张量:矩阵(matrix),例如
torch.tensor([[1, 2], [3, 4]])
。 - 多维张量:例如
torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
。
张量的形状(shape)描述了其维度和大小,例如 torch.tensor([[1, 2], [3, 4]])
的形状是 (2, 2)
。
2.1.2 计算图(Computational Graph)
PyTorch 采用动态计算图机制,这意味着计算图是在运行时动态构建的。与静态计算图不同,动态计算图允许用户在运行时修改计算图的结构,这使得调试和开发更加灵活。每次执行代码时,PyTorch 都会根据张量的操作动态构建计算图。
2.1.3 自动求导(Automatic Differentiation)
自动求导是 PyTorch 的核心特性之一,它允许用户自动计算梯度,从而简化了神经网络的训练过程。在 PyTorch 中,通过 torch.autograd
模块实现自动求导。当对张量进行操作时,PyTorch 会自动构建计算图,并在需要时计算梯度。
2.2 张量的创建
2.2.1 从 Python 列表创建张量
可以直接使用 Python 列表来创建张量:
import torch
# 从 Python 列表创建张量
x = torch.tensor([1, 2, 3])
print(x)
# 创建多维张量
y = torch.tensor([[1, 2], [3, 4]])
print(y)
2.2.2 使用特定值创建张量
PyTorch 提供了多种方法来创建特定值的张量:
# 创建全为 0 的张量
zeros = torch.zeros(2, 3)
print("全为 0 的张量:")
print(zeros)
# 创建全为 1 的张量
ones = torch.ones(2, 3)
print("全为 1 的张量:")
print(ones)
# 创建随机张量
random = torch.rand(2, 3)
print("随机张量:")
print(random)
2.2.3 从其他张量创建张量
可以使用已有的张量来创建新的张量,并继承其数据类型和设备:
# 从已有张量创建新张量
x = torch.tensor([1, 2, 3], dtype=torch.float32)
y = torch.tensor(x, dtype=torch.int32)
print("从 x 创建的 y:")
print(y)
# 创建与 x 形状相同但值为 0 的张量
zeros_like_x = torch.zeros_like(x)
print("与 x 形状相同但值为 0 的张量:")
print(zeros_like_x)
2.3 张量的基本操作
2.3.1 张量的形状操作
可以使用 shape
属性获取张量的形状,使用 view
方法改变张量的形状:
# 获取张量的形状
x = torch.tensor([[1, 2], [3, 4]])
print("张量 x 的形状:", x.shape)
# 改变张量的形状
y = x.view(4)
print("改变形状后的张量 y:")
print(y)
2.3.2 张量的索引和切片
可以使用索引和切片操作来访问张量的特定元素或子张量:
# 索引操作
x = torch.tensor([[1, 2], [3, 4]])
print("张量 x 的第一个元素:", x[0, 0])
# 切片操作
print("张量 x 的第一行:", x[0])
print("张量 x 的第二列:", x[:, 1])
2.3.3 张量的数学运算
PyTorch 提供了丰富的数学运算操作,包括加法、减法、乘法、除法等:
# 加法
x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
z = x + y
print("加法结果:", z)
# 乘法
z = x * y
print("乘法结果:", z)
# 矩阵乘法
x = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([[5, 6], [7, 8]])
z = torch.matmul(x, y)
print("矩阵乘法结果:")
print(z)
2.3.4 张量的广播机制
当进行张量运算时,如果张量的形状不匹配,PyTorch 会自动应用广播机制,使得张量的形状匹配:
# 广播机制
x = torch.tensor([[1, 2], [3, 4]])
y = torch.tensor([1, 2])
z = x + y
print("广播后的结果:")
print(z)
2.4 张量的设备管理
2.4.1 将张量移动到 GPU
如果系统支持 GPU 加速,可以将张量移动到 GPU 上进行计算:
# 检查 GPU 是否可用
if torch.cuda.is_available():
device = torch.device("cuda")
x = torch.tensor([1, 2, 3]).to(device)
print("张量 x 已移动到 GPU:", x)
else:
print("GPU 不可用,使用 CPU 进行计算。")
2.4.2 将张量移动到 CPU
如果需要将张量从 GPU 移动到 CPU,可以使用 .to()
方法:
# 将张量从 GPU 移动到 CPU
x = x.to("cpu")
print("张量 x 已移动到 CPU:", x)
2.5 自动求导机制
2.5.1 启用自动求导
通过设置 requires_grad=True
,可以启用张量的自动求导功能:
# 启用自动求导
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x * 2
z = y.sum()
# 反向传播
z.backward()
# 查看梯度
print("张量 x 的梯度:", x.grad)
2.5.2 自动求导的高级用法
在复杂的神经网络中,自动求导机制可以自动计算梯度,简化训练过程:
# 自动求导的高级用法
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = x * 2
z = y * y
# 反向传播
z.sum().backward()
# 查看梯度
print("张量 x 的梯度:", x.grad)
2.6 总结
本节详细介绍了 PyTorch 的基本概念和张量操作,包括张量的创建、基本操作、设备管理以及自动求导机制。通过这些基础知识,读者可以更好地理解和使用 PyTorch 进行深度学习开发。在后续章节中,我们将进一步探讨 PyTorch 的高级特性,包括神经网络的构建与训练、模型的保存与加载等。希望本节内容能够为读者在深度学习领域的探索提供帮助。
更多技术文章见公众号: 大城市小农民