概述
文章目录
- 前言
- 一、Dataset 和 Dataloader概述
- 怎样在torch中构建自己的dataset类?
- 介绍 DataLoader(object) 中的参数含义
- 二、Dataset 和 Dataloader的使用
- 总结
前言
学习pytorch的Dataset 和 Dataloader ,了解Dataset类 和 Dataloader类的作用;在自定义dataset类时,必须实现三个函数,以及DataLoader每个参数的含义;最后通过代码了解Dataset 和 Dataloader具体是如何获取和加载数据集的。
一、Dataset 和 Dataloader概述
Dataset类是用来处理单个训练样本的,也就是如何从磁盘中读取训练数据集,包括特征和标签,最终映射成(x,y)的形式。
Dataloader类是对多个样本而言的,DataLoader是Pytorch中用来处理模型输入数据的一个工具类。
怎样在torch中构建自己的dataset类?
自定义的dataset类必须实现: __ init __, __ len __,以及 __ getitem __这三个函数。
- __ init __(self, annotations_file, img_dir, transform=None, target_transform=None) :通常要传入读取数据集所在的目录/文件路径。
- __ len __:函数返回整个数据库的大小。
- __ getitem __(self, idx):通过index返回一个样本(image,label)。
举例:
def __getitem__(self, idx):
img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0]) //通过index 找到照片的路径
image = read_image(img_path) //将照片加载到内存中
label = self.img_labels.iloc[idx, 1] //通过index得到label
if self.transform: //通过transform对image和label进行一系列的变换
image = self.transform(image)
if self.target_transform:
label = self.target_transform(label)
return image, label
dataset结束后要把单个样本组成一个个的minibatch。当我们训练模型的时候,希望传到模型中的是一个个小的批次 minibatch。
介绍 DataLoader(object) 中的参数含义
-
dataset(Dataset):dataset类的一个实例化对象,传入的数据集
-
batch_size(int, optional):默认值为1,每个batch有多少个样本
-
shuffle(bool, optional):在每个训练周期后是否要对数据进行打乱,为true的话,顺序打乱,为false的话,顺序不变。
-
sampler(Sampler, optional):决定怎样对数据进行采样。如果指定这个参数,那么shuffle必须为False。sampler和shuffle是互斥的,不能同时设置。如果自定义sample,就不需要shuffle,没有意义。
-
batch_sampler(Sampler, optional):与sampler类似,但是一次只返回一个batch的indices(索引),需要注意的是,一旦指定了这个参数,那么batch_size,shuffle,sampler,drop_last就不能再制定了(互斥——Mutually exclusive)。batch_sampler是batch级别的采样,Sampler是样本级别的采样。
-
num_workers (int, optional):这个参数决定了有几个进程来处理data loadin,0意味着所有的数据都会被load进主进程。(默认为0)
-
collate_fn (callable, optional):将一个list的sample组成一个mini-batch的函数,对sample培养的小批次进行再处理。
-
pin_memory (bool, optional): 如果设置为True,那么data loader将会在返回它们之前,将tensors拷贝到CUDA中的固定内存(CUDA pinned memory)中.
-
drop_last (bool, optional):如果总样本的数目不是batch_size的整数倍的话,设为true则把最后的一小批次丢掉。 比如你的batch_size设置为64,而一个epoch只有100个样本,那么训练的时候后面的36个就被扔掉了;如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。
-
timeout(numeric, optional):如果是正数,表明等待从worker进程中收集一个batch等待的时间,若超出设定的时间还没有收集到,那就不收集这个内容了。numeric应总是大于等于0,默认为0。
二、Dataset 和 Dataloader的使用
Dataset 练习
1.先创建一个类MyData,继承自Dataset类
class Mydata(Dataset): #继承Dataset类
def __init__(self,root_dir,lable_dir): #类的实例化,主函数创建实例对象时,自动调用该函数,主要作为外部信息传入类中私有方法的接口
self.root_dir=root_dir #图片的目录地址。函数中的变量不能赋值给另一个函数,但self可以
self.lable_dir=lable_dir #图片的标签信息
self.img_name=os.listdir(self.root_dir)#os打开目录,listdir函数返回目录下文件(夹)的名称列表
def __getitem__(self, idx): #实例化__getitem__方法,idx代表索引。实力对象通过:对象[idx],python会自动调用该函数
img_name=self.img_name[idx] #列表中索引为idx的值(文件名称,此处值图片名称)赋给img_name
img_path=os.path.join(self.root_dir,img_name)#具体的图片路径,用os.path.join方法连接两个路径
img=Image.open(img_path) #打开图片,将图片信息赋值给img,具体图片包含的信息可以在python console中查看
lable = self.lable_dir #lable赋值
return img,lable #返回图片信息和标签
def __len__(self): #实例化__len__方法
return len(self.img_name) #返回一共多少张图片,即列表的长度
2.获取数据集
root_dir = "dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)
dataloader练习
1.准备数据集(使用torchvision提供的自定义的数据集)
2.使用dataloader加载测试集
3.使用for循环取出dataloader的返回值
4.使用tensorboard对数据进行展示
import torchvision
#准备的测试数据集
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
# train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, download=True)
# test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, download=True)
test_data = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=torchvision.transforms.ToTensor())
# 下载路径 , 测试集为false , 转为tensor数据集
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)
# batch_size=4 每次从test_data中取四个数据集进行打包,比如从dataset中取img0,img1,img2,img3打包为imgs,取target0,target1,target2,target3打包为targets;imgs和targets作为dataloader的返回
#测试数据集中第一张图片及target
img, target = test_data[0]
print(img.shape)
# torch.Size([3, 32, 32]) 3表示三通道RGB,32x32的彩色图片
print(target)
# 输出3
writer = SummaryWriter("dataloader")
step = 0
for data in test_loader:
imgs, targets = data
print(img.shape)
print(targets)
writer.add_images("test_data", imgs, step)
step = step+1
writer.close()
总结
通过学习了解到dataset主要是告诉程序数据集在什么样的位置,dataloader则是将数据集加载到神经网络当中,从dataset中取数据,取多少,怎么取由dataloader中的参数进行确定。
最后
以上就是漂亮白昼为你收集整理的2022机器学习深度学习学习笔记第二十一周前言一、Dataset 和 Dataloader概述二、Dataset 和 Dataloader的使用总结的全部内容,希望文章能够帮你解决2022机器学习深度学习学习笔记第二十一周前言一、Dataset 和 Dataloader概述二、Dataset 和 Dataloader的使用总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复