AI百事通

从零实现一个AI图像分类器:PyTorch实战教程

📅 2026-06-19📰 ai_generated👁 1 次阅读
从零实现一个AI图像分类器:PyTorch实战教程
PyTorch图像分类深度学习教程实战AI

概述

图像分类是计算机视觉的基础任务。本教程将使用PyTorch框架,在CIFAR-10数据集上训练一个卷积神经网络(CNN)。你将学到:

  • 数据预处理与加载
  • 模型定义(自定义CNN)
  • 训练循环与验证
  • 模型保存与推理
  • 性能调优技巧

环境准备

确保已安装Python 3.8+和PyTorch 2.0+。推荐使用GPU加速。

pip install torch torchvision matplotlib tqdm

第一步:加载数据

CIFAR-10包含10类彩色图像(飞机、汽车、鸟等),每类6000张32x32图片。

import torch
import torchvision
import torchvision.transforms as transforms

# 数据增强与归一化
transform_train = transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])

transform_test = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform_test)
testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

第二步:定义模型

我们构建一个简单的CNN:卷积层+池化层+全连接层。

import torch.nn as nn
import torch.nn.functional as F

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(3, 32, 3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
        self.conv3 = nn.Conv2d(64, 128, 3, padding=1)
        self.pool = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(128 * 4 * 4, 256)
        self.fc2 = nn.Linear(256, 128)
        self.fc3 = nn.Linear(128, 10)
        self.dropout = nn.Dropout(0.5)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = self.pool(F.relu(self.conv3(x)))
        x = x.view(-1, 128 * 4 * 4)
        x = F.relu(self.fc1(x))
        x = self.dropout(x)
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

net = SimpleCNN()

第三步:训练模型

定义损失函数和优化器,开始训练。

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)

for epoch in range(20):  # 训练20轮
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        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):.3f}')

print('训练完成')

第四步:测试模型

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print(f'测试集准确率: {100 * correct / total:.2f}%')

第五步:保存与加载模型

# 保存
PATH = './cifar10_cnn.pth'
torch.save(net.state_dict(), PATH)

# 加载
net = SimpleCNN()
net.load_state_dict(torch.load(PATH))
net.eval()

性能调优技巧

  • 学习率调度:使用torch.optim.lr_scheduler.StepLR每10轮降低学习率。
  • 数据增强:增加旋转、颜色抖动等。
  • 更深的网络:尝试ResNet、DenseNet等预训练模型。
  • 早停:监控验证损失,防止过拟合。

结语

恭喜你完成了第一个图像分类器!这个基础框架可以扩展到更复杂的任务。继续探索,你可以尝试目标检测、语义分割等。