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.Linear
、nn.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 提供 torchvision
和 torch.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 标签,搜索最新讨论和代码分享。
常见问题
- 如何调试模型?
使用print
或torchsummary
检查模型结构,设置断点或使用pdb
调试。 - 如何处理过拟合?
添加正则化(如 Dropout、nn.Dropout
)、数据增强或减少模型复杂度。 - GPU 内存不足?
减小 batch size、使用torch.cuda.empty_cache()
或优化模型。
如果你需要更详细的代码示例(例如,卷积神经网络、RNN、Transformer)、特定任务(如图像分类、生成对抗网络)或对某部分的深入讲解,请告诉我!此外,如果你想生成图表(例如,训练损失曲线),我可以帮你创建可视化内容。