PyTorch 教程

我将为你提供一个简明且实用的 PyTorch 教程,涵盖核心概念和常见任务,适合初学者和需要快速复习的用户。由于你没有指定具体内容,我将从基础开始,逐步介绍 PyTorch 的核心功能,包括张量操作、构建神经网络、训练模型和数据处理。如果你有具体的需求(例如,专注于计算机视觉、自然语言处理或高级主题),请告诉我,我可以调整内容!


PyTorch 教程:从入门到实践

1. 什么是 PyTorch?

PyTorch 是一个开源的机器学习框架,由 Meta AI 开发,广泛用于深度学习研究和应用。它以动态计算图(Dynamic Computation Graph)为核心,灵活且易于调试,适合快速原型开发。

  • 核心特点
  • 动态计算图:代码运行时构建计算图,便于调试和修改。
  • 张量计算:类似 NumPy,但支持 GPU 加速。
  • 自动求导:通过 autograd 自动计算梯度。
  • 模块化:提供 torch.nn 等模块,简化神经网络构建。

2. 安装 PyTorch

在开始之前,确保安装 PyTorch。你可以通过以下命令安装(建议使用虚拟环境):

pip install torch torchvision torchaudio
  • 访问 PyTorch 官网 获取适合你系统(CPU/GPU)的安装命令。
  • 验证安装:
import torch
print(torch.__version__)  # 输出 PyTorch 版本
print(torch.cuda.is_available())  # 检查 GPU 可用性

3. 张量(Tensor)基础

张量是 PyTorch 的核心数据结构,类似多维数组,支持 CPU 和 GPU 计算。

创建张量

import torch

# 创建张量
x = torch.tensor([1, 2, 3])  # 1D 张量
y = torch.ones(2, 3)  # 2x3 全 1 张量
z = torch.randn(3, 4)  # 3x4 随机张量(正态分布)

# 从 NumPy 转换
import numpy as np
np_array = np.array([[1, 2], [3, 4]])
tensor_from_np = torch.from_numpy(np_array)

print(x, y, z)

张量操作

# 基本运算
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
print(a + b)  # 元素相加
print(torch.matmul(a, b))  # 点积

# 形状操作
x = torch.randn(2, 3)
print(x.view(3, 2))  # 重塑为 3x2
print(x.unsqueeze(0).shape)  # 增加维度:[1, 2, 3]
print(x.squeeze().shape)  # 移除单一维度

# 移动到 GPU
if torch.cuda.is_available():
    x = x.to('cuda')

4. 自动求导(Autograd)

PyTorch 的 autograd 模块自动计算梯度,是深度学习的核心。

# 创建张量,设置 requires_grad=True 以跟踪梯度
x = torch.tensor([2.0, 3.0], requires_grad=True)
y = x ** 2  # 定义运算
z = y.sum()  # 标量输出
z.backward()  # 计算梯度
print(x.grad)  # 输出梯度:dy/dx = 2x
  • 关键点
  • requires_grad=True:启用梯度跟踪。
  • backward():计算梯度。
  • detach():分离张量,停止梯度跟踪。

5. 构建神经网络

使用 torch.nn 模块可以快速构建神经网络。

示例:简单全连接网络

import torch.nn as nn

# 定义模型
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(10, 5)  # 输入 10 维,输出 5 维
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(5, 2)   # 输出 2 维

    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 实例化模型
model = SimpleNN()
print(model)
  • 说明
  • 继承 nn.Module 定义模型。
  • forward 方法中定义前向传播。
  • 使用 nn.Linearnn.ReLU 等模块构建层。

6. 训练模型

以下是一个完整的训练流程,包括数据加载、损失函数和优化器。

示例:训练一个分类模型

import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset

# 模拟数据
X = torch.randn(100, 10)  # 100 个样本,10 维特征
y = torch.randint(0, 2, (100,))  # 0 或 1 的标签
dataset = TensorDataset(X, y)
loader = DataLoader(dataset, batch_size=32, shuffle=True)

# 初始化模型、损失函数和优化器
model = SimpleNN()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 训练循环
for epoch in range(5):  # 5 个 epoch
    for data, target in loader:
        optimizer.zero_grad()  # 清零梯度
        output = model(data)   # 前向传播
        loss = criterion(output, target)  # 计算损失
        loss.backward()        # 反向传播
        optimizer.step()       # 更新参数
    print(f"Epoch {epoch+1}, Loss: {loss.item()}")

7. 数据加载与预处理

PyTorch 提供 torchvisiontorch.utils.data 用于数据处理。

示例:加载 MNIST 数据集

from torchvision import datasets, transforms

# 数据预处理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,), (0.3081,))
])

# 加载 MNIST 数据
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)

# 访问数据
for images, labels in train_loader:
    print(images.shape, labels.shape)  # [batch_size, 1, 28, 28], [batch_size]
    break

8. 保存和加载模型

# 保存模型
torch.save(model.state_dict(), 'model.pth')

# 加载模型
model = SimpleNN()
model.load_state_dict(torch.load('model.pth'))
model.eval()  # 设置为评估模式

9. 使用 GPU 加速

将模型和数据移动到 GPU:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
data, target = data.to(device), target.to(device)

10. 进阶主题(可选)

  • 计算机视觉:使用 torchvision.models 加载预训练模型(如 ResNet、VGG)。
  • 自然语言处理:结合 torchtext 或 Hugging Face 的 transformers 库。
  • 自定义数据集:继承 torch.utils.data.Dataset 创建自定义数据加载器。
  • 分布式训练:使用 torch.distributed 进行多 GPU 训练。

11. 资源推荐

  • 官方文档:https://pytorch.org/docs/stable/index.html
  • 教程:https://pytorch.org/tutorials/
  • GitHub 示例:https://github.com/pytorch/examples
  • 社区:X 平台上的 #PyTorch 标签,搜索最新讨论和代码分享。

常见问题

  • 如何调试模型?
    使用 printtorchsummary 检查模型结构,设置断点或使用 pdb 调试。
  • 如何处理过拟合?
    添加正则化(如 Dropout、nn.Dropout)、数据增强或减少模型复杂度。
  • GPU 内存不足?
    减小 batch size、使用 torch.cuda.empty_cache() 或优化模型。

如果你需要更详细的代码示例(例如,卷积神经网络、RNN、Transformer)、特定任务(如图像分类、生成对抗网络)或对某部分的深入讲解,请告诉我!此外,如果你想生成图表(例如,训练损失曲线),我可以帮你创建可视化内容。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注