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实现过滤单个Android程序日志脚本分享
Jan 16 Python
python实现教务管理系统
Mar 12 Python
python 接收处理外带的参数方法
Dec 03 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
利用python计算时间差(返回天数)
Sep 07 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
django template实现定义临时变量,自定义赋值、自增实例
Jul 12 Python
用Python简陋模拟n阶魔方
Apr 17 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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基础知识:函数基础知识
2006/12/13 PHP
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
2012/10/06 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
一段实用的php验证码函数
2016/05/19 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
2018/10/31 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
使用python存储网页上的图片实例
2018/05/22 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
公司成立感言
2014/01/11 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
四年级语文教学反思
2016/03/03 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技