深度学习----数据集的准备(一)(重点是代码注释清晰明了)


制作不易,如有转载请标明出处,谢谢!!!

一、前言

对于入门深度学习的新手而言,合理使用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库中的数据集时,如果只用训练集、测试集就能够满足目标任务时,那么就按照第三部分的流程去做;如果还需要验证集才能更好地满足任务需求,就按照第四部分的流程去做。感谢观看,欢迎各位朋友随时评论。

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值