一、PyTorch框架简介
1.1 什么是PyTorch
1.2 PyTorch的优势
二、从入门到精通的PyTorch使用教程
2.1 入门阶段
2.1.1 环境安装与配置
2.1.2 Tensor基础操作
2.1.3 自动求导(Autograd)
2.1.4 构建神经网络(nn模块)
2.1.5 损失函数与优化器
2.2 进阶阶段
2.2.1 GPU加速与多GPU使用
2.2.2 数据加载与预处理(torch.utils.data)
2.2.3 自定义模型与层
2.2.4 模型调试与可视化
2.2.5 高级训练技巧
2.3 实战应用与精通
2.3.1 迁移学习与预训练模型
2.3.2 分布式训练和多机训练
2.3.3 模型优化与调参
2.3.4 实战项目示例
2.3.5 框架内部源码阅读与扩展
三、总结
PyTorch是由Facebook的人工智能研究团队开发的一款开源深度学习框架。它基于Python语言开发,具有易用性、灵活性和高效性,主要特点包括:
动态计算图:与TensorFlow的静态图相比,PyTorch采用动态图机制(即运行时定义计算图),便于调试和开发复杂模型。
自动求导:内置强大的自动求导(Autograd)模块,可以自动计算梯度,极大简化了反向传播算法的实现。
丰富的API:提供了张量(Tensor)运算、神经网络层(nn模块)、优化器(optim模块)等丰富的工具和函数,方便快速搭建各种模型。
GPU加速:支持CUDA,可以方便地将数据和模型转移到GPU上加速运算。
灵活性和易用性:由于采用动态图机制,用户可以像写常规Python程序一样定义和修改网络结构,非常适合科研探索与实验。
社区和生态系统:拥有活跃的开发者社区,提供大量的开源模型、工具包和教程。借助TorchVision、TorchText、TorchAudio等扩展库,可以更方便地进行图像、文本和音频的深度学习研究。
调试方便:动态计算图使得每一步计算都可以实时查看和修改,极大地方便了调试和模型理解。
本教程将分为入门、进阶和实战应用三个阶段,每个阶段都有相应的代码示例与讲解。
打开PyTorch官方,选择合适的版本进行安装。
官网地址:Start Locally | PyTorch
pip install torch torchvision
或者
conda install pytorch torchvision cudatoolkit=11.3 -c pytorch
import torchprint(torch.__version__)
import torch
# 创建一个未初始化的 3x3 张量
x = torch.empty(3, 3)
print(x)
# 创建一个随机初始化的张量
x = torch.rand(3, 3)
print(x)
# 创建一个全 0 的张量,并指定数据类型为 long
x = torch.zeros(3, 3, dtype=torch.long)
print(x)
x = torch.rand(3, 3)
y = torch.rand(3, 3)
# 基本加法
z = x + y
# numpy 转换
np_array = x.numpy()
x_from_np = torch.from_numpy(np_array)
# 定义一个 tensor,并设置 requires_grad=True
x = torch.ones(2, 2, requires_grad=True)
print(x)
# 定义一个简单运算
y = x + 2
z = y * y * 3
out = z.mean()
# 反向传播计算梯度
out.backward()
print(x.grad)
nn.Module:所有神经网络模型都需要继承该类。
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 定义一个全连接层:输入维度 784,输出维度 10
self.fc1 = nn.Linear(784, 10)
def forward(self, x):
# 将输入 x 展平成 (batch_size, 784)
x = x.view(-1, 784)
x = self.fc1(x)
return F.log_softmax(x, dim=1)
net = Net()
print(net)
criterion = nn.CrossEntropyLoss()
import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
for epoch in range(10):
for data, target in train_loader:
optimizer.zero_grad() # 清空梯度
output = net(data)
loss = criterion(output, target)
loss.backward() # 反向传播
optimizer.step() # 更新参数
print(f"Epoch {epoch} finished with loss {loss.item()}")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
net.to(device)
data, target = data.to(device), target.to(device)
if torch.cuda.device_count() > 1:
net = nn.DataParallel(net)
from torch.utils.data import Dataset, DataLoader
class MyDataset(Dataset):
def __init__(self, data, labels):
self.data = data
self.labels = labels
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
sample = self.data[idx]
label = self.labels[idx]
return sample, label
dataset = MyDataset(data, labels)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
class MyLayer(nn.Module):
def __init__(self, in_features, out_features):
super(MyLayer, self).__init__()
self.weight = nn.Parameter(torch.randn(in_features, out_features))
def forward(self, x):
return torch.matmul(x, self.weight)
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter(log_dir='./logs')
writer.add_scalar('Loss/train', loss.item(), epoch)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)
for epoch in range(10):
train(...)
scheduler.step()
# 保存模型
torch.save(net.state_dict(), 'model.pth')
# 加载模型
net.load_state_dict(torch.load('model.pth'))
net.eval() # 切换到评估模式
import torchvision.models as models
resnet18 = models.resnet18(pretrained=True)
# 冻结部分参数
for param in resnet18.parameters():
param.requires_grad = False
# 修改最后一层
num_features = resnet18.fc.in_features
resnet18.fc = nn.Linear(num_features, num_classes)
分布式训练:利用torch.distributed 包,实现跨GPU、跨节点训练。常见方法包括:
代码示例:
import torch.distributed as dist
dist.init_process_group(backend='nccl')
net = nn.parallel.DistributedDataParallel(net)
scaler = torch.cuda.amp.GradScaler()
for data, target in train_loader:
optimizer.zero_grad()
with torch.cuda.amp.autocast():
output = net(data)
loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
入门阶段主要掌握 PyTorch 的基本概念、张量操作、自动求导、基本网络构建及训练流程;
进阶阶段深入理解 GPU 加速、数据加载、调试、可视化、学习率调度等技巧,学会自定义模块和高效训练;
实战应用则通过预训练模型、分布式训练、混合精度、超参数优化等高级技术,最终达到精通应用 PyTorch 解决实际问题的水平。
参考资料:矩阵空间,作者-码匠乐乐