Pytorch数据读取之Dataset和DataLoader知识总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Pytorch数据读取之Dataset和DataLoader知识总结
⽬录
⼀、前⾔
⼆、Dataset
三、DatasetLoader
四、将Dataset数据和标签放在GPU上(代码执⾏顺序出错则会有bug)
⼀、前⾔
确保安装
scikit-image
numpy
⼆、Dataset
⼀个例⼦:
# 导⼊需要的包
import torch
import torch.utils.data.dataset as Dataset
import numpy as np
# 编造数据
Data = np.asarray([[1, 2], [3, 4],[5, 6], [7, 8]])
Label = np.asarray([[0], [1], [0], [2]])
# 数据[1,2],对应的标签是[0],数据[3,4],对应的标签是[1]
#创建⼦类
class subDataset(Dataset.Dataset):
#初始化,定义数据内容和标签
def __init__(self, Data, Label):
self.Data = Data
bel = Label
#返回数据集⼤⼩
def __len__(self):
return len(self.Data)
#得到数据内容和标签
def __getitem__(self, index):
data = torch.Tensor(self.Data[index])
label = torch.IntTensor(bel[index])
return data, label
# 主函数
if __name__ == '__main__':
dataset = subDataset(Data, Label)
print(dataset)
print('dataset⼤⼩为:', dataset.__len__())
print(dataset.__getitem__(0))
print(dataset[0])
输出的结果
我们有了对Dataset的⼀个整体的把握,再来分析⾥⾯的细节:
#创建⼦类
class subDataset(Dataset.Dataset):
创建⼦类时,继承的时Dataset.Dataset,不是⼀个Dataset。
因为Dataset是module模块,不是class类,所以需要调⽤module⾥的class才⾏,因此是Dataset.Dataset!len和getitem这两个函数,前者给出数据集的⼤⼩**,后者是⽤于查找数据和标签。
是最重要的两个函数,我们后续如果要对数据做⼀些操作基本上都是再这两个函数的基础上进⾏。
三、DatasetLoader
DataLoader(dataset,
batch_size=1,
shuffle=False,
sampler=None,
batch_sampler=None,
num_works=0,
clollate_fn=None,
pin_memory=False,
drop_last=False,
timeout=0,
worker_init_fn=None,
multiprocessing_context=None)
功能:构建可迭代的数据装载器;
dataset:Dataset类,决定数据从哪⾥读取及如何读取;数据集的路径
batchsize:批⼤⼩;
num_works:是否多进程读取数据;只对于CPU
shuffle:每个epoch是否打乱;
drop_last:当样本数不能被batchsize整除时,是否舍弃最后⼀批数据;
Epoch:所有训练样本都已输⼊到模型中,称为⼀个Epoch;
Iteration:⼀批样本输⼊到模型中,称之为⼀个Iteration;
Batchsize:批⼤⼩,决定⼀个Epoch中有多少个Iteration;
还是举⼀个实例:
import torch
import torch.utils.data.dataset as Dataset
import torch.utils.data.dataloader as DataLoader
import numpy as np
Data = np.asarray([[1, 2], [3, 4],[5, 6], [7, 8]])
Label = np.asarray([[0], [1], [0], [2]])
#创建⼦类
class subDataset(Dataset.Dataset):
#初始化,定义数据内容和标签
def __init__(self, Data, Label):
self.Data = Data
bel = Label
#返回数据集⼤⼩
def __len__(self):
return len(self.Data)
#得到数据内容和标签
def __getitem__(self, index):
data = torch.Tensor(self.Data[index])
label = torch.IntTensor(bel[index])
return data, label
if __name__ == '__main__':
dataset = subDataset(Data, Label)
print(dataset)
print('dataset⼤⼩为:', dataset.__len__())
print(dataset.__getitem__(0))
print(dataset[0])
#创建DataLoader迭代器,相当于我们要先定义好前⾯说的Dataset,然后再⽤Dataloader来对数据进⾏⼀些操作,⽐如是否需要打乱,则shuffle=True,是否需要多个进程读取数据num_workers=4,就是四个进程 dataloader = DataLoader.DataLoader(dataset,batch_size= 2, shuffle = False, num_workers= 4)
for i, item in enumerate(dataloader): #可以⽤enumerate来提取出⾥⾯的数据
print('i:', i)
data, label = item #数据是⼀个元组
print('data:', data)
print('label:', label)
四、将Dataset数据和标签放在GPU上(代码执⾏顺序出错则会有bug)
这部分可以直接去看博客:
总结下来时有两种⽅法解决
1.如果在创建Dataset的类时,定义__getitem__⽅法的时候,将数据转变为GPU类型。
则需要将Dataloader⾥⾯的参数num_workers设置为0,因为这个参数是对于CPU ⽽⾔的。
如果数据改成了GPU,则只能单进程。
如果是在Dataloader的部分,先多个⼦进程读取,再转变为GPU,则num_wokers不⽤修改。
就是上述__getitem__部分的代码,移到Dataloader部分。
2.不过⼀般来讲,数据集和标签不会像我们上述编辑的那么简单。
⼀般再kaggle上的标签都是存在CSV这种⽂件中。
需要pandas的配合。
这个进阶可以看:,他是⽤⼈脸图⽚作为数据和⼈脸特征点作为标签。
到此这篇关于Pytorch数据读取之Dataset和DataLoader知识总结的⽂章就介绍到这了,更多相关详解Dataset和DataLoader内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。