pytorch:构建dataset和使用dataloader
在接触任务并使用深度学习方法的时候,我们首先处理的就是数据,对于数据的处理,我们有很多的方法,例如构建任务独有的dataset,使用dataloader得到batch数据大小的迭代器用于训练和测试等任务,使用sampler采样器或者自己定义特殊的采样器指导数据的组织形式,针对任务设计metrics评价指标……
这里,我们介绍基本的dataset的构建和dataloader的使用
所谓数据集,无非就是一组{x:y}的集合吗,你只需要在这个类里说明“有一组{x:y}的集合”就可以了。
对于图像分类任务,图像+分类
对于目标检测任务,图像+bbox、分类
对于超分辨率任务,低分辨率图像+超分辨率图像
对于文本分类任务,文本+分类
dataset的torch官方代码,其中__getitem__和__len__是子类必须继承的。
class Dataset(object):
"""An abstract class representing a Dataset.
All other datasets should subclass it. All subclasses should override
``__len__``, that provides the size of the dataset, and ``__getitem__``,
supporting integer indexing in range from 0 to len(self) exclusive.
"""
def __getitem__(self, index):
raise NotImplementedError
def __len__(self):
raise NotImplementedError
def __add__(self, other):
return ConcatDataset([self, other])
首先,__getitem__就是获取样本对,模型直接通过这一函数获得一对样本对{x:y}(注意要返回一个元组)。__len__是指数据集长度。
例如:
from torch.utils.data import Dataset
import pandas as pd
class myDataset(Dataset):
def __init__(self,csv_file,txt_file,root_dir, other_file):
self.csv_data = pd.read_csv(csv_file)
with open(txt_file,'r') as f:
data_list = f.readlines()
self.txt_data = data_list
self.root_dir = root_dir
def __len__(self):
return len(self.csv_data)
def __gettime__(self,idx):
data = (self.csv_data[idx],self.txt_data[idx])
return data
注意,有时候我们可以直接在dataset部分将数据变为tensor格式,避免在后期训练的过程中重新处理数据,但是很多时候没必要这么做,因为数据并不是都是要直接使用用于训练的,例如在数值化知识图谱的任务中,存储的是用于实体和关系的索引。
tricks
1.一般在任务中我们先对数据进行读入,然后再process阶段使用各种途径生成需要使用的mask,attention,labelmask等,都存在dataset中,方便再训练过程中使用dataloader
2.为了方便得到不同的训练和组织数据,一般再nlp任务中会使用自定义的vocab字母表,实现的基本功能包括id和word、label的互相转换,对于word也可以用tokenizer实现编码,方便之后使用bert预训练模型得到结果,(tokenizer是一种非常好用的编码工具)然后再process阶段和最后的评估阶段实现标签的互换
3.对于不同的任务可能需要处理的东西很多,在参数传递的过程中可以定义为一个类实现参数传递,如果是一个元组意义不是记得很清楚。
dataloader
https://blog.csdn.net/zyq12345678/article/details/90268668
Dataset负责生产数据,DataLoader负责数据的分批(batch_size)、采样(sampler)、传输
主要参数
dataset(Dataset):
传入的数据集
batch_size(int, optional):
每个batch有多少个样本
shuffle(bool, optional):
在每个epoch开始的时候,对数据进行重新打乱
sampler(Sampler, optional):
自定义从数据集中取样本的策略,如果指定这个参数,那么shuffle必须为False
num_workers (int, optional):
这个参数决定了有几个进程来处理data loading。0意味着所有的数据都会被load进主进程。(默认为0)
collate_fn (callable, optional):
将一个list的sample组成一个mini-batch的函数
pin_memory (bool, optional):
如果设置为True,那么data loader将会在返回它们之前,将tensors拷贝到CUDA中的固定内存(CUDA pinned memory)中.
drop_last (bool, optional):
如果设置为True:这个是对最后的未完成的batch来说的,比如你的batch_size设置为64,而一个epoch只有100个样本,那么训练的时候后面的36个就被扔掉了…
如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。
在training过程中将dataset放入即可