表白网页制作网站,wordpress分类添加自定义字段,广告网页制作模板,wordpress 底部 wap重点在第二部分的构建数据通道和第三部分的加载数据集
Pytorch通常使用Dataset和DataLoader这两个工具类来构建数据管道。
Dataset定义了数据集的内容#xff0c;它相当于一个类似列表的数据结构#xff0c;具有确定的长度#xff0c;能够用索引获取数据集中的元素。
而D…重点在第二部分的构建数据通道和第三部分的加载数据集
Pytorch通常使用Dataset和DataLoader这两个工具类来构建数据管道。
Dataset定义了数据集的内容它相当于一个类似列表的数据结构具有确定的长度能够用索引获取数据集中的元素。
而DataLoader定义了按batch加载数据集的方法它是一个实现了__iter__方法的可迭代对象每次迭代输出一个batch的数据。
DataLoader能够控制batch的大小batch中元素的采样方法以及将batch结果整理成模型所需输入形式的方法并且能够使用多进程读取数据。
在绝大部分情况下用户只需实现Dataset的__len__方法和__getitem__方法就可以轻松构建自己的数据集并用默认数据管道进行加载。
一Dataset和DataLoader概述
1获取一个batch数据的步骤
让我们考虑一下从一个数据集中获取一个batch的数据需要哪些步骤。
(假定数据集的特征和标签分别表示为张量X和Y数据集可以表示为(X,Y), 假定batch大小为m)
1首先我们要确定数据集的长度n。
结果类似n 1000。
2然后我们从0到n-1的范围中抽样出m个数(batch大小)。
假定m4, 拿到的结果是一个列表类似indices [1,4,8,9]
3接着我们从数据集中去取这m个数对应下标的元素。
拿到的结果是一个元组列表类似samples [(X[1],Y[1]),(X[4],Y[4]),(X[8],Y[8]),(X[9],Y[9])]
4最后我们将结果整理成两个张量作为输出。
拿到的结果是两个张量类似batch (features,labels)
其中 features torch.stack([X[1],X[4],X[8],X[9]])
labels torch.stack([Y[1],Y[4],Y[8],Y[9]])
2Dataset和DataLoader的功能分工
上述第1个步骤确定数据集的长度是由 Dataset的__len__ 方法实现的。
第2个步骤从0到n-1的范围中抽样出m个数的方法是由 DataLoader的 sampler和 batch_sampler参数指定的。
sampler参数指定单个元素抽样方法一般无需用户设置程序默认在DataLoader的参数shuffleTrue时采用随机抽样shuffleFalse时采用顺序抽样。
batch_sampler参数将多个抽样的元素整理成一个列表一般无需用户设置默认方法在DataLoader的参数drop_lastTrue时会丢弃数据集最后一个长度不能被batch大小整除的批次在drop_lastFalse时保留最后一个批次。
第3个步骤的核心逻辑根据下标取数据集中的元素 是由 Dataset的 __getitem__方法实现的。
第4个步骤的逻辑由DataLoader的参数collate_fn指定。一般情况下也无需用户设置。
3Dataset和DataLoader的主要接口
伪代码实际应用意义不大
import torch
class Dataset(object):def __init__(self):passdef __len__(self):raise NotImplementedErrordef __getitem__(self,index):raise NotImplementedErrorclass DataLoader(object):def __init__(self,dataset,batch_size,collate_fn,shuffle True,drop_last False):self.dataset datasetself.sampler torch.utils.data.RandomSampler if shuffle else \torch.utils.data.SequentialSamplerself.batch_sampler torch.utils.data.BatchSamplerself.sample_iter self.batch_sampler(self.sampler(range(len(dataset))),batch_size batch_size,drop_last drop_last)def __next__(self):indices next(self.sample_iter)batch self.collate_fn([self.dataset[i] for i in indices])return batch
二使用Dataset创建数据集
Dataset创建数据集常用的方法有
使用 torch.utils.data.TensorDataset 根据Tensor创建数据集(numpy的arrayPandas的DataFrame需要先转换成Tensor)。
使用 torchvision.datasets.ImageFolder 根据图片目录创建图片数据集。
继承 torch.utils.data.Dataset 创建自定义数据集。
此外还可以通过
torch.utils.data.random_split 将一个数据集分割成多份常用于分割训练集验证集和测试集。
调用Dataset的加法运算符()将多个数据集合并成一个数据集。
1根据Tensor创建数据集
头文件
import numpy as np
import torch
from torch.utils.data import TensorDataset,Dataset,DataLoader,random_split 根据Tensor创建数据集
from sklearn import datasets
iris datasets.load_iris()
ds_iris TensorDataset(torch.tensor(iris.data),torch.tensor(iris.target))分割成训练集和预测集
n_train int(len(ds_iris)*0.8)
n_valid len(ds_iris) - n_train
ds_train,ds_valid random_split(ds_iris,[n_train,n_valid])使用DataLoader加载数据集
dl_train,dl_valid DataLoader(ds_train,batch_size 8),DataLoader(ds_valid,batch_size 8)#查看数据集
for features,labels in dl_train:print(features,labels)break演示加法运算符的合并作用
ds_data ds_train ds_validprint(len(ds_train) ,len(ds_train))
print(len(ds_valid) ,len(ds_valid))
print(len(ds_trainds_valid) ,len(ds_data))print(type(ds_data))2根据图片目录创建图片数据集
头文件
import numpy as np
import torch
from torch.utils.data import DataLoader
from torchvision import transforms,datasets 图片加载
from PIL import Image
img Image.open(./data/cat.jpeg)随机数值翻转
transforms.RandomVerticalFlip()(img)随机旋转
transforms.RandomRotation(45)(img)定义图片增强操作
transform_train transforms.Compose([transforms.RandomHorizontalFlip(), #随机水平翻转transforms.RandomVerticalFlip(), #随机垂直翻转transforms.RandomRotation(45), #随机在45度角度内旋转transforms.ToTensor() #转换成张量]
) transform_valid transforms.Compose([transforms.ToTensor()]
)
根据图片目录创建数据集
ds_train datasets.ImageFolder(./data/cifar2/train/,transform transform_train,target_transform lambda t:torch.tensor([t]).float())
ds_valid datasets.ImageFolder(./data/cifar2/test/,transform transform_train,target_transform lambda t:torch.tensor([t]).float())print(ds_train.class_to_idx)
使用DataLoader加载数据集
#注意windows用户要把num_workers去掉容易报错
dl_train DataLoader(ds_train,batch_size 50,shuffle True,num_workers3)
dl_valid DataLoader(ds_valid,batch_size 50,shuffle True,num_workers3)for features,labels in dl_train:print(features.shape)print(labels.shape)break三使用DataLoader加载数据集
DataLoader能够控制batch的大小batch中元素的采样方法以及将batch结果整理成模型所需输入形式的方法并且能够使用多进程读取数据。
DataLoader的函数签名
DataLoader(dataset,batch_size1,shuffleFalse,samplerNone,batch_samplerNone,num_workers0,collate_fnNone,pin_memoryFalse,drop_lastFalse,timeout0,worker_init_fnNone,multiprocessing_contextNone,
)一般情况下我们仅仅会配置 dataset, batch_size, shuffle, num_workers, drop_last这五个参数其他参数使用默认值即可。 dataset : 数据集 batch_size: 批次大小 shuffle: 是否乱序 sampler: 样本采样函数一般无需设置。 batch_sampler: 批次采样函数一般无需设置。 num_workers: 使用多进程读取数据设置的进程数。 collate_fn: 整理一个批次数据的函数。 pin_memory: 是否设置为锁业内存。默认为False锁业内存不会使用虚拟内存(硬盘)从锁业内存拷贝到GPU上速度会更快。 drop_last: 是否丢弃最后一个样本数量不足batch_size批次数据。 timeout: 加载一个数据批次的最长等待时间一般无需设置。 worker_init_fn: 每个worker中dataset的初始化函数常用于 IterableDataset。一般不使用。
#构建输入数据管道
ds TensorDataset(torch.arange(1,50))
dl DataLoader(ds,batch_size 10,shuffle True,num_workers2,drop_last True)
#迭代数据
for batch, in dl:print(batch)