Pytorch数据加载
目录:
- 数据集类
- 数据加载器类
- pytorch自带数据集
- 参考资料
使用方法:
1.准备好Dataset实例
2.将dataset交给dataloader打乱顺序,组成batch
1.数据集类
要使用自定义数据集就要继承torch.utils.data.Dataset类,并实现Dataset类的 getitem() 和 len() 方法
我们首先来看一下torch.utils.data.Dataset类源码是怎样写的:
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])
因此当我们要自定义数据集时,要先实现这两个方法:
import torch
from torch.utils.data import Dataset, DataLoader
# 数据集存储路径,windows下需要加r
data_path = r"D:\progWorkspace\PyCharm_workspace\learningPyTorch\datasets"
# 完成数据集类,继承自Dataset类,需要实现两个方法
class MyDataset(Dataset):
def __init__(self):
pass
# 返回指定位置的数据
def __getitem__(self, index):
pass
# 返回数据集中的数据样本的个数
def __len__(self):
pass
2.数据加载器类
import torch
from torch.utils.data import Dataset, DataLoader
train_iter = DataLoader( dataset=dataset, # 要加载的数据集,提前定义的Dataset类实例
shuffle=True, # 是否打乱数据顺序
batch_size=batch_size # 批次大小,即每批多少个样本
num_workers=num_worker # 开启线程的数量
)
# 返回的train_iter是将原数据集dataset按照batch_size分完后的集合,即一个batch_size大小为一个iter
# 因此len(train_iter) = len(dataset) / batch_size
# (有余数时,向上取整,假设共10个样本,batch_size=3,那么剩下的最后一个样本也是要按照一个batch来算的)
3.pytroch自带数据集
pytorch中的两个上层API:torchvision : 图像数据集,torchtext : 文本数据集
例如:
torchvision.datasets.MNIST( 手写数字图片数据 ),这与我们自定义的数据集(继承Dataset类)是一样的,它也是继承自Dataset类
这意味着直接对torchvision.datasets.MNIST进行实例化就可以得到Dataset的实例
#训练集样本
mnist_train = torchvision.datasets.MNIST( root='~/Datasets/MNIST', #数据集文件下载或保存文件路径位置
train=True, #下载的数据集是否为训练集
download=True, #是否下载,如果下载过了那么将download改成false即可
transform=transforms.ToTensor() #transform为对图像的处理函数,做一些想要的预处理
)
#测试集样本
mnist_test = torchvision.datasets.MNIST(root='~/Datasets/MNIST', train=False, download=True, transform=transforms.ToTensor())
torchvision.transforms
1).torchvision.transforms.ToTensor()
将尺寸为 (H x W x C) 且数据位于[0, 255]的PIL图片或者数据类型为np.uint8的NumPy数组
转换为尺寸为(C x H x W)且数据类型为torch.float32且位于[0.0, 1.0]的Tensor。
2).torchvision.transforms.Normalize(mean, std)
利用给定的均值mean和方差std对Tensor进行规范化处理
即图像Tensor的像素值为:
normalized_image = (original_image - mean) / std
注意图像的深度,图像的深度值为多少就分别指定多少个mean和std值
例如:对于RGB深度为3的彩色图像,在对图像对应Tensor进行规范化处理时 trochvision.transforms.Normalize( (mean1, mean2, mean3), (std1, std2, std3) )
3).torchvision.transforms.Compose( transforms )
将多个transforms组合起来使用,数据经过Compose列表中的每个方法的处理
tranforms = torchvision.transforms.Compose([
trochvision.transforms.ToTensor() #先转换为Tensor格式
torchvision.transforms.Normalize( (mean1,mean2, mean3,...), (std1, std2, std3, ...) ) #进行正则标准化
])
transforms = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ])
train_set = torchvision.datasets.CIFAR10( root='./data', train=True,download=False, transform=transforms )
train_loader = torch.utils.data.DataLoader( train_set, batch_size=36,shuffle=True, num_workers=2 )