ITPub博客

首页 > 数据库 > 数据库开发技术 > 深度学习10:从零开始,用PyTorch轻松搞定图像分类数据集深度解析与实战

深度学习10:从零开始,用PyTorch轻松搞定图像分类数据集深度解析与实战

原创 数据库开发技术 作者:讳疾忌医-note 时间:2024-12-02 10:00:00 0 删除 编辑

本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身

公众号文章末尾有每日3问,感兴趣可以回答参加一下,第二天给出答案

导读

在深度学习这个领域里,图像分类是个经典又很有挑战性的问题。它要求算法能准确地认出图像里的物体,还要把这些物体归到提前设定好的类别当中。本文会从理论出发,一直到实践,细致地对图像分类数据集进行分析,并且利用PyTorch框架构建一个相对简单的图像分类模型。

一、图像分类数据集概述

图像分类数据集一般由数量众了且标注清晰的图片构了成,每张图片都带有至少一个或多个标签,这些标签用以标明图片中物体的类别。比较常见的图像分类数据集有CIFAR-10MNIST和Fashion-MNIST等。
•CIFAR-10
:包含60000张32x32彩色图像,分为10个类别,每个类别有6000张图像。
•MNIST
:包含70000张28x28灰度图像,分为10个数字类别,每个类别有7000张图像。
Fashion-MNIST
:跟MNIST很像,但图像内容不一样,更复杂些,里面有10种不同类别的衣服。

二、数据预处理与加载

在使用PyTorch进行深度学习模型训练之前,需要对图像数据进行预处理和加载。这通常包括图像缩放、裁剪归一化等操作,以及数据集的划分(训练集验证集测试集)。 以下是一个运用PyTorch去加载CIFAR-10数据集的示例代码:

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')

展示训练集和测试集加载后的图像和标签。

三、模型构建与训练

在PyTorch里,能够利用nn.Module去搭建自定义的神经网络模型。以下便是一个较为简单的卷积神经网络(CNN)模型用以承担CIFAR-10图像的分类任务:

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

classNet(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)

defforward(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()

接下来,我们定义损失函数和优化器,并进行模型训练:

import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

for epoch inrange(2):# 循环遍历数据集多次

   running_loss =0.0
for i, data inenumerate(trainloader,0):
# 获取输入
       inputs, labels = data

# 零参数梯度
       optimizer.zero_grad()

# 前向传播 + 反向传播 + 优化
       outputs = net(inputs)
       loss = criterion(outputs, labels)
       loss.backward()
       optimizer.step()

# 打印统计信息
       running_loss += loss.item()
if i %2000==1999:# 每2000个小批量打印一次
print('[%d, %5d] loss: %.3f'%
(epoch +1, i +1, running_loss /2000))
           running_loss =0.0

print('Finished Training')

训练过程中的损失值输出。

四、模型评估与测试

最后咱们用测试集去对模型的性能展开评估。下面就是在测试集上让模型运行并且计算准确率的代码:

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('Accuracy of the network on the 10000 test images: %d %%'%(
100* correct / total))

测试集上的准确率输出

五、总结与展望

本文深入解析了图像分类数据集在深度学习中的应用,并使用PyTorch框架实现了一个简单的卷积神经网络模型进行CIFAR-10图像分类任务。通过数据预处理,模型构建,训练与评估等步骤,我们得到了一个具有一定准确率的图像分类模型。未来能试着用更复杂的模型结构,用更大的数据集,还采用更优化的训练策略,来提升模型的性能。

问题: 1、减少batch_size(如减少到1)是否会影响读取性能?

2、数据迭代器的性能非常重要。当前的实现足够快吗?探索各种选择来改进它。

3、查阅框架的在线API文档。还有哪些其他数据集可用?



参考文献: 动手学深度学习在线课程

原文作者:讳疾忌医-note;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2024-08-12

  • 博文量
    126
  • 访问量
    73132