Pytorch中预置数据集的加载方式

Pytorch中数据集加载方式

数据类型 PyTorch 模块 是否预置数据集
图像/视频 torchvision.datasets ✅ 是
音频 torchaudio.datasets ✅ 是
文本 torchtext.datasets ✅ 是(需安装)
自定义数据 torch.utils.data ❌ 否(需手动实现)
多模态/第三方数据 Hugging Face 等 ✅ 是

深度学习任务中常用数据集来源 

        上表是我们在深度学习任务中常用的数据集来源,这里我们以torchvision为例,来说明预置数据集的加载方式。

torchvision内所有数据集 

torchvision加载数据集模版

CIFER-10数据集

CIFAR-10数据集共有60000个样本,每个样本都是一张32*32像素的RGB图像(彩色图像),每个RGB图像又必定分为3个通道(R通道、G通道、B通道)。这60000个样本被分成了50000个训练样本和10000个测试样本。

Cifer-10数据集概览图(来自官网)

加载数据集

扫描二维码关注公众号,回复: 17639134 查看本文章
'''
root:数据集在你的电脑上的路径,若download=True,root需设置为 './data'
train:训练集还是测试集,train=True,此时加载的是训练集,train=False,此时加载的是测试集
download:是否下载数据集,倘若你手头上没有数据集又想直接训练模型,那么需要将download设置为True
并且将root设置为',/data',因为预置数据集会默认下载到当前工作区域文件夹下,且名称为data
transform:数据预处理函数
'''
import torchvision
#训练集
trainset=torchvision.datasets.数据集名称(root='./data', train=True, download=True, 
transform=transform_train)
#测试集
testset=torchvision.datasets.数据集名称(root='./data', train=False, download=True, transform=transform_test)

 数据预处理

import torchvision.transforms as transforms
transform_train=transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
])
transform_test=transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
])

        torchvision中我们常用transforms模块来对图像数据进行预处理,其中ToTensor()函数是必须要有的(只有将图像数据转换为Tensor才能训练),其余操作可以自行添加,这里我使用了RandomCrop和RandomHorizontalFlip这两个操作

        RandomCrop会将图像随机裁剪为32×32像素,先填充4像素的边界(四周各填充4像素,图像变为40×40),再随机裁剪回32×32。

        RandomHorizontalFlip则是按照50%的概率水平翻转图像。

        经过这两个操作数据的多样性会增强,最后为了加快模型训练速度提升训练进度,一般而言我们都是需要对数据进行标准化处理的,Normalize函数传入的参数为均值mean与方差std

        这里,我们的数据是32x32的jpg图像,有三个通道,因此均值与方差都是三元组,这里的均值与方差的数据是CIFAR-10数据集的统计值。

DataLoder加载数据

        DataLoder用于高效加载和预处理数据,并将其批量提供给模型进行训练或推理。 

from torch.utils.data import DataLoader
'''
dataset:数据集,经过torchvision.datasets.数据集名称()后的训练集或数据集
batch_size:每个批次的样本数。
shuffle:是否是否在每个epoch开始时打乱数据顺序。
num_workers:用于数据加载的子进程数(多进程加速)。可以设置为CPU核心数-1(如4或8)
'''
trainloader=DataLoader(dataset=trainset, batch_size=128, shuffle=True, num_workers=8)
testloader=DataLoader(dataset=testset, batch_size=100, shuffle=False, num_workers=8)

 完整代码

import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
'''数据预处理'''
transform_train=transforms.Compose([
    transforms.RandomCrop(32, padding=4),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
])
transform_test=transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
])
'''加载CIFAR-10数据集'''
################################################################
#训练集
trainset=torchvision.datasets.CIFAR10(
    root='./data', train=True, download=True, transform=transform_train)
trainloader=DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)
################################################################################
#测试集
testset=torchvision.datasets.CIFAR10(
    root='./data', train=False, download=True, transform=transform_test)
testloader=DataLoader(testset, batch_size=100, shuffle=False, num_workers=2)
##############################################################################

        经过上述操作,cifer-10数据集便被成功加载到trainloader和testloader中,接下来便可以将其集用于训练了。