使用Python实现一个简单的图像分类器

19分钟前 3阅读

在深度学习领域,图像分类是一个基础而重要的任务。通过训练神经网络模型,我们可以让计算机自动识别和分类图片中的对象。本文将介绍如何使用Python和深度学习框架PyTorch来构建一个简单的图像分类器,并对CIFAR-10数据集进行训练与评估。

我们将涵盖以下内容:

环境准备数据加载与预处理构建卷积神经网络(CNN)模型训练模型评估可视化预测结果

1. 环境准备

首先,我们需要安装必要的库。推荐使用虚拟环境进行开发,例如condavenv。以下是所需的依赖项:

pip install torch torchvision matplotlib numpy

2. 数据加载与预处理

我们使用PyTorch提供的torchvision.datasets.CIFAR10数据集。该数据集包含10个类别的彩色图像(如飞机、汽车、鸟等),每张图像大小为32x32像素。

import torchfrom torchvision import datasets, transformsfrom torch.utils.data import DataLoader# 定义图像预处理操作transform = transforms.Compose([    transforms.ToTensor(),    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])# 加载训练集和测试集train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)# 创建DataLoaderbatch_size = 64train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 类别标签classes = ('plane', 'car', 'bird', 'cat', 'deer',           'dog', 'frog', 'horse', 'ship', 'truck')

上面的代码定义了数据增强和标准化操作,并使用DataLoader来批量读取数据。

3. 构建卷积神经网络(CNN)

我们将使用一个简单的卷积神经网络结构,包括两个卷积层和三个全连接层。

import torch.nn as nnimport torch.nn.functional as Fclass SimpleCNN(nn.Module):    def __init__(self):        super(SimpleCNN, self).__init__()        # 卷积层        self.conv1 = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=5)        self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=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 = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))  # 第一层卷积+池化        x = F.max_pool2d(F.relu(self.conv2(x)), 2)        # 第二层卷积+池化        x = x.view(-1, self.num_flat_features(x))         # 展平        x = F.relu(self.fc1(x))                          # 第一层全连接        x = F.relu(self.fc2(x))                          # 第二层全连接        x = self.fc3(x)                                  # 输出层        return x    def num_flat_features(self, x):        size = x.size()[1:]  # 所有维度除了批处理维度        return int(torch.prod(torch.tensor(size)))# 实例化模型model = SimpleCNN()print(model)

这段代码定义了一个简单的CNN模型,并打印出其结构。我们可以看到它包含两层卷积层和三层全连接层。

4. 模型训练

接下来我们设置损失函数和优化器,并开始训练过程。

import torch.optim as optim# 设置设备device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model.to(device)# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)# 训练循环num_epochs = 5for epoch in range(num_epochs):    running_loss = 0.0    for i, data in enumerate(train_loader, 0):        inputs, labels = data        inputs, labels = inputs.to(device), labels.to(device)        # 前向传播 + 反向传播 + 优化        optimizer.zero_grad()        outputs = model(inputs)        loss = criterion(outputs, labels)        loss.backward()        optimizer.step()        running_loss += loss.item()        if i % 200 == 199:  # 每200个mini-batch输出一次loss            print(f'[Epoch {epoch + 1}, Batch {i + 1}] Loss: {running_loss / 200:.3f}')            running_loss = 0.0print('Finished Training')

在每个epoch中,我们遍历整个训练集,并更新模型参数。损失值每隔200个批次打印一次。

5. 模型评估

训练完成后,我们在测试集上评估模型性能。

correct = 0total = 0with torch.no_grad():    for data in test_loader:        images, labels = data        images, labels = images.to(device), labels.to(device)        outputs = model(images)        _, predicted = torch.max(outputs.data, 1)        total += labels.size(0)        correct += (predicted == labels).sum().item()print(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')

该段代码计算了模型在测试集上的准确率。

6. 可视化预测结果

为了更直观地查看模型的表现,我们可以可视化一些预测结果。

import matplotlib.pyplot as pltimport numpy as npdef imshow(img):    img = img / 2 + 0.5  # 反归一化    npimg = img.numpy()    plt.imshow(np.transpose(npimg, (1, 2, 0)))    plt.show()# 获取一些测试图像dataiter = iter(test_loader)images, labels = next(dataiter)# 显示图像imshow(torchvision.utils.make_grid(images))# 预测outputs = model(images.to(device))_, predicted = torch.max(outputs, 1)# 打印真实标签和预测标签print('GroundTruth: ', ' '.join(f'{classes[labels[j]]}' for j in range(batch_size)))print('Predicted:   ', ' '.join(f'{classes[predicted[j]]}' for j in range(batch_size)))

以上代码展示了部分测试图像及其对应的预测结果。


总结

本文介绍了如何使用PyTorch构建一个简单的图像分类器,并完成了从数据加载、模型构建、训练到评估的完整流程。虽然这个模型在CIFAR-10上的表现可能不是最优的,但它提供了一个良好的起点。你可以尝试改进模型结构、调整超参数、增加正则化等方法来提升性能。

如果你对图像分类感兴趣,可以进一步探索更复杂的网络结构,如ResNet、VGG、EfficientNet等,以及使用迁移学习的方法来加速训练并提高精度。

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第3645名访客 今日有14篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!