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比较两个列表是否相等的方法
Jul 28 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
python实现的二叉树定义与遍历算法实例
Jun 30 Python
用tensorflow实现弹性网络回归算法
Jan 09 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 Python
python 三种方法提取pdf中的图片
Feb 07 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 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下实现折线图效果的代码
2007/04/28 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
5款适合PHP使用的HTML编辑器推荐
2015/07/03 PHP
关于PHP开发的9条建议
2015/07/27 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
Python3基础之输入和输出实例分析
2014/08/18 Python
详解Python的单元测试
2015/04/28 Python
Python的Django框架中的数据过滤功能
2015/07/17 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
超市业务员岗位职责
2013/12/05 职场文书
大学生职业生涯规划范文
2014/01/08 职场文书
商务英语求职信范文
2015/03/19 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书
nginx简单配置多个server的方法
2021/03/31 Servers
Python实现的扫码工具居然这么好用!
2021/06/07 Python
MySQL RC事务隔离的实现
2022/03/31 MySQL
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS