PyTorch 是一个由 Facebook 人工智能研究团队开发的开源深度学习框架,因其具备动态计算图机制和贴近 Python 编程习惯的直观接口而广受欢迎。无论你是从事深度学习研究的专业人员,还是刚刚入门的新手,PyTorch 都能提供灵活且高效的工具来构建、训练和调试神经网络模型。本文将从基础出发,系统性地介绍 PyTorch 的核心概念及其代码实现方式。
二、张量(Tensor)的基本操作
在 PyTorch 中,张量是整个框架的核心数据结构,其功能类似于 NumPy 中的 ndarray,但支持 GPU 加速运算,从而显著提升计算效率。
1. 张量的创建
import torch
import numpy as np
# 从列表创建张量
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)
# 从NumPy数组创建
np_array = np.array([[1, 2], [3, 4]])
tensor_from_np = torch.from_numpy(np_array)
# 创建特殊值张量
zeros_tensor = torch.zeros(2, 3) # 2x3全零张量
ones_tensor = torch.ones(2, 3) # 2x3全一张量
rand_tensor = torch.rand(2, 3) # 2x3随机值张量(均匀分布)
randn_tensor = torch.randn(2, 3) # 2x3随机值张量(标准正态分布)
print("全零张量:\n", zeros_tensor)
print("随机张量:\n", rand_tensor)
2. 常见的张量操作
张量支持多种数学运算以及形状变换操作,例如加减乘除、矩阵乘法、reshape、转置等,便于进行复杂的数值处理。
# 创建示例张量
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
# 基本运算
c = a + b # 或 torch.add(a, b)
d = a * b # 元素级乘法
e = torch.matmul(a, b) # 矩阵乘法
# 形状操作
x = torch.randn(4, 4)
y = x.view(16) # 重塑为16元素向量
z = x.view(-1, 8) # 自动推断维度
print("原始形状:", x.shape)
print("重塑后:", y.shape)
print("自动推断形状:", z.shape)
# 张量切片
tensor = torch.ones(5, 2)
print("第一行:", tensor[0])
print("第一列:", tensor[:, 0])
三、自动求导机制(Autograd)
PyTorch 的自动求导功能是实现神经网络反向传播的关键组件,能够自动追踪计算过程并计算梯度。
# 创建需要梯度追踪的张量
x = torch.tensor([2.0, 3.0], requires_grad=True)
# 定义计算
y = x ** 2
z = y.sum()
# 反向传播计算梯度
z.backward()
print("张量x:", x)
print("z对x的梯度:", x.grad) # dy/dx = 2x = [4.0, 6.0]
在实际模型训练中,有时需要临时禁用或控制梯度的计算,以提高性能或实现特定逻辑。
# 临时禁用梯度追踪(用于模型评估)
with torch.no_grad():
y = x * 2
print("是否追踪梯度:", y.requires_grad)
# 从计算图中分离张量
detached_y = y.detach()
print("分离后是否追踪梯度:", detached_y.requires_grad)
四、神经网络模型的构建
PyTorch 提供了 torch.nn 模块用于搭建神经网络结构。通常通过继承 nn.Module 类来自定义模型架构。
?torch.nn?
?nn.Module?
1. 全连接网络定义示例
import torch.nn as nn
class SimpleNN(nn.Module):
def __init__(self, input_size=10, hidden_size=5, output_size=2):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size) # 输入层到隐藏层
self.relu = nn.ReLU() # 激活函数
self.fc2 = nn.Linear(hidden_size, output_size) # 隐藏层到输出层
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
# 实例化模型
model = SimpleNN()
print(model)
2. 卷积神经网络的应用
针对图像识别类任务,可以使用卷积层构建 CNN 模型,有效提取空间特征。
def __init__(self):
super(ConvNet, self).__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
self.fc1 = nn.Linear(64 * 7 * 7, 128)
self.fc2 = nn.Linear(128, 10)
self.relu = nn.ReLU()
self.pool = nn.MaxPool2d(2)
def forward(self, x):
x = self.relu(self.conv1(x))
x = self.pool(x)
x = self.relu(self.conv2(x))
x = self.pool(x)
x = x.view(-1, 64 * 7 * 7) # 展平
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
五、神经网络的训练流程
完整的训练过程包括损失函数的定义、优化器的选择,以及训练循环的编写。
1. 训练的基本步骤
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,)) # 二进制标签
# 创建数据集和数据加载器
dataset = TensorDataset(X, y)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
# 初始化模型、损失函数和优化器
model = SimpleNN()
criterion = nn.CrossEntropyLoss() # 交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr=0.01) # 随机梯度下降优化器
# 训练循环
num_epochs = 5
for epoch in range(num_epochs):
total_loss = 0
for batch_idx, (data, target) in enumerate(dataloader):
# 前向传播
outputs = model(data)
loss = criterion(outputs, target)
# 反向传播
optimizer.zero_grad() # 清零梯度
loss.backward() # 计算梯度
optimizer.step() # 更新参数
total_loss += loss.item()
print(f'Epoch [{epoch+1}/{num_epochs}], Average Loss: {total_loss/len(dataloader):.4f}')
2. 使用真实数据集:MNIST 示例
借助 PyTorch 内置的 torchvision 工具库,可以方便地加载常用数据集如 MNIST。
?torchvision?
from torchvision import datasets, transforms
# 数据预处理
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# 加载MNIST数据集
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)
# 训练函数
def train_model(model, train_loader, criterion, optimizer, epochs=5):
model.train() # 设置模型为训练模式
for epoch in range(epochs):
running_loss = 0.0
for i, (images, labels) in enumerate(train_loader):
# 前向传播
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss/len(train_loader):.4f}')
六、模型评估与持久化存储
完成训练后,需对模型性能进行评估,并将其保存以便后续加载和推理使用。
1. 模型性能评估
def evaluate_model(model, test_loader):
model.eval() # 设置模型为评估模式
correct = 0
total = 0
with torch.no_grad(): # 禁用梯度计算
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100 * correct / total
print(f'测试集准确率: {accuracy:.2f}%')
return accuracy
# 评估模型
accuracy = evaluate_model(model, test_loader)
2. 模型的保存与加载
可通过序列化模型参数或整个模型结构实现持久化。
# 保存模型
torch.save(model.state_dict(), 'model.pth')
# 加载模型
loaded_model = SimpleNN()
loaded_model.load_state_dict(torch.load('model.pth'))
loaded_model.eval() # 设置为评估模式
七、利用 GPU 进行加速计算
PyTorch 支持无缝切换到 GPU 设备进行张量运算和模型训练,大幅提升计算速度。
# 检查GPU是否可用
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f'使用的设备: {device}')
# 将模型和数据移动到GPU
model = SimpleNN().to(device)
# 在训练循环中,将每个批次的数据移动到GPU
for data, target in dataloader:
data, target = data.to(device), target.to(device)
# ... 训练步骤 ...
八、完整案例:手写数字识别
以下是一个基于 MNIST 数据集的手写数字分类完整实现流程,涵盖数据加载、模型定义、训练与评估全过程。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 设置超参数
batch_size = 64
learning_rate = 0.01
epochs = 5
# 数据预处理
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
# 加载数据
train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)
test_dataset = datasets.MNIST('./data', train=False, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=1000, shuffle=False)
# 定义模型
class MNISTModel(nn.Module):
def __init__(self):
super(MNISTModel, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.fc2 = nn.Linear(128, 10)
self.relu = nn.ReLU()
def forward(self, x):
x = x.view(-1, 784) # 展平图像
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
# 初始化模型、损失函数和优化器
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = MNISTModel().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
# 训练模型
for epoch in range(epochs):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
if batch_idx % 100 == 0:
print(f'Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)}] '
f'Loss: {loss.item():.6f}')
# 评估模型
model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
test_loss += criterion(output, target).item()
pred = output.argmax(dim=1, keepdim=True)
correct += pred.eq(target.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
accuracy = 100. * correct / len(test_loader.dataset)
print(f'\n测试集准确率: {accuracy:.2f}%')
九、进阶技巧与推荐实践
1. 利用预训练模型迁移学习
通过加载已在大型数据集上训练好的模型权重,可快速应用于新任务。
import torchvision.models as models
# 加载预训练的ResNet模型
resnet = models.resnet18(pretrained=True)
# 微调模型:替换最后一层
resnet.fc = nn.Linear(resnet.fc.in_features, 10) # 假设有10个类别
2. 学习率调度策略
动态调整学习率有助于提升收敛速度和最终性能。
# 创建学习率调度器
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=10, gamma=0.1)
# 在训练循环中使用
for epoch in range(epochs):
# 训练步骤...
scheduler.step() # 更新学习率
3. 采用早停法避免过拟合
当验证误差不再下降时提前终止训练,防止模型过度拟合训练数据。
best_accuracy = 0
patience = 3
trigger_times = 0
for epoch in range(100): # 最大100个epoch
train_model(...)
accuracy = evaluate_model(...)
if accuracy > best_accuracy:
best_accuracy = accuracy
trigger_times = 0
# 保存最佳模型
torch.save(model.state_dict(), 'best_model.pth')
else:
trigger_times += 1
if trigger_times >= patience:
print("早停法:停止训练")
break
一、环境配置与安装指南
开始使用前,首先需要正确安装 PyTorch。官方提供了详细的安装说明,用户可根据自己的操作系统、Python 环境及是否拥有 CUDA 兼容显卡选择合适的安装命令。
# 使用pip安装
pip install torch torchvision torchaudio
# 或使用conda安装
conda install pytorch torchvision torchaudio -c pytorch
安装完成后,运行如下代码可验证安装是否成功:
import torch
print(torch.__version__) # 输出PyTorch版本
print(torch.cuda.is_available()) # 检查GPU是否可用
总结
本教程全面介绍了 PyTorch 的关键特性与基本使用方法,内容涵盖张量操作、自动微分机制、神经网络构建、模型训练与评估等核心模块。得益于其动态计算图设计和高度 Python 化的语法风格,PyTorch 具备良好的可读性和调试便利性,非常适合用于深度学习的研究与实验场景。
为进一步深入掌握 PyTorch,建议采取以下行动:
- 查阅官方文档与教程资源
- 积极参与开源项目贡献
- 尝试复现经典论文中的模型结构
- 学习分布式训练、模型压缩等高级主题
希望本内容能为你开启 PyTorch 深度学习之旅提供有力支持。


雷达卡


京公网安备 11010802022788号







