pytorch中的自定义数据处理详解
pytorch在数据中采用Dataset的数据保存方式,需要继承data.Dataset类,如果需要自己处理数据的话,需要实现两个基本方法。
:.getitem:返回一条数据或者一个样本,obj[index] = obj.getitem(index). :.len:返回样本的数量 。 len(obj) = obj.len()。
Dataset 在data里,调用的时候使用
from torch.utils import data import os from PIL import Image
数据在调用getitem的时候才会读取图片数据,如果需要可以修改成自己的getitem函数,根据自己的数据集来设定,比如
def _getitem_(self,index): img_path=self.imgs[index]; ##这里理解是加载了所有图像的路径,封装成自身的格式 labels=[] ##根据自己的格式进行处理 pil_img=Image.open(img_path); ##根据上面封装好的格式进行读取 array=np.array(pil_img); ##将读取的图像转成array数据表示的格式 data=t.from_numpy(array) #转成Tensor格式,方便后面网络操作 return data,label; def _len_(self): return len(self.imgs); ###imgs是一个绝对路径
在主函数里调用的时候,只需使用
dataset=Dataset('') ##或者调用自定义的数据处理类 data,label=dataset[0]; ##相当于调用了dataset.__getitem__(0) for img,label in dataset: ##里面也是以字典形式存放 print(img.size(),imf.float().mean(),label);
采用Dataset的缺点在于实际中图像的大小不一,对数据处理中很不友好,其次数据太大,容易造成溢出,需要进行归一化,因此torchvision提供了transforms模块对Image进行和Tensor进行操作。
对PIL_Image的常见操作:
Scale,调整图像尺寸。centerCrop:randomcrop:randomsizecrop:裁剪图片
pad:填充
ToTensor:将Image图像转化成tensor,并自动归一化到[0,1]
对Tensor的常见操作:
Normalize:标准化,减去均值,除以标准差。 ToPILImage:将Tensor转变成PILImage格式,可以方便后续的可视化。
—————————我是分割线—————————
上面介绍了需要自定义的数据处理方法,pytorch早封装好了比较常用方便的方法.
transforms中的ImageFolder, 该类的好处是,所有文件按照类别进行保存,文件名就是类别名,不需要另外再生成label.txt了,也不需要像上面预处理下Label,该类会自动生成标签,构造函数如下:
ImageFolder(root,transform= None,target_transforms=None,loader=default_loader) ##其中root指定路径,transform:对PIL_Image进行转换操作,输入参数是loader的返回对象。target_transform:是label的转换,loader:是指定加载图片的函数,默认操作是读取为PIL_Image对象。
通过该函数得到的Lable按照文件夹名顺序排序后形成字典的,比如{类名:序号从0开始}
,一般最好把文件夹命名为从0开始的数字,和Imageloader的实际的Lable一致,如果不是,可以通过self.class_to_ids来查看你得到的数据的映射关系,比如你的文件夹是cat和dog,那么loader就是自动从0开始标签,self.class_to_ids得到的就是{‘cat':0,'dog':1}。
dataset=ImageLoader('root'); dataset.imgs ##返回图片路径和对应的标签 dataset[5][1] ;##返回第5张图的标签 dataset[5][0]; ##返回第5张图的图像数据,显示出来的就是一副图像,这时候并没有转成Tensor格式,所以需要手动转换 dataset[0][0].size(); ##输出第一个图像的大小 ##得到的结果如下,表示该图像是3通道,大小为224*224 [3,224,224]; ###定义一个transform,对数据进行各种预处理。 mytransform=T.Compose([ randomSize; T.ToTensor(), ##重点是要记得转成Tensor格式 normlize; ]); dataset=ImageLoader('root',transform=mytransform);
调用ImageLoader把读取的图像转成dataset存储后,再使用DataLoader对上面得到的图像tensor数据进行抽样,打乱和分批次操作,操作格式如下:
DataLoader(dataset,batch_size,shuffle=False,sampler=None,num_workers=0,collate_fn=default,pin_memory=False,drop_last=False);
其中:
dataset:加载得到的dataset对象,就是上面得到的DataSet和ImageLoader得到的对象(ImageLoader需要进行tensor转换后才行)。
batch_size:批处理的大小
shuffle:是否要把数据进行打乱。(这样可以防止连续多个样本都是同一类别)
sampler:样本抽样.会改变本身dataset的大小(可以在不是batch倍数的时候使用)
num_workers:多进程数量,0表示不使用多进程。
collate_fn:一般采用默认的batch拼接方式。
pin_memory;是否将数据保存在pin_memory里,将这的数据转到GPU会快一些。
drop_last:有可能不是batch的整数倍,将不足一个batch的数据丢弃。
dataloader是一个迭代对象,使用方法与一个迭代器相似,例如:
for batch_data, batch_label in dataloader: ##是按照一batch的数量进行拼接的,以每batch进行迭代。
--------torchvision数据处理和可视化常用工具--------------
models:保存了训练好的模型
datasets:保存了数据集,主要包括minist,imagenet等
transforms:提供常用的数据预处理操作。
make_grid: make_grid(dataloader[0],4):将第一个batch的图像拼接成4*4网格
save_image:直接将tensor格式的数据保存成图像
tensorboard是tensorflow框架使用的,但是也有针对pytorch的Tensorboardx,能读取数据并进行可视化,使用比tensorflow的更加方便,本文主要介绍另外一种工具visdom,pytorch的专属可视化工具,支持数据,图像,文本,视频的显示。visdom有以下两种概念:
env:环境,默认使用Main环境,不同用户的环境可能不同,需要专门指定。
pane:窗格,用于进行可视化,可以拖放,缩放和保存关闭,可以多个显示。
可以使用pip install visdom直接进行安装,在使用visdom的时候需要注意,保存时候需要手动指定保存的env,其次客户端和服务端之间交互采用tornado框架,不会受其他程序的影响。visdom需要使用nohup python -m visdom.server命令启动,放在后台运行。
import visdom vis=visdom.Visdom(env=u'test');指定一个环境,新建一个客户端,还可以指定host和端口 x=; y=; vis.line(X=x,Y=y,win='sinx',opts={'title':'y=sinx'}; #画图 -line,-image,-text,-histgram,-scatter,-bar,-pie.
同时支持pytorch的tensor和Numpy结构,但不支持int float类型,vis.updateTrace更新之前的图。
visdom的画图工具可以接受两种,一种是image,接受二维或者三维的,前者是黑白的,后者是彩色图像,Images接受一个4维向量的nch*w,c可以是1或者3,代表黑白或者彩色的,n表示图片的数量。
--------临时记录下已有的Loss函数-------
nn.CrossEntropyLoss(); ##交叉熵函数
nn.MSELoss(); ##均方差函数
nn.NLLLoss()
nn.NLL2dLoss();
loss函数后面再学习。
以上这篇pytorch中的自定义数据处理详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。