PyTorch 教程(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在人工智能领域,PyTorch 已成为开发者构建深度学习模型的首选工具之一。它凭借动态计算图、直观的 API 设计和丰富的生态支持,降低了机器学习的入门门槛,也让复杂模型的实现变得触手可及。无论是编程初学者还是有一定经验的开发者,通过本教程都能系统掌握 PyTorch 的核心概念与实践方法。

本文将从基础概念讲起,逐步深入张量操作、自动求导机制、模型构建与训练流程,并通过实际案例演示如何用 PyTorch 解决真实问题。我们力求用通俗的语言和生动的比喻,帮助读者在理解原理的同时,快速上手代码实践。


一、PyTorch 的安装与环境配置

安装步骤

PyTorch 的安装过程简单高效,可通过 pipconda 完成。根据硬件配置(是否支持 CUDA),选择合适的版本:

pip install torch torchvision torchaudio  

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118  

环境验证

安装完成后,运行以下代码验证环境是否配置成功:

import torch  

print(torch.__version__)       # 查看 PyTorch 版本  
print(torch.cuda.is_available())  # 检查 GPU 是否可用  

二、张量(Tensor):PyTorch 的核心数据结构

什么是张量?

张量是 PyTorch 中存储和操作数据的基本单位,可以理解为“多维数组”。它支持高效的矩阵运算,并能无缝利用 GPU 加速计算。

形象比喻

如果将数据比作食材,张量就是厨房中的“容器”,不同维度的张量对应不同形状的容器——一维向量是“长条盘”,二维矩阵是“方形盘”,三维及更高维度的张量则是“立体收纳盒”。

创建张量

x = torch.randn(3, 4)          # 3x4 的正态分布随机数  
y = torch.zeros(2, 2)          # 2x2 的零矩阵  

list_data = [[1, 2], [3, 4]]  
tensor_data = torch.tensor(list_data)  

张量的基本操作

索引与切片

tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])  
print(tensor[0, 1])    # 输出 2(第一行第二列的元素)  
print(tensor[:, 1:])    # 输出 [[2 3], [5 6]]  

张量运算

a = torch.tensor([1.0, 2.0])  
b = torch.tensor([3.0, 4.0])  

add_result = a + b          # [4.0, 6.0]  
matmul_result = torch.dot(a, b)  # 1*3 + 2*4 = 11.0  

scalar = 2  
broadcasted = a * scalar    # [2.0, 4.0]  

三、自动求导(Autograd):让反向传播“自动”起来

自动求导的核心作用

在深度学习中,模型参数的优化依赖于对损失函数的梯度计算。PyTorch 的 Autograd 模块通过记录计算图(Computational Graph),自动完成这一过程,开发者无需手动推导复杂的导数公式。

比喻解释

Autograd 好比“数学教练”,当你告诉它计算的目标(如损失函数),它会自动帮你分析每一步操作的“贡献度”(梯度),并指导你如何调整参数以改进结果。

示例:计算简单函数的梯度

x = torch.tensor(2.0, requires_grad=True)  # 启用梯度追踪  

y = x**2 + 3 * x  

y.backward()  
print(x.grad)  # 输出 7.0(dy/dx = 2x + 3,在 x=2 处为 7)  

计算图的动态特性

PyTorch 的计算图是动态构建的,这意味着模型结构可以在运行时灵活调整。例如,条件分支或循环结构中的计算图会根据输入实时变化,这为复杂模型设计提供了极大便利。


四、构建神经网络:从零开始的实战

网络结构的定义

PyTorch 中的神经网络通常通过继承 nn.Module 类来实现。以下是一个简单的线性回归模型示例:

import torch.nn as nn  

class LinearRegression(nn.Module):  
    def __init__(self):  
        super().__init__()  
        self.linear = nn.Linear(1, 1)  # 输入和输出均为 1 维  

    def forward(self, x):  
        return self.linear(x)  

损失函数与优化器

model = LinearRegression()  
criterion = nn.MSELoss()    # 均方误差损失  
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)  # 随机梯度下降  

训练循环

for epoch in range(100):  
    y_pred = model(X)  
    loss = criterion(y_pred, Y)  
    optimizer.zero_grad()  
    loss.backward()  
    optimizer.step()  

五、完整案例:手写数字识别(MNIST 数据集)

数据准备与加载

from torchvision import datasets, transforms  

transform = transforms.Compose([  
    transforms.ToTensor(),  
    transforms.Normalize((0.1307,), (0.3081,))  
])  

train_dataset = datasets.MNIST(root='./data', train=True,  
                              download=True, transform=transform)  
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)  

定义卷积神经网络(CNN)

class CNN(nn.Module):  
    def __init__(self):  
        super().__init__()  
        self.conv1 = nn.Conv2d(1, 32, 3, 1)  
        self.fc = nn.Linear(32 * 14 * 14, 10)  # 全连接层  

    def forward(self, x):  
        x = self.conv1(x)  
        x = torch.relu(x)  
        x = torch.flatten(x, 1)  
        x = self.fc(x)  
        return x  

训练与验证

model = CNN()  
criterion = nn.CrossEntropyLoss()  
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)  

for epoch in range(5):  
    model.train()  
    for batch_idx, (data, target) in enumerate(train_loader):  
        optimizer.zero_grad()  
        output = model(data)  
        loss = criterion(output, target)  
        loss.backward()  
        optimizer.step()  
    # 验证逻辑(此处省略)  

六、进阶技巧与常见问题解答

1. 张量与 NumPy 的转换

numpy_array = tensor.numpy()  

tensor = torch.from_numpy(numpy_array)  

2. GPU 加速的注意事项

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")  
model.to(device)  # 将模型移到 GPU  
data = data.to(device)  # 将数据移到 GPU  

3. 模型保存与加载

torch.save(model.state_dict(), "model.pth")  

model = CNN()  
model.load_state_dict(torch.load("model.pth"))  
model.eval()  

结论

通过本文,我们系统梳理了 PyTorch 的核心概念、编程实践和案例应用。从张量操作到自动求导,从简单线性回归到复杂 CNN 模型,PyTorch 的灵活性和高效性得到了充分体现。

对于初学者,建议从基础语法开始,逐步通过小项目(如手写数字识别)巩固知识;中级开发者则可以深入探索分布式训练、自定义优化器等高级功能。记住,实践是掌握 PyTorch 的关键——尝试复现经典模型、参与 Kaggle 比赛,或解决实际业务问题,都是提升技能的有效途径。

PyTorch 教程的学习是一个循序渐进的过程,但只要保持好奇心和耐心,你定能掌握这把打开深度学习大门的钥匙。

最新发布