安装PyTorch环境
确保已安装Python 3.7+,通过以下命令安装PyTorch(根据CUDA版本选择适配的安装命令):
# 无CUDA版本 pip install torch torchvision # 有CUDA 11.7版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu117
数据准备与加载
使用torchvision.datasets加载标准数据集(如CIFAR-10),或自定义数据集通过Dataset类实现:
from torchvision import datasets, transforms # 数据增强与归一化 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 加载CIFAR-10 train_data = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) train_loader = torch.utils.data.DataLoader(train_data, batch_size=64, shuffle=True)
模型架构设计
继承nn.Module类构建卷积神经网络(以LeNet为例):
import torch.nn as nn class LeNet(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d(3, 6, 5) # 输入通道3,输出通道6,卷积核5x5 self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16*5*5, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(nn.functional.relu(self.conv1(x))) x = self.pool(nn.functional.relu(self.conv2(x))) x = torch.flatten(x, 1) x = nn.functional.relu(self.fc1(x)) x = nn.functional.relu(self.fc2(x)) x = self.fc3(x) return x
训练流程实现
定义损失函数与优化器,编写训练循环:
import torch.optim as optim
model = LeNet()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
for epoch in range(10):
running_loss = 0.0
for i, (inputs, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f'Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.3f}')模型验证与测试
加载测试集评估模型准确率:
test_data = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=64, shuffle=False)
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()
print(f'Test Accuracy: {100 * correct / total:.2f}%')模型保存与加载
使用torch.save保存模型权重或整个模型:
# 保存权重
torch.save(model.state_dict(), 'lenet.pth')
# 加载权重
loaded_model = LeNet()
loaded_model.load_state_dict(torch.load('lenet.pth'))