Cifar-10图像分类竞赛

机器学习 Cifar图像分类竞赛

一、实验环境

PC机,Python

二、代码

#%%
import torch
import torch.nn as nn
import torch.nn.functional as F

import torchvision
import torchvision.datasets as dset
import torchvision.transforms as transforms

import torch.optim as optim
import torchvision.models as models

import PIL.Image as Image
import os
#%%
image_size = (224,224)
data_transform=transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.Resize(image_size),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
    ])
#%%
train_data=dset.ImageFolder(root="../input/cifar10",transform=data_transform)
# 数据集长度
totallen = len(train_data)
print('train data length:',totallen)
#%%
trainlen = int(totallen*0.95)
vallen = totallen - trainlen
train_db,val_db=torch.utils.data.random_split(train_data,[trainlen,vallen])
print('train:',len(train_db),'validation:',len(val_db))
#%%
# batch size
bs=20
# 训练集
train_loader=torch.utils.data.DataLoader(train_db,batch_size=bs, shuffle=True,num_workers=2)
# 验证集
val_loader=torch.utils.data.DataLoader(val_db,batch_size=bs, shuffle=True,num_workers=2)
#%%
def get_num_correct(out, labels):
    return out.argmax(dim=1).eq(labels).sum().item()
#%%
batch = next(iter(train_loader))
#%%
batch[1]
#%%
import torchvision.models as models
resnext101= models.resnet.resnext101_32x8d(pretrained=True)
#%%
model = resnext101
n_classes = len(train_data.classes)
model.fc = nn.Linear(2048, n_classes)
#%%
import torch.nn.init as init

for name, module in model._modules.items():
    if(name=='fc'):
        # print(module.weight.shape)
        init.kaiming_uniform_(module.weight, a=0, mode='fan_in')
#%%
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(device)
#%%
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min',patience=1)
epoch_num = 12
model = model.to('cuda')
for epoch in range(epoch_num):
    total_loss=0
    total_correct=0
    val_correct=0
    for batch in train_loader:#GetBatch
        images,labels=batch
        images = images.to('cuda')
        labels = labels.to('cuda')
        outs=model(images)#PassBatch
        loss=F.cross_entropy(outs,labels)#CalculateLoss
        optimizer.zero_grad()
        loss.backward()#CalculateGradients
        optimizer.step()#UpdateWeights
        total_loss+=loss.item()
        total_correct+=get_num_correct(outs,labels)
    scheduler.step(total_loss)
    for batch in val_loader:
        images,labels=batch
        images = images.to('cuda')
        labels = labels.to('cuda')
        outs=model(images)
        val_correct+=get_num_correct(outs,labels)
    print("loss:",total_loss,"train_correct:",total_correct/trainlen, "val_correct:",val_correct/vallen)
#%%
torch.save(model, 'Cifar10-Resnext101_0.978.pkl')
#%%
import os
def file_name(file_dir):
    L=[]
    for root, dirs, files in os.walk(file_dir):
        for file in files:
            if os.path.splitext(file)[1] == '.png':
                L.append(os.path.join(root, file))
    L.sort()
    return L
#%%
model = torch.load('Cifar10-Resnext101_0.978.pkl')
model.eval()
#%%
test_path=file_name('/ilab/datasets/local/cifar10/test')
#%%
model.to('cpu')
pre=[]
for i in range(9000):
    filename=test_path[i]
    input_image = Image.open(filename).convert('RGB')
    input_tensor = data_transform(input_image)
    input_batch = input_tensor.unsqueeze(0) 
    output = model(input_batch)
    #print(output[0].shape)
    prob = F.softmax(output[0], dim=0)
    indexs = torch.argsort(-prob)
    #if i%100==0:
    print("i=",i," index:", indexs[0].item(), " prob: ", prob[indexs[0]])
    pre.append(indexs[0].item())
#%%
with open('/home/ilab/submission','a') as f:
    for i in range(9000):
        f.write('%04d.png %s\n'%(i+1,train_data.classes[pre[i]]))

二、实验结果与分析

1、猎豹平台提交结果:
在这里插入图片描述
2、承接上文实验五垃圾分类,本文中所进行的操作大致与上文相同,但cifar-10图像分类数据集是远大于垃圾分类数据集的。因此,在平台上提交时会存在断联的情况,面对这种情况,我们按文件路径分批次进行预测保存。本文与垃圾分类的另一大区别在于的学习率的动态调整,scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,‘min’,patience=1)。
动态调整学习率的相关操作介绍

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CIFAR-10数据集合是一个常用的计算机视觉数据集,主要用于图像分类任务。该数据集包含了10个不同类别的图片,每个类别有6000张图片,总共有60000张图片。 这些图片被分为5个训练批次和1个测试批次,每个批次包含10000张图片。训练批次用于模型的训练过程,测试批次用于验证训练好的模型的性能。 每一张图片的尺寸是32x32像素,并且使用RGB色彩模式进行表示,每个像素的值范围在0到255之间。这意味着每一张图片是一个3维矩阵,其中每个维度表示红、绿、蓝三种颜色的亮度。 CIFAR-10数据集包含以下10个类别:飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车。这些类别是相对容易区分的,因此被广泛应用于图像分类的实验研究和算法评估。 该数据集的目标是让深度学习模型能够对给定图片进行准确的分类。由于数据集相对小型,对于初学者而言,它是一个非常适合用于学习和研究的资料集。 总的来说,CIFAR-10数据集合是一个十分丰富、多样化且广泛应用的图像数据集,对于图像分类和深度学习算法的发展具有重要意义。 ### 回答2: CIFAR-10数据集合是一个包含了10个类别的图像数据集合,每个类别都有6000张彩色图片。这些图片的尺寸是32x32像素,且都是以.jpg格式存储的。CIFAR-1010个类别分别是:飞机、汽车、鸟类、猫、鹿、狗、青蛙、马、船和卡车。 这个数据集合是机器学习和计算机视觉领域中非常常用的数据集合之一,被广泛用于图像分类、目标检测和图像识别等任务的训练和评估。CIFAR-10数据集的目标是让机器能够根据图像的特征和内容将其正确地归类到对应的类别中。 通过使用CIFAR-10数据集合,研究人员和开发者可以设计和训练各种图像分类算法和模型,比如卷积神经网络(Convolutional Neural Networks,CNN)等。这个数据集合的特点是每个图片都有固定的尺寸且类别分布均匀,同时数据集中的图片也相对较多,这使得它成为了一个用于深度学习和模型评估的理想数据集之一。 CIFAR-10的数据集合提供了一个用于机器学习任务的有效起点,同时也鼓励了对图像分类和识别的进一步研究和探索。这个数据集合已经被广泛应用于各种图像分析的研究项目和竞赛中,成为了图像识别算法性能评估的标准基准之一。 ### 回答3: CIFAR-10数据集合是一个广泛使用的图像分类数据集合,包含了来自10个不同类别的60000张32x32像素的彩色图片。这个数据集合用于训练和评估机器学习算法和模型。 CIFAR-10数据集合中的图像分为10个类别,分别是:飞机、汽车、鸟、猫、鹿、狗、蛙、马、船和卡车。每个类别包含6000张图像,其中5000张用于训练集,1000张用于测试集。这样的分布使得数据集合中的类别相对平衡,并且大致保持了现实世界中不同类别图像的比例。 每张图像以RGB格式保存,即每个像素有三个通道,分别表示红、绿和蓝的强度。这种彩色图像的表示方式可以更好地捕捉图像中的细节和颜色信息,有助于提高机器学习模型训练的准确性。 CIFAR-10数据集合可以用于训练和评估不同类型的机器学习算法和模型,包括传统的机器学习算法和深度学习模型。由于图像分类是计算机视觉中一个重要的任务,CIFAR-10数据集合被广泛用于图像分类算法的研究和性能评估。 在使用CIFAR-10数据集合之前,通常会对数据进行一些预处理,如像素归一化和数据增强。像素归一化将图像的像素值缩放到0-1之间,以便更好地进行数值计算。数据增强则通过应用旋转、平移、缩放和翻转等变换来生成更多的训练样本,从而提高模型的泛化能力。 总之,CIFAR-10数据集合是一个用于图像分类的常用数据集合,具有多样化的图像类别和颜色信息。通过使用这个数据集合,可以训练和评估各种机器学习算法和模型,提高图像分类任务的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值