pytorch在数据中采用Dataset的数据保存方式,需要继承data.Dataset类,如果需要自己处理数据的话,需要实现两个基本方法。

:.getitem:返回一条数据或者一个样本,obj[index] = obj.getitem(index). :.len:返回样本的数量 。 len(obj) = obj.len()。

Dataset 在data里,调用的时候使用

1

2

3

from torch.utilsimport data

import os

from PILimport Image

数据在调用getitem的时候才会读取图片数据,如果需要可以修改成自己的getitem函数,根据自己的数据集来设定,比如

1

2

3

4

5

6

7

8

9

10

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是一个绝对路径

在主函数里调用的时候,只需使用

1

2

3

4

dataset=Dataset('')##或者调用自定义的数据处理类

data,label=dataset[0];##相当于调用了dataset.__getitem__(0)

for img,labelin 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}。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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数据进行抽样,打乱和分批次操作,操作格式如下:

1

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是一个迭代对象,使用方法与一个迭代器相似,例如:

1

2

for batch_data, batch_labelin 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命令启动,放在后台运行。

1

2

3

4

5

6

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

原文链接:https://www.jianshu.com/p/6c8c14707d01

python数据处理常用函数_pytorch中的自定义数据处理详解相关推荐

  1. python构造自定义数据包_pytorch中的自定义数据处理详解

    pytorch在数据中采用Dataset的数据保存方式,需要继承data.Dataset类,如果需要自己处理数据的话,需要实现两个基本方法. :.getitem:返回一条数据或者一个样本,obj[in ...

  2. python协程库_python中协程的详解(附示例)

    本篇文章给大家带来的内容是关于python中协程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程,又称微线程,纤程.英文名Coroutine 协程看上去也是子程序 ...

  3. Python数据可视化——matplotlib.pyplot中plt的参数详解

    matplotlib.pyplot中plt的参数详解: #平滑折线的示例 # plt.plot(xnew, ynew, marker='.', markevery=markevery, ls='-', ...

  4. python 下划线变量_Python中的下划线详解

    这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 一. 单个下划线直接做变量名(_) 主要有三种情况: 1. 解释器中 _ ...

  5. mysql iif函数_sql中的iif语句详解_mysql

    IIf 返回由逻辑测试确定的两个数值或字符串值之一. 语法 数字 IIf(«Logical Expression», «Numeric Expression1», «Numeric Expressio ...

  6. python列转行函数_Python pandas 列转行操作详解(类似hive中explode方法)

    最近在工作上用到Python的pandas库来处理excel文件,遇到列转行的问题.找了一番资料后成功了,记录一下. 1. 如果需要爆炸的只有一列: df=pd.DataFrame({'A':[1,2 ...

  7. python数据处理常用函数_Python中常用操作字符串的函数与方法总结

    Python中常用操作字符串的函数与方法总结 这篇文章主要介绍了Python中常用操作字符串的函数与方法总结,包括字符串的格式化输出与拼接等基础知识,需要的朋友可以参考下 例如这样一个字符串 Pyth ...

  8. python中deepcopy函数_python中copy()和deepcopy()详解

    **首先直接上结论: -–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响. -–而浅复制并不会产生一个独立 ...

  9. Python面向对象编程(类编程)中self的含义详解(简单明了直击本质的解释)

    以下是博主认为的对self讲解得比较透彻又简洁明了的资料. 上面的资料把这个问题说得简单明了,大家认真看一遍相信就对self有个深入的了解了. 总结一下: 在Python为面向对象编程中,成员函数被调 ...

最新文章

  1. 【错误记录】Android Studio 中查看 Gradle 配置的方法源码 ( 配置 gradle-wrapper.properties 中版本为 gradle-x.x.x-all.zip )
  2. 微信小程序项目文件配置介绍
  3. git push 推送大文件失败的处理办法
  4. 集成android studio,Android Studio集成
  5. 转:asp.net 负载平衡-Session相关
  6. 章国锋:视觉SLAM最新观点分享
  7. [Udacity] Machine Learning tools
  8. SQL面试题(1-10)oracle写的
  9. 笔记本外接显示器设置全屏壁纸
  10. 【转】阿里去IOE运动
  11. Android启动模式分析
  12. 字节跳动岗位薪酬体系曝光,看完感叹:不服不行
  13. 如何才能将企业现有的组织关系集成到jbpm中?
  14. 【算法千题案例】每日LeetCode打卡——68.反转字符串中的元音字母
  15. 视频播放–AVPlayer
  16. SEER数据库中肿瘤发病率计算并绘制发病率趋势图
  17. jquery怎么根据id获取元素值
  18. Rowid和Rownum的区别
  19. python 变量命名规范
  20. sklearn和tensorflow

热门文章

  1. system health_可重复使用的MicroProfile Health探针
  2. java agent_如何脚踏实地构建Java Agent
  3. 应行家算法_一些行家技巧和窍门
  4. js中使用camel框架_使用Fabric8在Kubernetes中使用Camel和CDI
  5. Java 14:记录
  6. junit:junit_简而言之,JUnit:测试结构
  7. spring 构造函数注入_Spring构造函数注入和参数名称
  8. JavaFX实际应用程序:SkedPal
  9. 面向对象的代码生成方法
  10. 记录链接:与杜克一起玩