PyTorch 学习笔记(一):让PyTorch读取你的数据集

2019 年 4 月 24 日 极市平台

加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流点击文末“阅读原文”立刻申请入群~


作者 | 余霆嵩

来源专栏 | PyTorch学习笔记

已获作者原创授权,请勿二次转发


本文截取自一个github上千星的火爆教程——《PyTorch 模型训练实用教程》教程内容主要为在 PyTorch 中训练一个模型所可能涉及到的方法及函数的详解等,本文为作者整理的学习笔记(一),后续会继续更新这个系列,欢迎关注。

项目代码:https://github.com/tensor-yu/PyTorch_Tutorial



想让PyTorch能读取我们自己的数据,首先要了解pytroch读取图片的机制和流程,然后按流程编写代码。


Dataset类

PyTorch读取图片,主要是通过Dataset类,所以先简单了解一下Dataset类。Dataset类作为所有的datasets的基类存在,所有的datasets都需要继承它,类似于C++中的虚基类。


源码如下:

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 NotImplementedErrordef __len__(self):    raise NotImplementedErrordef __add__(self, other):    return ConcatDataset([self, other])

这里重点看 getitem函数,getitem接收一个index,然后返回图片数据和标签,这个index通常指的是一个list的index,这个list的每个元素就包含了图片数据的路径和标签信息。


然而,如何制作这个list呢,通常的方法是将图片的路径和标签信息存储在一个txt中,然后从该txt中读取。那么读取自己数据的基本流程就是:1. 制作存储了图片的路径和标签信息的txt 2. 将这些信息转化为list,该list每一个元素对应一个样本 3. 通过getitem函数,读取数据和标签,并返回数据和标签


在训练代码里是感觉不到这些操作的,只会看到通过DataLoader就可以获取一个batch的数据,其实触发去读取图片这些操作的是DataLoader里的iter(self),后面会详细讲解读取过程。在本小节,主要讲Dataset子类。因此,要让PyTorch能读取自己的数据集,只需要两步:1. 制作图片数据的索引 2. 构建Dataset子类


  1. 制作图片数据的索引 这个比较简单,就是读取图片路径,标签,保存到txt文件中,这里注意格式就好 特别注意的是,txt中的路径,是以训练时的那个py文件所在的目录为工作目录,所以这里需要提前算好相对路径!运行代码 Code/1_data_prepare/1_3_generate_txt.py,即会在/Data/文件夹下面看到 train.txt valid.txt txt中是这样的:




构建Dataset子类

下面是本实验构建的Dataset子类——MyDataset类:

# coding: utf-8from PIL import Imagefrom torch.utils.data import Datasetclass MyDataset(Dataset):def __init__(self, txt_path, transform = None, target_transform = None):    fh = open(txt_path, 'r')    imgs = []    for line in fh:        line = line.rstrip()        words = line.split()        imgs.append((words[0], int(words[1])))        self.imgs = imgs         self.transform = transform        self.target_transform = target_transformdef __getitem__(self, index):    fn, label = self.imgs[index]    img = Image.open(fn).convert('RGB')     if self.transform is not None:        img = self.transform(img)     return img, labeldef __len__(self):    return len(self.imgs)

首先看看初始化,初始化中从我们准备好的txt里获取图片的路径和标签,并且存储在self.imgs,self.imgs就是上面提到的list,其一个元素对应一个样本的路径和标签,其实就是txt中的一行。


初始化中还会初始化transform,transform是一个Compose类型,里边有一个list,list中就会定义了各种对图像进行处理的操作,可以设置减均值,除标准差,随机裁剪,旋转,翻转,仿射变换等操作。


在这里我们可以知道,一张图片读取进来之后,会经过数据处理(数据增强),最终变成输入模型的数据。这里就有一点需要注意,PyTorch的数据增强是将原始图片进行了处理,并不会生成新的一份图片,而是“覆盖”原图,当采用randomcrop之类的随机操作时,每个epoch输入进来的图片几乎不会是一模一样的,这达到了样本多样性的功能。

然后看看核心的 getitem函数:


第一行:self.imgs 是一个list,也就是一开始提到的list,self.imgs的一个元素是一个str,包含图片路径,图片标签,这些信息是从txt文件中读取


第二行:利用Image.open对图片进行读取,img类型为 Image ,mode=‘RGB’


第三行与第四行:对图片进行处理,这个transform里边可以实现 减均值,除标准差,随机裁剪,旋转,翻转,放射变换,等等操作,这个放在后面会详细讲解。


当Mydataset构建好,剩下的操作就交给DataLoder,在DataLoder中,会触发Mydataset中的getiterm函数读取一张图片的数据和标签,并拼接成一个batch返回,作为模型真正的输入。下一小节将会通过一个小例子,介绍DataLoder是如何获取一个batch,以及一张图片是如何被PyTorch读取,最终变为模型的输入的。




*延伸阅读


点击左下角阅读原文”,即可申请加入极市目标跟踪、目标检测、工业检测、人脸方向、视觉竞赛等技术交流群,更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流,一起来让思想之光照的更远吧~


觉得有用麻烦给个在看啦~  

登录查看更多
16

相关内容

【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
160+阅读 · 2020年5月14日
【经典书】数据结构与算法C++,第二版,738页pdf
专知会员服务
165+阅读 · 2020年3月27日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
160+阅读 · 2019年10月28日
机器学习入门的经验与建议
专知会员服务
90+阅读 · 2019年10月10日
TensorFlow 2.0 学习资源汇总
专知会员服务
66+阅读 · 2019年10月9日
学习自然语言处理路线图
专知会员服务
133+阅读 · 2019年9月24日
PyTorch模型训练特征图可视化(TensorboardX)
极市平台
33+阅读 · 2019年6月29日
如何给你PyTorch里的Dataloader打鸡血
极市平台
15+阅读 · 2019年5月21日
PyTorch 学习笔记(七):PyTorch的十个优化器
极市平台
8+阅读 · 2019年5月19日
PyTorch 学习笔记(六):PyTorch的十七个损失函数
极市平台
47+阅读 · 2019年5月13日
PyTorch 学习笔记(五):Finetune和各层定制学习率
PyTorch 学习笔记(四):权值初始化的十种方法
极市平台
14+阅读 · 2019年5月1日
PyTorch 学习笔记(三):transforms的二十二个方法
极市平台
12+阅读 · 2019年4月28日
Arxiv
3+阅读 · 2019年3月1日
Arxiv
6+阅读 · 2018年5月22日
Arxiv
5+阅读 · 2018年5月1日
VIP会员
相关VIP内容
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
190+阅读 · 2020年6月29日
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
160+阅读 · 2020年5月14日
【经典书】数据结构与算法C++,第二版,738页pdf
专知会员服务
165+阅读 · 2020年3月27日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
160+阅读 · 2019年10月28日
机器学习入门的经验与建议
专知会员服务
90+阅读 · 2019年10月10日
TensorFlow 2.0 学习资源汇总
专知会员服务
66+阅读 · 2019年10月9日
学习自然语言处理路线图
专知会员服务
133+阅读 · 2019年9月24日
相关资讯
PyTorch模型训练特征图可视化(TensorboardX)
极市平台
33+阅读 · 2019年6月29日
如何给你PyTorch里的Dataloader打鸡血
极市平台
15+阅读 · 2019年5月21日
PyTorch 学习笔记(七):PyTorch的十个优化器
极市平台
8+阅读 · 2019年5月19日
PyTorch 学习笔记(六):PyTorch的十七个损失函数
极市平台
47+阅读 · 2019年5月13日
PyTorch 学习笔记(五):Finetune和各层定制学习率
PyTorch 学习笔记(四):权值初始化的十种方法
极市平台
14+阅读 · 2019年5月1日
PyTorch 学习笔记(三):transforms的二十二个方法
极市平台
12+阅读 · 2019年4月28日
Top
微信扫码咨询专知VIP会员