torchvision库中数据集的准备
制作不易,如有转载请标明出处,谢谢!!!
一、前言
对于入门深度学习的新手而言,合理使用torchvision库中的数据集来训练神经网络是一个不错的选择。torchvision库提供了多种数据集,根据任务的需求,可以灵活选择合适的数据集。常见的数据集有MNIST、FashionMNIST、CIFAR-10、CIFAR-100等,本文以MNIST为例。
二、导入所需的库
'''
@author: Xiong Bi
@time: 2024/4/10 15:52
'''
'(1)导入所需的库'
from torchvision import datasets, transforms
from torch.utils.data import DataLoader,Subset
'(2)手动设置batch_size的值,当然也可以用 .view() + 占位符-1 的方式来自动地求batch_size的值'
batch_size = 100
三、将 MNIST 数据集划分为训练集、测试集时
3.1 定义数据预处理操作
'(1)使用transforms.Resize()函数将输入图像的尺寸调整为指定的大小,且该函数的输入实参是一个元组,用来指定输入图像的目标大小'
'(2)使用transforms.ToTensor()函数将输入图像转换为Tensor,并将图像的像素值归一化到[0,1]之间,且该函数无输入实参,本身就只是一个转换函数'
'(3)使用transforms.Normalize()函数对输入图像进行标准化,即对输入图像每个通道上的像素值先减去均值,再除以标准差。同时,该函数的输入实参为两个元组,第一个元组是均值元组,第二个元组是标准差元组。'
'最后,使用transforms.Compose([])函数将各类的transforms函数按顺序打包为一个整体,然后作用于输入图像'
transforms = transforms.Compose([
transforms.Resize((224,224)),
transforms.ToTensor(),
'由于MNIST中的图像是灰度图像,其输入通道数为1,所以输入的两个二元组中只有一个通道上有值,另一个通道上无值,且用逗号代替。'
transforms.Normalize((0.1307,), (0.3081,)),
])
3.2 加载数据集
'定义训练集。root表示下载训练数据到目录名为data的文件中,transform表示对训练数据进行数据预处理操作'
train_dataset = datasets.MNIST(root='data',train=True,download=True,transform=transforms)
'定义测试集。root表示下载测试数据到目录名为data的文件中,transform表示对测试数据进行数据预处理操作'
test_dataset = datasets.MNIST(root='data',train=False,download=True, transform=transforms)
3.3 制作数据加载器
'定义训练数据加载器。shuffle=True表示打乱训练数据的顺序,num_workers=4表示用4个子进程并行加载训练数据,提高数据加载的速度'
train_loader = DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True,num_workers=4)
'定义测试数据加载器。shuffle=False表示不打乱测试数据的顺序,num_workers=4表示用4个子进程并行加载测试数据,提高数据加载的速度'
test_loader = DataLoader(dataset=test_dataset,batch_size=batch_size,shuffle=False,num_workers=4)
四、将 MNIST 数据集划分为训练集、测试集、验证集时
4.1 定义数据预处理操作
transforms = transforms.Compose([
transforms.Resize((224,224)),
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,)),
])
4.2 加载数据集
train_dataset = datasets.MNIST(root='data',train=True,download=True,transform=transforms)
test_dataset = datasets.MNIST(root='data',train=False,download=True, transform=transforms)
4.3 设定验证集的大小
因为MNIST数据集中没有单独提供验证集,再加上测试集要用来测试模型的性能,所以只能把原始训练集拿来划分为新的训练集和验证集。
'定义验证集的划分比例为40%'
val_split = 0.4
'len()函数用来获取列表、元组、字符串的长度或元素个数'
'这里用len()函数来获取原始训练集所拥有的图像数量'
train_dataset_size = len(train_dataset)
'list()函数用来生成一个列表'
'range()函数用来生成一个整数序列,其中range(n)生成0到n-1的一个连续整数序列;range(0,n)生成0到n-1的一个连续整数序列;range(0,n,step)生成0到n-1的一个整数序列,且步长为step。'
'生成一个原始训练集索引(序号)列表,其中索引(序号)范围从0 到 train_dataset_size-1'
train_dataset_indices = list(range(train_dataset_size))
'将(原始训练集所拥有的图像数量 * 划分比例)的结果取整后得到 验证集所拥有的图像数量。'
val_dataset_size = int(val_split * train_dataset_size)
4.4 将原始训练集划分为新的训练集和验证集
'随机打乱 原始训练集索引(序号)列表'
np.random.shuffle(train_dataset_indices)
'将打乱后的索引列表分割成:新的训练集索引列表、验证集索引列表'
New_train_dataset_indices, val_dataset_indices = train_dataset_indices[val_dataset_size:], train_dataset_indices[:val_dataset_size]
'Subset()函数用来创建数据集的一个子集。具体用法为:subset_dataset = Subset(original_dataset, indices),其中第一个参数表示原始数据集,第二个参数表示子集的索引列表,subset_dataset表示创建好的子集。'
'利用原始训练集、新的训练集索引列表、验证集索引列表来创建: 新的训练集、验证集'
New_train_dataset = Subset(train_dataset, New_train_dataset_indices)
val_dataset = Subset(train_dataset, val_dataset_indices)
4.5 制作数据加载器
train_loader = DataLoader(dataset=New_train_dataset, batch_size=batch_size, shuffle=True, num_workers=4)
'制作验证数据加载器时,不将验证数据打乱,这样做是为了在评估模型性能时,验证集上的结果是稳定可靠的'
val_loader = DataLoader(dataset=val_dataset, batch_size=batch_size, shuffle=False, num_workers=4)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False, num_workers=4)
五、总结
当选用torchvision库中的数据集时,如果只用训练集、测试集就能够满足目标任务时,那么就按照第三部分的流程去做;如果还需要验证集才能更好地满足任务需求,就按照第四部分的流程去做。感谢观看,欢迎各位朋友随时评论。