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实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
Django 前后台的数据传递的方法
Aug 08 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 Python
python机器学习实战之树回归详解
Dec 20 Python
详解如何用TensorFlow训练和识别/分类自定义图片
Aug 05 Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 Python
Python 识别12306图片验证码物品的实现示例
Jan 20 Python
logging level级别介绍
Feb 21 Python
Keras实现将两个模型连接到一起
May 23 Python
Python几种常见算法汇总
Jun 02 Python
python用tkinter实现一个gui的翻译工具
Oct 26 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的array_multisort()使用方法介绍
2012/05/16 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
可以用鼠标拖动的DIV实现思路及代码
2013/10/21 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
2016/12/31 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
2016/09/21 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
python numpy实现rolling滚动案例
2020/06/08 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
厨房工作人员岗位职责
2013/11/15 职场文书
新郎新娘婚礼答谢词
2014/01/11 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
2014年加油站工作总结
2014/12/04 职场文书
让生命充满爱观后感
2015/06/08 职场文书
被委托人身份证明
2015/08/07 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
MySQL的安装与配置详细教程
2021/06/26 MySQL
Js类的构建与继承案例详解
2021/09/15 Javascript