CIFAR100数据集介绍及使用方法

CIFAR10、CIFAR100数据集的官网链接:http://www.cs.toronto.edu/~kriz/cifar.html

一、CIFAR100概述

CIFAR100数据集有100个类。每个类有600张大小为 32 × 32 32\times 32 32×32的彩色图像,其中500张作为训练集,100张作为测试集。对于每一张图像,它有fine_labelscoarse_labels两个标签,分别代表图像的细粒度和粗粒度标签,对应下图中的classes和superclass。也就是说,CIFAR100数据集是层次的。
在这里插入图片描述

二、CIFAR100数据集文件及导入代码

下载好的CIFAR100数据集解压后,可以看到一共有四个文件,分别是:meta、train、test、file.txt~
在这里插入图片描述导入的代码如下:
(若root根目录下没有cifar100数据集,会自动下载)

CIFAR_PATH = "自己的路径"
mean = [0.5070751592371323, 0.48654887331495095, 0.4409178433670343]
std = [0.2673342858792401, 0.2564384629170883, 0.27615047132568404]
num_workers= 2

def cifar100_dataset(args):
    transform_train = transforms.Compose([
        transforms.RandomCrop(32, padding=4),
        transforms.RandomHorizontalFlip(),
        transforms.RandomRotation(15),  # 数据增强
        transforms.ToTensor(),
        transforms.Normalize(mean, std)
    ])
    transform_test = transforms.Compose(
        [transforms.ToTensor(),
        transforms.Normalize(mean, std)])

    cifar100_training = torchvision.datasets.CIFAR100(root=CIFAR_PATH, train=True, download=True, transform=transform_train)
    trainloader = torch.utils.data.DataLoader(cifar100_training, batch_size=args.bs, shuffle=True, num_workers=num_workers)
        
    cifar100_testing = torchvision.datasets.CIFAR100(root=CIFAR_PATH, train=False, download=True, transform=transform_test)
    testloader = torch.utils.data.DataLoader(cifar100_testing, batch_size=100, shuffle=False, num_workers=num_workers)
    
    return trainloader,testloader

三、数据集文件的更多了解

上面的代码可以直接返回trainloader,testloader导入模型。不过我们想看看train文件中信息是如何存储的,这样有利于我们能够根据自己的想法处理数据集。

官网给出了CIFAR10的读取方法,但没有给CIFAR100的。下面的代码可读取,注意CIFAR100的文件编码是“latin1”,而不是“bytes”。

import pickle
def unpickle(file):
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='latin1')
    return dict

我们获取到字典格式的信息,打印后发现字典中共有filenamesbatch_labelfine_labelscoarse_labelsdata这五个key。分别是图像名称、batch_label、细粒度标签、粗粒度标签、图像表示的信息。

trainobj = unpickle(train_filepath)
for item in trainobj:
    print(item)
'''
outputs:
	filenames
	batch_label
	fine_labels
	coarse_labels
	data
'''

知道了文件结构,我们处理起来就可以更自由,比如可以在训练集中去掉某些类来做异常检测等等。

需要补充的是,如果自行修改了数据集中的某个文件,在运行程序的时候,会重新下载并覆盖原有的数据集。这是因为程序对数据集进行了完整性校验,即判断文件的md5值是否和原始设定值相同。
md5值部分源码截图如下:
在这里插入图片描述
_check_integrity工作原理:
在这里插入图片描述那如果想要使用自己基于CIFAR100修改后的数据集怎么办呢?
办法之一是可以对源码进行修改。比如删去源码部分对md5的判断,让程序以为我们的文件就是原始文件,这样就不会出现覆盖的操作(需要保证自己构造的数据正确性)。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值