pytorch中的自定义数据处理详解


Posted in Python onJanuary 06, 2020

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中的自定义数据处理详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的jpg格式图片修复代码
Apr 21 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
python中文件变化监控示例(watchdog)
Oct 16 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
OpenCV+python手势识别框架和实例讲解
Aug 03 Python
Python3分析处理声音数据的例子
Aug 27 Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
使用python从三个角度解决josephus问题的方法
Mar 27 Python
详解python方法之绑定方法与非绑定方法
Aug 17 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 Python
Python 实现RSA加解密文本文件
Dec 30 Python
如何基于Python实现自动扫雷
Jan 06 #Python
pytorch 自定义参数不更新方式
Jan 06 #Python
3种python调用其他脚本的方法
Jan 06 #Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 #Python
浅析Python3 pip换源问题
Jan 06 #Python
通过实例学习Python Excel操作
Jan 06 #Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 #Python
You might like
PHP读MYSQL中文乱码的解决方法
2006/12/17 PHP
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
Symfony控制层深入详解
2016/03/17 PHP
php的扩展写法总结
2019/05/14 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
jquery 图片轮换效果
2010/07/29 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
vue router2.0二级路由的简单使用
2017/07/05 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
python合并已经存在的sheet数据到新sheet的方法
2018/12/11 Python
python实现文本界面网络聊天室
2018/12/12 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
pyspark给dataframe增加新的一列的实现示例
2020/04/24 Python
Django 解决由save方法引发的错误
2020/05/21 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
艺术专业大学生自我评价
2013/09/22 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
接收函格式
2015/01/30 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书