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中的自定义数据处理详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
pytorch nn.Conv2d()中的padding以及输出大小方式
今天小编就为大家分享一篇pytorch nn.Conv2d()中的padding以及输出大小方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27- 本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
- 为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
Linux安装Pytorch1.8GPU(CUDA11.1)的实现
这篇文章主要介绍了Linux安装Pytorch1.8GPU(CUDA11.1)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-25- 这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
- 下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
- 自定义一个jquery模态窗口插件,将它集成到现有平台框架中时,它只能在mainFrame窗口中显示,无法在顶层窗口显示. 解决这个问题的办法: 通过以下代码就可能实现在顶层窗口弹窗 复制代码 代码如下: $(window.top.documen...2014-05-31
- 这篇文章主要介绍了自定义feignClient的常见坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-20
- 这篇文章主要介绍了Vue 组件复用多次自定义参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
- 这篇文章主要介绍了Pytorch之扩充tensor的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-05
- 今天小编就为大家分享一篇pytorch 自定义卷积核进行卷积操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-06
- 这篇文章主要介绍了解决pytorch 交叉熵损失输出为负数的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-08
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规则后才能被提交,可以很有效地保证...2015-11-24- 这篇文章主要介绍了jquery自定义插件开发之window的实现过程的相关资料,需要的朋友可以参考下...2016-05-09
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
今天小编就为大家分享一篇pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02- 这篇文章主要介绍了pytorch 实现冻结部分参数训练另一部分,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-27
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
这篇文章主要介绍了从Pytorch模型pth文件中读取参数成numpy矩阵的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-04- 这篇文章主要介绍了C#自定义事件监听实现方法,涉及C#事件监听的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
Pytorch 的损失函数Loss function使用详解
今天小编就为大家分享一篇Pytorch 的损失函数Loss function使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-02