PyTorch 图像分类
图像分类是计算机视觉中的一项基本任务,其目标是将输入的图像分配到预定义的类别中。PyTorch 是一个强大的深度学习框架,特别适合用于构建和训练卷积神经网络(CNN)来完成图像分类任务。在本教程中,我们将从零开始,逐步构建一个简单的图像分类模型。
1. 什么是图像分类?
图像分类是指将输入的图像分配到预定义的类别中。例如,给定一张猫或狗的图片,模型需要判断它是猫还是狗。为了实现这一目标,我们通常使用卷积神经网络(CNN),因为它们能够有效地捕捉图像中的空间特征。
2. 准备工作
在开始之前,确保你已经安装了 PyTorch 和 torchvision。你可以通过以下命令安装它们:
pip install torch torchvision
3. 数据准备
图像分类的第一步是准备数据。我们将使用 torchvision
提供的 CIFAR-10
数据集,它包含了 10 个类别的 60000 张 32x32 彩色图像。
import torch
import torchvision
import torchvision.transforms as transforms
# 定义数据预处理
transform = transforms.Compose(
[transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
# 加载训练集和测试集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
shuffle=True, num_workers=2)
testset = torchvision.datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
shuffle=False, num_workers=2)
classes = ('plane', 'car', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck')
备注
transforms.Normalize
用于将图像的像素值归一 化到 [-1, 1] 范围内,这对于训练神经网络非常重要。
4. 构建卷积神经网络
接下来,我们将定义一个简单的卷积神经网络。这个网络包含两个卷积层和三个全连接层。
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
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(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
提示
nn.Conv2d
是卷积层,nn.MaxPool2d
是最大池化层,nn.Linear
是全连接层。F.relu
是激活函数,用于引入非线性。