自定义数据
数据传递机制
我们首先回顾识别手写数字的程序:
从上面的程序,我们可以知道,在PyTorch中,数据传递机制是这样的:1.创建Dataset2.Dataset传递给DataLoader3.DataLoader迭代产生训练数据提供给模型。总结这个数据传递机制就是,Dataset负责建立索引到样本的映射,DataLoader负责以特定的方式从数据集中迭代的产生一个个batch的样本集合。在enumerate过程中实际上是dataloader按照其参数sampler规定的策略调用了其dataset的getitem方法(下文中将介绍该方法)。
在上面的识别手写数字的例子中,数据集是直接下载的,但如果我们自己收集了一些数据,存在电脑文件夹里,我们该如何把这些数据变为可以在PyTorch框架下进行神经网络训练的数据集呢,即如何自定义数据集呢?
PyTorch中Dataset,DataLoader,Sample的关系
PyTorch中Dataset,DataLoader,Sampler的关系可以用下图概括:
用文字表达就是:Dataloader中包含Sampler和Dataset,Sampler产生索引,Dataset拿着这个索引在数据集文件夹中找到对应的样本(每个样本对应一个索引,就像列表中每个元素对应一个索引),并给该样本配置上标签,最后返回(样本+标签)给调用方。
在enumerate过程中,Dataloader按照其参数BatchSampler规定的策略调用其Dataset的getitem方法batchsize次,得到一个batch,该batch中既包含样本,也包含相应的标签。
自定义数据集
torch.utils.data.Dataset 是一个表示数据集的抽象类。任何自定义的数据集都需要继承这个类并覆写相关方法。所谓数据集,其实就是一个负责处理索引(index)到样本(sample)映射的一个类(class)。Pytorch提供两种数据集: Map式数据集 Iterable式数据集。这里我们只介绍前者。
一个Map式的数据集必须要重写getitem(self, index)、 len(self) 两个内建方法,用来表示从索引到样本的映射(Map)。这样一个数据集dataset,举个例子,当使用dataset[idx]命令时,可以在你的硬盘中读取数据集中第idx张图片以及其标签(如果有的话); len(dataset)则会返回这个数据集的容量。
自定义数据集类的范式大致是这样的:
关于Dataset API的官网介绍https://pytorch.org/docs/stable/data.html#dataset-types:
Dataset类的使用:所有的类都应该是此类的子类(也就是说应该继承该类)。所有的子类都要重写(override) len(), getitem()。Ø__len()__ : 此方法应该提供数据集的大小(容量)Ø__getitem()__ : 此方法应该提供支持下标索引方式访问数据集。
DataLoader类的使用如下:
根据这个方式,我们举一个例子。
实例1
从kaggle官网下载dogsVScats的数据集(百度网盘下载链接见文末),该数据集包含test1文件夹和train文件夹,train文件夹中包含12500张猫的图片和12500张狗的图片,图片的文件名中带序号:
sampleSubmission.csv中的内容如下:
我们把其中前10000张猫的图片和10000张狗的图片作为训练集,把后面的2500张猫的图片和2500张狗的图片作为验证集。猫的label记为0,狗的label记为1。因为图片大小不一,所以,我们需要对图像进行transform。
运行结果:
实例2
收集图像样本
以简单的猫狗二分类为例,可以在网上下载一些猫狗图片。创建以下目录:ldata -----------------根目录ldata/test -----------------测试集ldata/train -----------------训练集ldata/val ------------------验证集
在test/train/val之下在校分别创建2个文件夹,dog,cat
cat,dog文件夹下分别存放2类图像:
之后写一个简单的python脚本,生成txt文件,用于指明每个图像和标签的对应关系。格式:/cat/1.jpg 0/dog/1.jpg 1…如图:
至此,样本集的收集以及简单归类完成。
实现
使用到python package
python package目录numpy矩阵操作,对图像进行转置skimage图像处理,图像I/O,图像变换matplotlib图像的显示,可视化os一些文件查找操作torchpytorchtorchvisionpytorch
代码
输出类似:
补充:更简单的方法上述继承Dataset,重写__len()__,__getitem()是通用的方法,过程相对繁琐。对于简单的分类数据集,pytorch中提供了更简便的方式----ImageFolder。
如果每种类别的样本放在各自的文件夹中,则可以直接使用ImageFolder。仍然以cat, dog二分类数据集为例:文件结构:
Code
由于 train 目录下只有2个文件夹,分别为cat, dog, 因此ImageFolder安装顺序对cat使用标签0, dog使用标签1。(输出类似:)
参考文章
https://www.cnblogs.com/picassooo/p/12846617.html
https://www.jb51.net/article/199360.htm
到此这篇关于pytorch自定义数据集的文章就介绍到这了,更多相关pytorch自定义数据集内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!