【Pytorch】数据预处理

news2024/11/28 12:41:06

 Pytorch是机器学习里面常用的框架之一,我们在学习机器学习之前最好需要学习如何使用这个框架对我们将要使用的数据数据进行预处理操作。

如果我们想要学习好pytorch里面的方法,我们需要常去用一下dir()和help()函数,它们一个会帮我们查看某个包里面的内容,一个会帮我们返回某项功能的作用。

目录

数据导入

Dataset

Dataloader

数据预处理

Totensor

Normalize

Resize

Compose

RandomCrop

数据集下载


数据导入

下面我们来看看如何用Pytorch导入数据:

Pytorch导入数据的主要是两个类,它们分别是DatasetDataloader。而且他们都是位于torch.utils.data下面的模块。那为什么需要这两个模块呢?

为了解决这个问题,我们需要知道数据是怎么导入到我们的模型的,而它们的作用如下图所示:

Dataset的作用是将数据从数据集中提取出来,然后为每一个数据贴上标签label

Dataloader的作用是将Dataset里面的数据按某个特定的大小分为一个个数据包,再提供给后面的网络。

Dataset

我们所有自己写的要读取数据集合的类都要继承自这个torch里面提供的父类Dataset。并且需要重写方法__getitem__

下面我就按照小土堆的方法和他提供的数据集来记录读取一个数据集合的过程:

假如我有一个存满蚂蚁相片的文件夹,并且这个文件夹名字就是这些数据的标签。

我们首先要知道,我们要想获取这些数据集合,需要定位到该文件夹的位置。而要想获取一张图片,则需要定位到该图片的位置。我们决定将这些获取单张图片的路径的过程都写到__init__方法里面(它就类似于C++里面的构造函数,一调用这个类就会调研该方法)

import os
import torch
from torch.utils.data import Dataset
from PIL import Image


class Mydate(Dataset):

    def __init__(self, Root_path, Image_Label):
        self.root_path = Root_path
        # 获取图片集文件夹路径
        self.Image_Label = Image_Label
        # 获取这些图片的标签,就是它们的文件夹名
        self.image_set_name = os.listdir(self.root_path)
        # 获取所有图片的名字

    def __getitem__(self, item):
        self.image_set_single_path = self.image_set_name[item]
        # 获取单张图片的名字
        self.image_set_path = os.path.join(self.root_path, self.image_set_single_path)
        # 获取单张图片的完整路径
        img = Image.open(self.image_set_path)
        # 获取单张图片
        label = self.Image_Label
        # 获取单张图片对应的标签
        return img, label
        # 返回它们

MyDataset = Mydate('D:\\Python_Code\\Pytorch\\ants_data', 'ants_data')
img ,label = MyDataset[0]
img.show()

首先我们写的初始化函数的主要目的是获取一个列表,其中os.listdir就是读取一个文件夹里面的所有文件名,这个列表里存储到是我们的图片数据的名称/路径,这一步可能已经会再一些H5文件里面封装好了。接下来就是重写__getitem__方法,这个方法是读取数据集里面的单个的单个数据。我们创建一个变量来存储单个图片的名字,并且将单个图片的名字传递过去,而单个图片就存储在之前的图片集里,所以我们需要取到下标为item的数据,这个过程就类似于一个for循环的重复获取过程。然后利用os里面的合并路径函数获取单个图片的路径,最后再返回单个图片和单个图片对应的标签即可。

Dataloader

Dataloader的功能是当我们将从Dataset来的数据集合发送过去时,它会负责将我们的数据集进行某种处理,例如划分,打乱等。

说到Dataloader是起到处理数据的作用,那就不得不来看它的几个参数的功能。首先我们需要知道对于数据的一些概念:

  • 当我们称将对于Dataset而言的整个数据集反复训练了n遍,那么我们给对于Dataset而言的次数一个定义:epoch,那么epoch=n。
  • 而假如Dataloader将来自Dataset的数据集又划分m个小数据集,那么我们称划分出来的小数据集的个数为Batch_size,而Batch_size=m。

接下来就可以来看Dataloader里面常用的几个参数了:

Dataset:这个是我们要给它的dataset对象

batch_size:这个就是设置每个小数据集里有多少个数据

shuffle:这个是设置每个epoch是否将数据打乱,True则为打乱

drop_last:这个设置当我们epoch/batch_size有余数时这个余数的保留问题,如果为True则舍弃

num_works:这个表示使用到的进程个数,默认0(主进程)

了解完各个参数之后,我们就需要具体来确定怎么用Pytorch来实现Dataloader了。首先就是不可避免的导包操作,我们需要从torch.utils.data这个工具箱里面拿出DataLoader这个工具。下面这里的data_train是一个数据集,我们可以理解为这个数据集是调用了基于上面Dataset而封装方法而得到的的多个数据集合。然后我们就可以将这个数据集传入到DataLoader这个工具里面,设置好一些Batch_size、shuffle、num_works和drop_last等这些参数。然后它就会返回给我们一个已经被划分好一块一块小包的数据包集合。

import torchvision
from torch.utils.data import DataLoader

tools = torchvision.transforms.Compose([torchvision.transforms.Resize([255,255])]
                                        )
data_train = torchvision.datasets.MNIST('./dataset', transform=tools ,train=True, download=True)
data_loader = DataLoader(dataset=data_train, batch_size=5, shuffle=True, num_workers=0, drop_last=True)

数据预处理

在将数据导入之后,我们还需要将数据进行一定程度上的预处理,而我们常用于对数据进行预处理的工具包就是torchvision下面的transforms包。transforms包就类似于一个工具箱,我们需要经常使用到它里面的很多方法:如resize、totensor等对数据进行预处理。

然而值得注意的是,我们使用这里面的方法是不是直接将图片传递到transforms里面的方法,而是根据transforms里面的方法作为模板先创建出一个具体的工具。然后在使用这个我们创建出来的工具来对数据进行预处理。

Totensor

如我们要想将一张图片转换为Tensor数据类型,就需要下面的操作:

# 获取图片
img  = Image.open("D:\\Python_Code\\Pytorch\\ants_data\\0013035.jpg")
# 实例化工具
tool = transforms.ToTensor()
# 获取Tensor
pic_tensor = tool(img)
print(pic_tensor)

而我们在使用神经网络时如果有图片类型经常会需要将图片类型转换为Tensor的数据类型,不仅是因为Tensor数据类型可以抽象出图片的特征,还是因为它可以封装了很多神经网络有关的方法属性等。

Normalize

这个方法用于将我们得到的图片的Tensor里面的数据进行归一化处理,归一化处理的作用是将数据都限定在一个范围内(常用是[-1,1]),这样就能避免一些奇奇怪怪的数据对我们训练模型是带来的问题,并且能够在我们求梯度是加快速度。但是经过归一化处理出来的图片和我们平常的习惯的图片不同,我们要想转换回习惯人眼的图片需要进行反归一化。

下面是我们进行归一化的常用方式,以RGB格式为例:

# 获取图片
img  = Image.open("D:\\Python_Code\\Pytorch\\ants_data\\0013035.jpg")
# 实例化工具
tool_Totensor = transforms.ToTensor()
# 获取Tensor
pic_tensor = tool_Totensor(img)
# 归一化工具实例化
tool_Norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
# 传递参数,具体进行归一化
pic_ret = tool_Norm(pic_tensor)

其中我们创建用于归一化的工具tool_Norm时,是直接将均值和标准差等参数传递给Normalize方法以创建适合的模板的。其中模板里面里面的第一个列表的三个数字是三个通道对应的的平均值,而第二个列表里面的三个数字是三个通道对应的标准差。

Resize

Resize是用于对图片数据进行大小调整的工具,因为我们可能数据集里面的图片都不是统一大小即像素点数量是不同的,如果我们想将大小进行统一处理可以使用这个工具。创建工具时需要向模板传入目标的图片大小,而且是以元组的形式。而且缩放后函数还是会返回一个图片。当Risize输入两个参数时,输出图片的高和宽的像素点数量会按照设定成我们设定的值。而只输入一个参数时,这个参数代表我们最短的边像素点数量。

# 获取图片
img  = Image.open("D:\\Python_Code\\Pytorch\\ants_data\\0013035.jpg")
# 实例化工具,大小调整为960x960
tool_resize = transforms.Resize((960,960))
# 图片缩放
img_ret = tool_resize(img)
img_ret.show()

Compose

Compose的作用是将多个我们制作出来的tramsforms工具合并成一个工具的工具,也就是多个功能封装成一个功能。制作Compose工具时需要我们输入一个列表,并且该列表里面的每一个参数就要是对应着一种transforms实例化工具。

# 获取图片
img  = Image.open("D:\\Python_Code\\Pytorch\\ants_data\\0013035.jpg")
# 图片大小设置
tool_resize = transforms.Resize((512,512))
# 图片转化成Tensor
tool_tensor = transforms.ToTensor()
# 功能结合
Compose = transforms.Compose([tool_resize, tool_tensor])
ret = Compose(img)

RandomCrop

这个工具用于对我们的图片进行随机剪切,例如我们有一张960x960大小的图片,那么我们可以设置随即剪切的大小为480x480,那么使用这个方法后就会随机在我们的图片基础上剪下一片480x480大小的区域返回。例如下面就是剪切的例子:

# 获取图片
img  = Image.open("D:\\Python_Code\\Pytorch\\ants_data\\0013035.jpg")
# 图片随机剪切大小设置
tool_cut = transforms.RandomCrop([480,480])
# 图片剪切
ret = tool_cut(img)
# 图片展示
ret.show()

数据集下载

前面我们说的很多都是关于单张图片的预处理,但是我们很少涉及到整个数据集的处理。其实Pytorch官网为我们提供了很多的数据集,我们打开torchvision — Torchvision master documentation这个网址,然后拖到下面即可看到很多的数据集:

而这些数据集下载我们需要使用到torchvision这个包。而我们下载就是直接调用torchvision下面的dataset下面的数据集的名字对应的方法,然后传入的参数常用到的有几个:

1、数据存储的位置,给定一个root地址;

2、这个数据集是否为训练所使用的数据集,true则为是;

3、是否下载,true则为是;

4、transforms的方法,传入写好的transforms方法;

import torchvision

tools = torchvision.transforms.Compose([torchvision.transforms.Resize([255,255])]
                                        )
data_train = torchvision.datasets.MNIST('./dataset', transform=tools ,train=True, download=True)
img,label = data_train[0]


参考资料:

https://blog.csdn.net/m0_57541899/article/details/122367407

https://blog.csdn.net/qq_40107571/article/details/126634899

https://blog.csdn.net/MrR1ght/article/details/116804409

https://blog.csdn.net/wuzhongqiang/article/details/105499476

https://www.bilibili.com/video/BV1hE411t7RN?p=7&vd_source=894e8817bba11b560ad040c21e7cfceb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机软考考什么?怎么备考啊?

计算机软考是国家承认的计算机职业资格考试,是计算机行业从业者晋升职业等级的重要途径。计算机软考分为三个等级,分别是:初级、中级和高级。 备考计算机软考需要全面准备,下面我将从如何选择考试科目、如何制定学习计划、如何进…

【STL系列】unordered_set和unordered_map

前言 之前,我们介绍了STL中树形结构容器:set、map、multiset、multimap。 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时的效率可达到O(logN),即最差情况下需要比较红黑树的高度次,但当树中的结点非…

九龙证券|昨夜,大涨!蔚来5.99%,小鹏15.22%,理想6.39%

当地时间周一,美股三大指数低开高走,尾盘小幅收涨。盘面上,银行股、航空股遍及上涨。 展望本周,包括美联储理事沃勒、鲍曼等官员将迎来下月会议沉默期前的最终说话,投资者需关注其对经济和货币政策前景的看法。此外&am…

牛客网华为机考题库 C++

题目汇总HJ2 计算某字符出现次数HJ3 明明的随机数HJ4 字符串分隔HJ5 进制转换HJ6 质数因子HJ7 取近似值HJ8 合并表记录 哈希表HJ9 提取不重复的整数HJ10 字符个数统计HJ11 数字颠倒HJ12 字符串反转HJ13 句子逆序HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ16 购…

快速创建springboot+springcloud项目(nacos,seata,sentinel,gateway,openfeign)

一、创建一个maven项目 1.file->new->project 2.创建maven项目 3.删除src文件夹 4.在pom.xml文件中引入springboot和cloudAlibaba依赖 <dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId>&l…

用Python解决Excel问题的最佳姿势

大家好&#xff0c;我是毕加锁。 今天给大家带来的是用Python解决Excel问题的最佳姿势 文末送书&#xff01; 文末送书&#xff01; 文末送书&#xff01; 「问题说明」 这次要处理的excel有两个sheet&#xff0c;要根据其中一个sheet的数据来计算另外一个sheet的值。造成问…

循环神经网络

循环神经网络(Recurrent Neural Network&#xff0c;RNN)与卷积神经网络一样,都是深度学习中的重要部分。循环神经网络可以看作一类具有短期记忆能力的神经网络。在循环神经网络中&#xff0c;神经元不但可以接收其他神经元的信息&#xff0c;也可以接收自身的信息&#xff0c;…

ChatGPT 速通手册——开始提问

开始提问 当我们完成注册后&#xff0c;页面自动会跳转到ChatGPT的主页面&#xff0c;在这里我们就可以开始进行对话了。 我们在页面下方的输入框中填写问题&#xff0c;然后回车或者点击小飞机&#xff0c;我们的问题和ChatGPT的答案就会在页面上方以一问一答的格式展现出来…

Packet Tracer 的安装过程

Packet Tracer 的安装过程 下载地址 链接&#xff1a;https://pan.baidu.com/s/1KO-vJ1p-miU7LXRH92hLww 提取码&#xff1a;ocwu 、双击运行 Crack 文件夹中的"Patch.exe"程序&#xff0c;点击 Patch&#xff1b; 7、即可看到显示激活成功&#xff0c;接下来打开…

Matplotlib学习挑战第四关-网格线grid

Matplotlib 网格线 我们可以使用 pyplot 中的 grid() 方法来设置图表中的网格线。 grid() 方法语法格式如下&#xff1a; matplotlib.pyplot.grid(bNone, whichmajor, axisboth, )b&#xff1a;可选&#xff0c;默认为 None&#xff0c;可以设置布尔值&#xff0c;true 为显…

CentOS 软件包管理

一、文件打包与压缩 1.du命令 --查看目录或文件所占磁盘空间的大小 -h&#xff0c;以K,M,G为单位显示统计结果&#xff08;默认单位为字节&#xff09; -s&#xff0c;查看目录本身的大小 2.打包压缩 tar命令--打包&#xff0c;打包文件的扩展名为.tar…

如何在TypeScript中使用泛型

介绍 泛型是静态类型语言的基本特征&#xff0c;允许开发人员将类型作为参数传递给另一种类型、函数或其他结构。当开发人员使他们的组件成为通用组件时&#xff0c;他们使该组件能够接受和强制在使用组件时传入的类型&#xff0c;这提高了代码灵活性&#xff0c;使组件可重用…

【计算机网络——计算机网络的概念,组成,功能和分类以及相关的性能指标,分层结构和协议,TCP/IP参考模型】

文章目录计算机网络体系结构计算机网络的概念、组成、功能和分类标准化工作及相关组织速率相关的性能指标时延、时延带宽积、PTT和利用率分层结构、协议、接口和服务OSI参考模型TCP IP参考模型计算机网络体系结构 计算机网络的概念、组成、功能和分类 计算机网络的概念 计算…

EasyRecovery免费电脑硬盘数据恢复软件使用教程

EasyRecovery硬盘数据恢复软件采用最新的数据扫描引擎&#xff0c;从磁盘底层读出原始的扇区数据&#xff0c;经过高级的数据分析算法&#xff0c;把丢失的目录和文件在内存中重建出原分区和原来的目录结构&#xff0c;数据恢复的效果非常好。操作简单&#xff0c;向导式的界面…

如何使用katalon studio 完成 get/post 请求发送

前言 katalon studio作为目前最火的自动化测试工具之一&#xff0c;不仅仅只能完成webUI自动化&#xff0c;更是能完成api、app以及桌面应用程序的自动化测试。本文将讲解一下katalon studio是如果完成接口测试的。 请求发送 get请求 1、先在object repository里new一个请求…

代码随想录算法训练营第五十九天 | 503.下一个更大元素II、42. 接雨水

打卡第59天&#xff0c;继续单调栈。 今日任务 503.下一个更大元素II42.接雨水 503.下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下…

C++ 类之间的纵向关系-继承

目录 继承的基本概念 定义 使用方法 内存空间 继承下构造析构执行的顺序 构造函数 继承的基本概念 定义 被继承的类叫做基类&#xff08;父类&#xff09;&#xff0c;继承的类叫派生类&#xff08;子类&#xff09;&#xff0c;在子类类名后面加:继承方式 父类 class …

JavaScript概述一

1.JavaScript介绍 1.1 前端三要素 HTML:超文本标记语言&#xff0c;是一种使用标签&#xff08;标记&#xff09;描述网页中的视图内容的语言;CSS&#xff1a;层叠样式表&#xff0c;主要用于美化web页面外观,决定了网页中的视图效果&#xff1b;JavaScript&#xff1a;用于网…

PHP快速入门07-Cookie与Session的说明与使用

文章目录前言一、关于Cookie和Session1.1 Cookie1.2 Session二、Cookie和Session的使用2.1 Cookie的使用例子2.2 Session的使用例子总结前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 Cookie和Session是一个Web开发几乎不可避免的东西&#xff0c;是网站开发…

Java入坑之Numbers Strings

目录 一、Lambda表达式 1.1简介 1.2使用场景 1.3Lambda表达式的使用条件 1.4Lambda表达式的语法 1.5Lambda表达式的精简 二、方法引用 2.1基本概念 2.2使用条件 2.3语法格式 2.4静态方法引用 2.5特定对象的实例方法 2.6构造函数的方法引用 三、包装类 3.1概念 3…