pytorch: utils.data 使用案例(自定义数据集)
utils.data包括Dataset和DataLoader。 torch.utils.data.Dataset为抽象类。 自定义数据集需
要继承这个类, 并实现两个函数, 一个是__len__, 另一个是__getitem__, 前者提供数据
的大小(size) , 后者通过给定索引获取数据和标签。
__getitem__一次只能获取一个数据, 所以需要通过torch.utils.data.DataLoader来定义一个新的迭代器, 实现batch读取。
首先我们来定义一个简单的数据集, 然后通过具体使用Dataset及DataLoader, 有一个直观的认识。
导入模块
import math
from torch.utils import data
import numpy as np
import torch
定义数据集的类
class TestDataset(data.Dataset):
def __init__(self):
self.Data=np.asarray([[1,2],[3,4],[2,1],[3,4],[4,5]])
self.Label=np.asarray([0,1,0,1,2])
def __getitem__(self,index):
txt=torch.from_numpy(self.Data[index])
Label=torch.tensor(self.Label[index])
return txt,Label
def __len__(self):
return len(self.Data)
获取数据集中的数据
Test=TestDataset()
print(Test[2]) #相当于__getitem__(2)
print(Test.__len__())
批量读取
test_loader=data.DataLoader(Test,batch_size=2,shuffle=False,num_workers=0)
for i, traindata in enumerate(test_loader):
print("i:",i)
Data,Label=traindata
print("data:",Data)
print("Label:",Label) #分批次传入
转换成迭代器形式
test_loader=data.DataLoader(Test,batch_size=2,shuffle=False,num_workers=0)
dataiter=iter(test_loader)
Data,Label=next(dataiter)
for i ,dataiter in enumerate(test_loader):
print("i:",i)
print("data:",Data)
print("Label:",Label) #分批次传入