基于Pytorch框架的CIFAR-10图像分类任务(附带完整代码)

        本文主要实现在pytorch框架下,训练CIFAR数据集,通过观察训练和验证的误差、准确率图像来进一步改善。保存最好的模型。测试集打印整体准确率和每一类别的准确率,并生成混淆矩阵,将其中每一个错误的图片并保存下来。

语言:python

实现方式:pytorch框架, CPU

关键词: CIFAR-10数据集、Dataset和Dataloader、SummaryWriter画图、网络模型搭建、混淆矩阵、统计所有错误类别、Adam优化器

前言:CIFAR-10数据集介绍

        CIFAR-10是一个包含60000张32x32像素的RGB图像的数据集,共有10个类别。其中有50000张用于训练集,10000张用于测试集。每个图像都属于10个类别之一:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。其中训练集和测试集是互相独立的。

        CIFAR-10数据集是机器学习中一个非常常用的图像分类数据集之一,也是深度学习算法的基准测试数据集之一。当我们想要测试新的算法或新的网络结构时,可以使用CIFAR-10数据集验证它们的性能。由于数据集的图像分辨率比较低,因此我们可以较为快速地进行模型训练,并能够在低成本的计算资源上进行模型开发和优化。

        当我们将CIFAR-10数据集导入到计算机中,我们可以使用各种工具和框架来预处理、建模和训练我们的分类器,例如使用Python中的TensorFlow和PyTorch等深度学习框架。(如何下载数据集请看下面代码

        如下图所示:

一、搭建网络模型

        1.代码展示:

import torch
from torch import nn
from torch.nn import ReLU,Linear,Flatten,Sequential
from torch.nn import MaxPool2d
from torch.nn import Conv2d

#搭建网络模型
class Yangc(nn.Module):
    def __init__(self):
        super(Yangc,self).__init__()
        self.model=Sequential(
            Conv2d(3, 32, 5, padding = 2),#有公式可以计算
            ReLU(),
            MaxPool2d(2),    
   
            Conv2d(32, 32, 5, padding = 2),
            ReLU(),
            MaxPool2d(2),

            Conv2d(32, 64, 5, padding = 2),
            ReLU(),
            MaxPool2d(2),

            Flatten(),#展平
            Linear(1024, 512),
            Linear(512, 64),
            Linear(64, 10)
        )

    def forward(self,x):
        x = self.model(x)
        return x
    
if __name__ == '__main__':#写主函数,是为了检验神经网络模型是否搭建正确
    yangc = Yangc()
    input = torch.ones(64,3,32,32)
    output = yangc(input)
    print(output.shape)

输出:

torch.Size([64, 10])

二、开始训练、验证

1.准备数据集

import torch
import os
from torch import nn
from torch.utils.data import DataLoader
import torchvision
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from sklearn.model_selection import train_test_split
import time#用于计时
from model import Yangc#导入模型

#准备数据集,要归一化处理
train_data = torchvision.datasets.CIFAR10(root = "/home/yc/vs_code/model_neural_network/dataset_CIFAR-10",
                                        train = True,#表示为训练集
                                        transform = torchvision.transforms.Compose([torchvision.transforms.ToTensor(),
                                                                                transforms.Normalize(mean = [0.5, 0.5, 0.5],std = [0.5, 0.5, 0.5])
                                                                                ]),#将图片转为tensor格式,并归一化
                                        download = True#若没有CCIFAR-10数据集,则会自动下载并保存。若有数据集,则不会下载
                                        )


#划分数据集
train_data, val_data = train_test_split(train_data, train_size = 0.8, test_size = 0.2)#将训练集按8:2的比例划分为40000训练集,10000验证集

#打印数据集长度
print("训练数据集的长度为:{}".format(len(train_data)))
print("验证数据集的长度为:{}".format(len(val_data)))

# 利用 DataLoader 来加载数据集
train_dataloader = DataLoader(train_data, batch_size = 64, num_workers = 5)
val_dataloader = DataLoader(train_data, batch_size = 64, num_workers = 5)

#定义训练设备
device = (
    "cuda"
    if torch.cuda.is_available()
    else "mps"
    if torch.backends.mps.is_available()
    else "cpu"
)
print(f"Using {device} device")

说明:num_workers=5是基于当时的电脑设备而设置的,故不同的电脑配置,该值不一样,具体可参考这篇博客:num_workers的设置

输出:

训练数据集的长度为:40000
验证数据集的长度为:10000
Using cpu device

2.定义训练、验证函数

#画图
writer = SummaryWriter("img_loss_acc")

#搭建网络模型
model = Yangc()

# 损失函数
loss_fn = nn.CrossEntropyLoss()

# 优化器
learning_rate = 0.001
optimizer = torch.optim.Adam(model.parameters(),lr = learning_rate)

#定义训练函数
def train(train_loader, model, loss_fn, optimizer):
    corrects,num = 0.,0.#不加最后一个0就默认为浮点型
    total_loss = 0.
    model.train()

    for i,(X,targets) in enumerate(train_loader):
        outputs = model(X)
        optimizer.zero_grad()
        loss = loss_fn(outputs, targets)
        total_loss += loss.item()

        # 优化器优化模
  • 12
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,首先需要安装PyTorchCIFAR-10数据集。可以使用以下代码安装: ```python !pip install torch torchvision ``` ```python 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) ``` 然后可以定义模型。这里我们使用一个简单的卷积神经网络: ```python 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() ``` 然后定义损失函数和优化器: ```python import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9) ``` 最后,可以进行训练和测试: ```python for epoch in range(2): # 多次循环数据集 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() 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)) ``` 这样就完成了一个简单的CIFAR-10图像分类PyTorch实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值