在使用Pytorch框架时,torchvision 里面的Dataset 已经包含了各种数据集,需要时可直接调用库函数即可。然而,对于一些自定义的数据集来说,需要自己去定义数据集对象,从而实现训练(测试)时加载数据的功能,一般将类命名为ImageFolder,并且需要实现两个方法。
__getitem__(),返回一个样本
__len() ,返回数据集的长度
1、接下来,通过一个例子,介绍如何处理数据。
data/samples文件夹下存储的是待处理数据,.jpg前面名字该图片中物体的种类,即Lable。
![](https://i-blog.csdnimg.cn/blog_migrate/c5f92b8d0b45fbe146fae40c936fb6bc.png)
2、接下来,封装类及定义初始化方法,直接上代码
![](https://i-blog.csdnimg.cn/blog_migrate/9630849f26591fc098e6e22ae8121aa5.png)
上面说过,root是指存储图片文件的文件夹,这里是‘data/samples’
初始化函数--init--,只是指定图片路径,选择要不要预处理。而self.files是一个列表,存储的是每个图片文件的路径名,如图所示
![](https://i-blog.csdnimg.cn/blog_migrate/5e469278b4794a7d43efb72d26d17fa4.png)
真正读取图片、数据预处理等操作是在--getitem--函数中,并返回一个处理好的样本
3、接下来,实例化对象,并加载数据
(1)预处理模式,这里需要注意的两点是:
由Cv2.imread读取的数据返回值是numpy,而在transform中的操作中,输入数据应该tensor类型的,所以首先需要将numpy数据转换成tensor,才能进行接下来的预处理操作
原始数据中,图片大小不一致,使用DataLoder方法时会出错,必须将所有数据resize成统一大小,才能使用dataloder迭代器
![](https://i-blog.csdnimg.cn/blog_migrate/b0ddf6a70044ca03d1f4e87994c4bb63.png)
(2)实例化对象,预处理模式选择使用上图中定义的方式
![](https://i-blog.csdnimg.cn/blog_migrate/6ef5f08a0da40fb9febdbce47cb30cb7.png)
首先,来看下实例化对象直接根据索引值访问数据的结果,返回的是一个元祖,内容分别表示图片的tensor数据与标签的内容
![](https://i-blog.csdnimg.cn/blog_migrate/82e253b2059adba23a97f5b1d4f2f00a.png)
(3)然后,来看下通过迭代实例化对象,返回的结果
![](https://i-blog.csdnimg.cn/blog_migrate/59f24e783ce619f1eb3f0b1f6fc2a2f6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e51de46cf9ae2903fb429c26029de9e6.png)
(4)在深度学习的训练过程中,需要将数据集按照batch_size分批次送入网络进行训练,这时可以通过Pytorch中提供的DataLoader方法,实现一个迭代器,每次返回一组包含batch_size个样本与标签
torch.utils.data.DataLoder(dataset,batch_size,shuffle,num_worker,drop_last),DataLoder是一个可迭代的数据装载器,组合了数据集与采样器,在给定数据集上提供可迭代对象。该函数中的参数众多,我只列了其中比较常用的部分:
dataset 数据集(可迭代对象),一般就是处理好的ImageFolder
batch_size 批处理最小数量
shuffle 每完成一个epoch,是否需要重新洗牌
num_worker 是否采用多进程读取机制
drop_last 当样本数不能被batch_size整除时,是否舍弃最后一个batch的数据
接下来,可以看看执行后的效果
![](https://i-blog.csdnimg.cn/blog_migrate/57ea5a900219707b97c78b555cff7f4a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f1b0f4e978ac647e4d5cd148e553d441.png)
可以看出,当指定batch_size的大小为2时,每次迭代返回的数据包含两个样本的数据与标签,最后一个批次只剩下一个样本时,并没有抛弃改样本