数据集的读取和处理

一、定义数据集中图像预处理操作: 

import torch
import torchvision
import torchvision.transforms as transforms
transform = transforms.Compose([transforms.RandomCrop(32, padding=4, padding_mode='reflect'),transforms.RandomHorizontalFlip(),transforms.ToTensor()])

调用torchvision库解决,其中transforms指明对数据集中图片的预处理操作,常见的可选的预处理操作如下:

1.transforms.CenterCrop(size)
(1)将给定的PIL.Image对象进行中心切割,得到给定的size;
(2)其中size可以是tuple类型,即size = (target_height, target_width);
(3)size也可以是int类型,此时切出来的图片的形状是正方形;
2.transforms.RandomCrop(size,padding=None,pad_if_needed=False,fill=0, padding_mode='constant'):
(1)从图片中随机裁剪出尺寸为size的图片
(2)size:所需裁剪图片尺寸
(3)padding:设置填充大小,有如下的三种格式:当为a时上下左右均填充a个像素;当为(a,b)时上下填充b个像素,左右填充a个像素;当为(a,b,c,d)时左、上、右、下分别填充a,b,c,d个像素
(4)pad_if_need:若图像小于设定size则按照填充模式padding_mode进行填充填充模式有4种:constant:像素值由fill设定edge:像素值由图像边缘像素决定reflect:镜像填充,最后一个像素不镜像symmetric:镜像填充,最后一个像素镜像
(5)fill:填充模式为constant时设置填充的像素值
3.transforms.RandomHorizontalFlip():
随机水平翻转给定的PIL.Image对象;
翻转的概率为0.5,即一半的概率翻转,一半的概率不翻转;
4.transforms.RandomResizedCrop(size,scale,ratio,interpolation)
(1)按照随机大小和长宽比裁剪图片
(2)首先根据scale的比例缩放原图,然后根据ratio的长宽比裁剪,最后使用插值法把图片变换为size大小
(3)size:所需裁剪图片尺寸
(4)scale:随机缩放面积比例, 默认(0.08,1)
(5)ratio:随机长宽比,默认(3/4,4/3)
(6)interpolation:插值方法PIL.Image.NEARESTPIL.Image.BILINEARPIL.Image.BICUBIC
5.transforms.FiveCrop(size)
(1)在原始图片的左上右上左下右下中间裁剪size大小的图片
(2)size:所需裁剪图片尺寸
6.transforms.TenCrop(size,vertical_flip=False)
(1)在图像的上下左右以及中心裁剪出尺寸为size的5张图片,并对这5张图片进行水平或者垂直镜像获得10张图片
(2)size:所需裁剪图片尺寸
(3)vertical_flip:是否垂直翻转
7.transforms.RandomHorizontalFlip(p=0.5)
(1)依概率水平(左右)翻转图片
(2)p:翻转概率
8.transforms.RandomVerticalFlip(p=0.5)
(1)依概率垂直(上下)翻转图片
(2)p:翻转概率
9.transforms.RandomRotation(degrees,resample,expand,center)
(1)随机旋转图片
(2)degrees:旋转角度当为a时在(-a,a)之间选择旋转角度当为(a,b)时在(a,b)之间选择旋转角度
(3)resample:重采样方法
(4)expand:是否扩大图片以保持原图信息
(5)center:旋转点设置,默认中心旋转
10.transforms.Pad(padding,fill=0,padding_mode='constant')
(1)对图像边缘进行填充
(2)padding:设置填充大小当为a时上下左右均填充a个像素;当为(a,b)时上下填充b个像素,左右填充a个像素;当为(a,b,c,d)时左、上、右、下分别填充a,b,c,d个像素
(3)padding_mode:填充模式填充模式有4种:constant:像素值由fill设定edge:像素值由图像边缘像素决定reflect:镜像填充,最后一个像素不镜像symmetric:镜像填充,最后一个像素镜像
(4)fill:padding_mode为constant时设置填充的像素值
11.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)
(1)调整亮度,对比度,饱和度和色相
(2)brightness:亮度调整因子当为a时从[max(0,1-a),1+a]中随机选择;当为(a,b)时从[a,b]中随机选择;
(3)contrast:对比度参数,同brightness
(4)saturation:饱和度参数,同brightness
(5)hue:色相参数当为a时从[-a,a]中选择参数(0<=a<=0.5);当为(a,b)时从[a,b]中随机选择(-0.5<=a<=b<=0.5)
12.transforms.RandomGrayscale(num_output_channels,p)
(1)依据概率将图片转化为灰度图
(2)num_output_channels:输出通道数,只能设置为1或3;
(3)p:概率;
13.transforms.RandomAffine(degress,translate=None,scale=None,shear=None,resample=False, fillcolor)
(1)对图像进行仿射变换,仿射变换是二维的线性变换,有五种基本原子变换构成,分别是旋转、平移、缩放、错切和翻转
(2)degrees:旋转角度设置
(3)translate:平移区间设置,如(a,b),a设置宽,b设置高;
(4)scale:缩放比例(以面积为单位)
(5)fill_color:填充颜色设置
(6)shear:错切角度设置,有水平错切和垂直错切若为a则仅在x轴错切,错切角度在(-a,a)之间;若为(a,b),则设置a为x轴角度,b设置y轴角度;若为(a,b,c,d),则a和b设置x轴角度,c和d设置y轴角度
(7)resample:重采样方法
14.transforms.RandomErasing(p,scale,ratio,value,inplace)
(1)对图像进行随机遮挡
(2)p:概率
(3)scale:遮挡区域的面积
(4)ratio:遮挡区域的长宽比
(5)value:设置遮挡区域的像素值
注意:这个方法是对张量进行操作的,所以在这个方法前面需要transforms.ToTensor()
15.transforms.Resize(size)
(1)这里的size可以是一个整数,表示将图像的较短边缩放到指定长度,同时保持长宽比
(2)size也可以是一个列表,格式为[width, height],表示将图像的宽度和高度调整为指定的尺寸
(3)在调整大小时图像的长宽比可能会发生改变,因此图像可能会被拉伸或压缩来适应指定的大小
16.transforms.Normalize(mean,std)
(1)其中mean和std均为一个长度为3的一维列表,分别对应图像的三个通道;
(2)该方法简单来说就是将数据按通道进行计算;
(3)每一个通道内的每一个数据减去均值mean再除以方差std,得到归一化后的结果;
17.transforms.ToTensor()
(1)将PIL.Image对象或numpy.ndarray对象转为tensor对象
(2)如果PIL.Image对象属于(L,LA,P,I,F,RGB,YCbCr,RGBA,CMYK,1)中的一种图像类型,或者numpy.ndarray对象格式数据类型是np.uint8
则将[0, 255]的数据转为[0.0, 1.0],也就是说将所有数据除以255进行归一化
(3)将HWC的图像格式转为CHW的tensor格式,经过ToTensor()处理的图像可以直接输入到CNN网络中,不需要再进行reshape
18.transforms.RandomChoice([transforms1, transforms2, transforms3])
(1)从一系列transforms方法中随机挑选一个
19.transforms.RandomApply([transforms1, transforms2, transforms3], p=0.5)
(1)依据概率执行一组transforms操作
20.transforms.RandomOrder([transforms1, transforms2, transforms3])
(1)对一组transforms操作打乱顺序

二、下载并加载对应的数据集:

# 下载并加载CIFAR-10训练集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=32,shuffle=True, num_workers=0)
# 下载并加载CIFAR-10测试集
testset = torchvision.datasets.CIFAR10(root='./data', train=False,download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=32,shuffle=False, num_workers=0)

主要的函数:

1.下载数据集:

1.CIFAR-10/CIFAR-100数据集:
torchvision.datasets.CIFAR10(root,train,transform,target_transform,download)
(1)root(String):数据集的根目录,其中目录cifar-10-batches-py存在或将保存到(如果下载设置为True);
(2)train(bool,可选):如果为True,则下载训练集,否则下载测试集;
(3)transform(可调用,可选):接受PIL图像并返回转换版本的函数/转换;是上一个步骤得到的transform对象
(4)target_transform(可调用,可选):接收目标并对其进行转换的函数/transform;
(5)download(bool,可选):如果为true则从Internet下载数据集并将其放在根目录中;如果数据集已下载则不会再次下载;
2.ImageNet数据集:
torchvision.datasets.ImageNet(root,split,**kwargs)
(1)root(String):ImageNet数据集的根目录;
(2)split(String,可选):数据集分割,可选值为'train'或'val';
(3)transform(可调用,可选):接受PIL图像并返回转换版本的函数/转换;是上一个步骤得到的transform对象;
(4)target_transform(可调用,可选):接收目标并对其进行转换的函数/transform;
(5)loader:加载给定路径的图像的函数;

2.加载数据集得到DataLoader对象: 

torch.utils.data.DataLoader(dataset,batch_size,shuffle,sampler,batch_sampler,num_workers,collate_fn,pin_memory,drop_last,timeout,worker_init_fn)
(1)dataset(Dataset):加载的数据集;
(2)batch_size(int,optional);每一次处理加载多少数据,即一个batch的大小
(3)shuffle(bool,optional):True表示每次个epoch遍历数据集都要重新打乱数据,默认为False;
(4)sampler(Sampler or Iterable,optional):定义采样的策略,如果定义了此参数那么shuffle参数必须为False;
(5)batch_sampler(Sampler or Iterable,optional):同sampler一样,但每次返回数据的索引;
(6)num_workers(int,optional):指定用于数据加载的子进程数,可以加快数据加载速度;默认为0表示用主进程加载;
(7)collate_fn(Callable,optional):批处理函数,用于将多个样本合并成一个批次,例如将多个张量拼接在一起构建mini-batch;
(8)pin_memory(bool,optional):True表示在返回张量之前将张量复制到CUDA固定的内存中,加快GPU传输速度;
(9)drop_last(bool, optional):True表示可删除最后一个不完整的批次,默认为False,如果数据集的大小不能被批次大小整除则最后一个批次小于batch_size;
(10)timeout(numeric,optional):非负数,表示worker收集批次数据的超时时间,默认为0
(11)worker_init_fn (Callable, optional):如果非None则在种子设定之后和数据加载之前将以worker id([0,num_workers-1]中的int)作为输入对每个worker子进程调用此函数
(12)multiprocessing_context(str or multiprocessing.context.BaseContext, optional):如果为None则将使用操作系统的默认多处理上下文;
(13)generator(torch.Generator,optional):如果非None则RandomSampler将使用此RNG来生成随机索引,并进行多进程处理以为workers生成base_seed;
(14)prefetch_factor(int, optional, keyword-only arg):每个worker预先装载的批次数,2表示在所有工作线程中总共预取2*num_workers批次;
(15)persistent_workers(bool, optional):True表示不会在数据集使用一次后关闭工作进程;这允许保持 worker实例处于活动状态(默认值:False)
(16)pin_memory_device(str, optional):如果pin_memory为True该参数表示pin_memory所指向的设备

说明:

a.sampler和batch_sampler都为None:batch_sampler使用Pytorch实现的批采样,而sampler分为两种情况:

shuffle=True:sampler使用随机采样;

shuffle=False:sampler使用顺序采样

b.自定义了batch_sampler,那么batch_size,shuffle,sampler,drop_last必须都是默认值;

c.自定义了sampler,此时batch_sampler不能再指定,且shuffle必须为False;

3.获取sampler对象:

1.torch.utils.data.SequentialSampler(data_source):
(1)顺序采样,用于获取数据索引,按照顺序返回数据集索引;
(2)data_source:可迭代对象,可以为数据集或列表;
2.torch.utils.data.RandomSampler(data_source,num_samples,replacement):
(1)用于获取打乱的数据索引,乱序返回数据集索引;
(2)data_source:可迭代对象,可以为数据集或列表;
(3)num_samples:指定采样的数量,默认是全部;
(4)replacement:若为True则表示可以重复采样,即同一个样本可以重复采样;
3.torch.utils.data.BatchSampler(sampler,batch_size,drop_last):
(1)批采样,将sampler采样得到的单个的索引值进行合并,当数量等于一个batch大小后就将这一批的索引值返回;
(2)sampler:上述两种采样器,即SequentialSampler或RandomSampler;
(3)batch_size:batch的大小;
(4)drop_last:可以为True或False,drop_last为True时如果采样得到的数据个数小于batch_size则抛弃本个batch的数据;
4.torch.utils.data.SubsetRandomSampler(indices):
(1)子集随机采样,与上面返回数据的索引不同,这里返回的是对应索引的数据本身
(2)indices:数据集索引
5.torch.utils.data.WeightedRandomSampler(weights,num_samples,replacement):
(1)加权随机采样,这里返回的是对应索引的数据本身;
(2)weights:采样到该索引的权重;
(3)num_samples:指定采样的数量;
(4)replacement:若为True则表示可以重复采样,即同一个样本可以重复采样;

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

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

相关文章

c++ 菱形继承

一、菱形继承定义&#xff1a;假设有四个类&#xff1a;A、B、C 和 D&#xff0c;其中 B 和 C 都继承自 A&#xff0c;而 D 又继承自 B 和 C。这样的继承关系形成一个菱形结构&#xff1a; A/ \B C\ /D菱形继承的问题&#xff1a;菱形继承主要有数据冗余和二义性的问题&#…

【算法】前缀和

Hello&#xff01;大家好&#xff0c;我是学霸小羊&#xff0c;今天讲一下前缀和算法。 这要从一个故事说起。 一天&#xff0c;老师叫小明做一道题&#xff1a;一个长度为n的数组a&#xff0c;请你计算a[x]a[x1]a[x2] a[y-1]a[y]。 输入数据 第1行 1个整数n 0≤n≤1,000…

《STM32Cube高效开发教程基础篇》- 安装软件/Demo3_1LED

文章目录 下载两个软件安装问题记录在STM32CubeMX中新建项目编辑代码在CudeMX中完成图形化设置在CudeIdea中编码在CLion中编码&#xff08;智能化&#xff09; 效果图 下载两个软件 百度网盘链接&#xff1a;https://pan.baidu.com/s/1uXLWIIVCJbF4ZdvZ7k11Pw 提取码&#xff1…

Go 错误日志处理

是不是所有的 if err ! nil 的地方都应该输出错误日志&#xff1f; 打印过多的错误日志会导致日志文件变得冗长和难以阅读。 其次&#xff0c;重复的错误信息会增加冗余。 此外&#xff0c;每一层都打印错误日志&#xff0c;一旦错误信息设计不当&#xff0c;可能会导致上下…

消费者相关高效读写ZK作用

消费者分区分配策略 目录概述需求&#xff1a; 设计思路1.消费者分区分配策略2. 消费者offset的存储3. kafka消费者组案例4. kafka高效读写&Zk作用5. Ranger分区再分析 实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show …

MySQL建库

删除数据库 新建数据库 右键-新建数据库 字符集选中utf8(支持中文) 修改字符集 右键--数据库的属性 将字符集支持的数量变少可以修改

vue3 部署后修改配置文件

前端项目部署之后&#xff0c;运维可以自行修改配置文件里的接口IP&#xff0c;达到无需再次打包就可以使用的效果 vue2如何修改请看vue 部署后修改配置文件&#xff08;接口IP&#xff09;_vue部署后修改配置文件-CSDN博客 使用前提&#xff1a; vite搭建的vue3项目 使用setu…

大数据技术分享 | Kylin入门系列:基础介绍篇

Kylin入门教程 在大数据时代&#xff0c;如何高效地处理和分析海量数据成为了企业面临的挑战之一。Apache Kylin作为一个开源的分布式分析引擎&#xff0c;提供了Hadoop之上的SQL查询接口及多维分析&#xff08;OLAP&#xff09;能力&#xff0c;使得对超大规模数据集的分析变…

【leetcode——栈的题目】——1003. 检查替换后的词是否有效python

题目&#xff1a; 给你一个字符串 s &#xff0c;请你判断它是否 有效 。 字符串 s 有效 需要满足&#xff1a;假设开始有一个空字符串 t "" &#xff0c;你可以执行 任意次 下述操作将 t 转换为 s &#xff1a; 将字符串 "abc" 插入到 t 中的任意位置…

前缀和(下)

目录 热身&#xff1a; 寻找数组的中心下标 题解&#xff1a; 代码&#xff1a; 进阶&#xff1a; 除自身之外数组的乘积 题解&#xff1a; 代码&#xff1a; 和为K的子数组 题解&#xff1a; 代码&#xff1a; 和可被 K 整除的子数组 题解&#xff1a; 同余定理…

Python多进程加快for循环速度

Python多进程加快for循环速度 你可以使用Python的multiprocessing模块来将for循环改为多进程实现。下面是一个简单的示例代码&#xff0c;演示了如何使用multiprocessing.Pool来并行执行一个for循环&#xff1a; import multiprocessing# 定义一个函数&#xff0c;该函数会在…

C语言 指针——指针变量做函数参数

目录 指针变量的解引用 为什么要用指针变量做函数参数&#xff1f; 演示Call by value 指针变量的解引用 为什么要用指针变量做函数参数&#xff1f; 演示Call by value

本特利330130-040-01-00 PLC模块深度解析 询价联系ID

本特利330130-040-01-00 PLC模块深度解析 在工业自动化领域&#xff0c;准确、高效的数据采集和监控是确保生产安全、提高生产效率的关键。本特利&#xff08;Bently Nevada&#xff09;作为全球知名的工业自动化和监控设备制造商&#xff0c;其生产的330130-040-01-00 PLC模块…

半藏酒业新零售分红制度拆解,起盘运营服务商

半藏酱酒招商模式&#xff0c;白酒合伙人模式&#xff0c;顶层模式设计 社群玩法用这几年的互联网词汇描述叫私域营销。虽然不走传统商超&#xff0c;酒桌之外很少能看到&#xff0c;但随着核心消费者裂变和流量汇聚&#xff0c;现在能见度越来越高&#xff0c;并溢出到达公域。…

Jtti:怎么在香港服务器上实现多点备份?

在香港服务器上实现多点备份可以采用多种方法和工具&#xff0c;主要目标是将数据备份到不同的存储位置&#xff0c;以增加数据的安全性和可靠性。以下是实现多点备份的一些常用方法&#xff1a; 1. 使用云存储服务 利用云存储服务将数据备份到不同的云存储提供商&#xff0c;以…

2024黑龙江CCPC

2024黑龙江省赛 B. String 思路:栈模拟代码&#xff1a; /* * Author: Hfuubigstrength * email: 2854614012qq.com * Date: 2024-05-28 23:32:45 */ #include <bits/stdc.h> //#define int long long #define PII pair<int,int> #define LL long long #defi…

深度学习:手撕 RNN(2)-RNN 的常见模型架构

本文首次发表于知乎&#xff0c;欢迎关注作者。 上一篇文章我们介绍了一个基本的 RNN 模块。有了 这个 RNN 模块后&#xff0c;就像搭积木一样&#xff0c;以 RNN 为基本单元&#xff0c;根据不同的任务或者需求&#xff0c;可以构建不同的模型架构。本节介绍的所有结构&#…

JS移动端设置mouseover,mouseleave有效么

在移动设备的浏览器环境中&#xff0c;mouseover 和 mouseleave 事件的行为与桌面浏览器有所不同&#xff0c;主要是因为移动设备的交互方式主要是基于触摸的&#xff0c;而不是基于鼠标的。 在移动设备上&#xff0c;当用户触摸屏幕时&#xff0c;通常会触发 touchstart 事件…

mysql查询的时间复杂度

SELECT * FROM customers WHERE age > 25; 首先是普通的select&#xff0c;如果没有建立任何的索引的话&#xff0c;假设数据量为N&#xff0c;那么时间复杂度为O(N) 如果对age添加了索引&#xff0c;那么复杂度为O(log n) 假设使用了in操作&#xff0c;总共查找M种&…

Codeforces Round 947 (Div. 1 + Div. 2) D. Paint the Tree 题解 DFS

Paint the Tree 题目描述 378QAQ has a tree with n n n vertices. Initially, all vertices are white. There are two chess pieces called P A P_A PA​ and P B P_B PB​ on the tree. P A P_A PA​ and P B P_B PB​ are initially located on vertices a a a an…