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实现方法
Nov 18 Python
简单介绍Python中的try和finally和with方法
May 05 Python
深入理解python对json的操作总结
Jan 05 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 Python
Python实现多线程的两种方式分析
Aug 29 Python
使用Python实现跳帧截取视频帧
May 31 Python
手把手教你pycharm专业版安装破解教程(linux版)
Sep 26 Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 Python
python中设置超时跳过,超时退出的方式
Dec 13 Python
Python正则表达式急速入门(小结)
Dec 16 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 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/10/09 PHP
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
mac下安装nginx和php
2013/11/04 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
JavaScript起点(严格模式深度了解)
2013/01/28 Javascript
JS Jquery 遍历,筛选页面元素 自动完成(实现代码)
2013/07/08 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
7个JS基础知识总结
2014/03/05 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
vue动态绑定组件子父组件多表单验证功能的实现代码
2018/05/14 Javascript
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
CKeditor4 字体颜色功能配置方法教程
2019/06/26 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
Python调用C++程序的方法详解
2017/01/24 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python爬虫判断招聘信息是否存在的实例代码
2020/11/20 Python
python regex库实例用法总结
2021/01/03 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
教师队伍管理制度
2014/01/14 职场文书
矿泉水广告词
2014/03/20 职场文书
公司担保书范文
2014/05/21 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
2016年公司新年寄语
2015/08/17 职场文书