pytorch¶
PyTorch 教程详解¶
PyTorch
是一个基于 Python 的深度学习库,广泛应用于学术研究和工业应用。它以动态计算图、灵活的设计和强大的自动微分能力著称,适合开发复杂的深度学习模型。
1. 安装 PyTorch¶
你可以使用 pip
或 conda
安装 PyTorch。在安装时,你可以选择是否支持 GPU(CUDA)。
# 使用 pip 安装 CPU 版本
pip install torch torchvision
# 使用 pip 安装 GPU 版本(CUDA 10.2)
pip install torch torchvision torchaudio
2. PyTorch 的基本概念¶
2.1 Tensor(张量)¶
Tensor
是 PyTorch 中的核心数据结构,类似于 NumPy 的 ndarray
,但具有更强大的功能,特别是可以在 GPU 上运行。
import torch
# 创建一个 5x3 的张量
x = torch.empty(5, 3)
print(x)
# 创建一个随机初始化的张量
x = torch.rand(5, 3)
print(x)
# 使用直接赋值创建张量
x = torch.tensor([5.5, 3])
print(x)
2.2 自动求导(Autograd)¶
Autograd
是 PyTorch 的一个核心功能,支持自动计算梯度,这在训练神经网络时非常有用。
# 创建一个可以计算梯度的张量
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()
# 反向传播计算梯度
out.backward()
# 查看梯度
print(x.grad)
3. 构建神经网络¶
在 PyTorch 中,你可以使用 torch.nn
模块来构建神经网络。
import torch.nn as nn
import torch.nn.functional as F
# 定义一个简单的神经网络
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(28 * 28, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = x.view(-1, 28 * 28)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
net = Net()
print(net)
4. 数据加载与处理¶
torchvision
提供了一些常用的数据集和数据预处理工具。下面是如何加载 MNIST 数据集并进行预处理的示例。
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
# 定义数据转换
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# 加载训练数据集
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = DataLoader(trainset, batch_size=32, shuffle=True)
# 加载测试数据集
testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = DataLoader(testset, batch_size=32, shuffle=False)
5. 训练模型¶
训练模型包括前向传播、计算损失、反向传播以及参数更新。以下是一个简单的训练过程。
import torch.optim as optim
# 使用交叉熵损失函数和随机梯度下降优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
# 训练循环
for epoch in range(10): # 训练10个epoch
running_loss = 0.0
for inputs, labels in trainloader:
# 清零梯度
optimizer.zero_grad()
# 前向传播
outputs = net(inputs)
# 计算损失
loss = criterion(outputs, labels)
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
# 打印损失
running_loss += loss.item()
print(f'Epoch {epoch+1}, Loss: {running_loss/len(trainloader)}')
6. 模型评估¶
在训练完成后,你需要评估模型的性能,通常在测试集上进行。
correct = 0
total = 0
with torch.no_grad(): # 在评估时不需要计算梯度
for inputs, labels in testloader:
outputs = net(inputs)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy: {100 * correct / total} %')
7. 使用 GPU 加速¶
PyTorch 通过 CUDA 支持 GPU 加速,只需将张量或模型移动到 GPU 上即可。
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 将模型和数据移动到 GPU
net.to(device)
for inputs, labels in trainloader:
inputs, labels = inputs.to(device), labels.to(device)
outputs = net(inputs)
# 后续操作...
8. 保存和加载模型¶
PyTorch 提供了简单的方法来保存和加载模型。
# 保存模型
torch.save(net.state_dict(), 'model.pth')
# 加载模型
net = Net()
net.load_state_dict(torch.load('model.pth'))
net.eval() # 切换到评估模式
9. 动态计算图¶
PyTorch 使用动态计算图,每次计算时都会重新创建计算图。这使得在运行时修改模型变得容易,适合需要灵活性和动态调整的场景。
# 示例:在计算过程中添加条件分支
x = torch.randn(1, 1)
y = torch.randn(1, 1, requires_grad=True)
if y.item() > 0:
z = x * y
else:
z = x / y
z.backward()
print(y.grad)
10. PyTorch 生态系统¶
除了核心库外,PyTorch 还包括 torchvision
、torchaudio
和 torchtext
等子库,分别提供了计算机视觉、音频处理和自然语言处理的工具。此外,PyTorch Lightning
和 Hugging Face Transformers
等库提供了高层次的 API 和预训练模型,帮助开发者更快地构建复杂模型。
11. 迁移学习¶
迁移学习是一种将预训练模型应用于新任务的技术。在 PyTorch 中,可以使用 torchvision
提供的预训练模型并进行微调。
import torchvision.models as models
# 加载预训练的 ResNet-18 模型
model = models.resnet18(pretrained=True)
# 冻结模型的所有层
for param in model.parameters():
param.requires_grad = False
# 替换最后一层为新的全连接层(适应新任务)
model.fc = nn.Linear(model.fc.in_features, 10) # 例如,用于 10 类分类
# 现在可以继续训练模型的最后一层
12. 总结¶
PyTorch
以其灵活性和易用性在深度学习领域广受欢迎。通过掌握 PyTorch
,你可以高效地构建、训练和优化各种深度学习模型,应用于计算机视觉、自然语言处理和其他领域的复杂任务。