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数据集概览图(来自官网)
加载数据集
'''
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)
数据预处理
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)
##############################################################################