卷积神经网络|制作自己的Dataset(最终版)

​之前文章已经实现了一个自定义的类,制定了自己的数据集。其实,细看代码,可传入的参数过多,有些简单问题复杂化,实现上不是那么简洁。

既然是自己定义的数据集,那么许多功能是自己写好的,如何写,为什么这样写都是已知的

这里,我们考虑让自己定义的Dataset类简单化,并由此完成全部数据准备工作。

图片名处理

在实现Dataset类之前,图片准备工作是必须要进行的,或者说是对我们收集到的图片进行改名。就像之前那篇文章所写的,写个小程序批量改变图片命名

就像这样:

import ospath="E:\\3-10\\dogandcats\\train\\cat\\"#猫图片路径filenames=[name for name in os.listdir(path)]for i,filename in enumerate(filenames):    src=path+filename    dst=path+path[-4:-1]+str(i+1)+'.0'+".jpg"    os.rename(src,dst)

同样,我们类似的可以处理狗图片,此时仅需修改路径名以及将

dst=path+path[-4:-1]+str(i+1)+'.0'+".jpg"

修改为:

dst=path+path[-4:-1]+str(i+1)+'.1'+".jpg"

处理其它类的图片同样如此。最终是这种形式:

                  cat1.0.jpg

                  cat2.0.jpg

                  ...

                  dog1.1.jpg

                  dog2.1.jpg

                  ...

需要强调的是这里的cat1,dog1...,jpg格式仅仅是一个习惯,没有太多的含义,真正重要的是0,1,...,这是个标签,指明了这张图片的类别。0代表cat,而1代表dog...

这里,图片准备工作已经完成!

之后,我们将处理后的所有用于训练的图片放于此路径:

E:\3-10\dogandcats\train

Dataset实现

import torchimport osfrom torch.utils.data import Datasetfrom torchvision import transformsfrom PIL import Imageimport numpy as npimport torchclass MyDataset(Dataset):    def __init__(self, path_file,transform=None):        self.path_file=path_file        self.imgs=[name for name in os.listdir(path_file)]        self.transform=transform    def __len__(self):        return len(self.imgs)    def __getitem__(self, idx):        #get the image        img_path = os.path.join(self.path_file,self.imgs[idx])        image=Image.open(img_path)        image=image.resize((28,28))#修改图片大小,默认大小        #image = np.array(image)        #image=torch.tensor(image,dtype=torch.float32)#将numpy数组转化为数据类型为float32的张量        #image=image.permute(2,0,1)#将HxWxC变为CxHxW        #以上三行所起的功能可以用transforms.ToTensor()代替(差别仅仅在于后者将像素全部归为[0,1]。         if self.transform:            image = self.transform(image)        #get the label        str1=self.imgs[idx].split('.')        label=torch.tensor(eval(str1[1]))        return image, labelpath="E:\\3-10\\dogandcats\\train"training_data=MyDataset(path,transform=transforms.Compose([transforms.ToTensor()]))train_dataloader = torch.utils.data.DataLoader(training_data, batch_size=4, shuffle=True)

让我们run一下:

>>> BatchImg,Label=next(iter(train_dataloader))>>> BatchImg.size()torch.Size([4, 3, 28, 28])>>> Label.size()torch.Size([4])

均值和标准差,归一化

然后我们尝试获取所有图片的三个通道的均值和标准差,最后让图片数据变为均值为0,标准差为1的新数据。

>>> IMGEND=torch.stack([ig for ig,_ in training_data],dim=0)#堆叠tensor>>> IMGEND.size()torch.Size([17, 3, 28, 28])

此时,可以看到我们已经获得了所有图片(共17张)的数据

>>> mean=torch.mean(IMGEND,dim=(0,2,3))#获得均值>>> meantensor([0.6479, 0.6043, 0.5521])>>> std=torch.std(IMGEND,dim=(0,2,3))#获得标准差>>> stdtensor([0.2343, 0.2485, 0.2925])

好吧,这里,借助:transforms.Normalize()方法,我们可以很容易对所有图片数据进行变换,最终获得均值为0,标准差为1的数据。

就像这样:

training_data1=MyDataset(path,transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.6479, 0.6043, 0.5521],[0.2343, 0.2485, 0.2925])]))

接着我们就可以将training_data1传入Dataloader:

train_dataloader1 = torch.utils.data.DataLoader(training_data1, batch_size=4, shuffle=True)

此时,对于图片数据我们完成了归一化操作,将数据分布变为了均值为0,标准差为1的分布,training_data1就是之后在神经网络用于训练的数据集

检验training_data1数据,就像之前那个计算均值和标准差的过程:

>>> IMGEND1=torch.stack([ig for ig,_ in training_data1],dim=0)>>> IMGEND1.size()torch.Size([17, 3, 28, 28])>>> mean1=torch.mean(IMGEND1,dim=(0,2,3))>>> mean1tensor([ 1.1959e-04, -3.3379e-05, -1.4900e-04])>>> std=torch.std(IMGEND1,dim=(0,2,3))>>> stdtensor([1.0001, 0.9998, 1.0001])

总结

总的来看,我们实现Dataset类时,完成了对数据的归一化,以及将Dataset数据传入了Dataloader。

一些操作可以使用transforms模块所提供的方法以简化步骤,当然,算数据的均值和标准差用于归一化仍然还是比较繁琐的。

到这里,数据的预处理工作基本结束!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式——最全梳理,最好理解

新年献礼! 设计模式呕心梳理 创建型模式 单例模式(Singleton Pattern)https://blog.csdn.net/qq_34869143/article/details/134874044 整理中... 结构型模式 代理模式(Proxy Pattern)https://blog.csdn.net/qq_34…

在Fiber中处理请求和响应

掌握GoLang Fiber中请求和响应管理的艺术,以实现高效的Web开发 在Web开发领域,有效地处理请求和响应是构建既用户友好又高效的Web应用的基石。该过程涉及管理传入的HTTP请求、解析数据和参数、构建适当的响应、处理不同的响应类型以及优雅地处理错误。对…

【unity】Obi插件架构组成(参数详细解释)——解算器四面板设置、三种更新器、参与者介绍

文章目录 一、架构(Architecture)1.1 Obi解算器(ObiSolver)1.2 ObiUpdater1.3 ObiActorBlueprint1.4 Obi参与者(ObiActor,如ObiRope等) 二、Obi解算器(ObiSolver)2.1 解算…

解决:Microsoft Visual C++ 14.0 is required.

Microsoft Visual C 14.0 is required. Get it with “Microsoft Visual C Build Tools 当我们安装绝大部分python包的时候可以通过pip install 或者 conda install解决,但是任然有些包是安装不了的,比如我的就是在安装pyqt5的时候报Building wheel for…

51单片机之按键和数码管

51单片机之按键和数码管 ✍前言:♐独立按键😀独立按键的原理😀软件实现按键控制LED灯的亮灭 ♐数码管😊数码管显示数字或者字母的原理🐉共阳极数码管🐉共阴极极数码管🐉4位1体数码管 &#x1f6…

二叉搜索树与双向链表

解题思路一: /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;} } */ // 一定要用自己的理解真正弄出来才行,否则没有用! // 再次提醒,计算机这种工科…

【计算机算法设计与分析】n皇后问题(C++_回溯法)

文章目录 题目描述测试样例算法原理算法实现参考资料 题目描述 在nxn格的棋盘上放置彼此不受攻击的n格皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在nxn格的棋盘上放置n个皇后,任何2个皇后不放在同…

三款推荐的 FTP 工具

🥇 版权: 本文由【墨理学AI】原创、在CSDN首发、各位大佬、敬请查阅🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 三款推荐的 FTP 工具filezillawinscpFinalShell SSHXftp❤️ 人生苦短, 欢迎…

linux 系统 kill 指令笔记

kill 名称 kill - send a signal to a process 向指定的线程或进程发送信号 描述 The default signal for kill is TERM. Use -l or -L to list availablesignals. Particularly useful signals include HUP, INT, KILL, STOP,CONT, and 0. Alternate signals …

啊哈c语言——逻辑挑战8:验证哥德巴赫猜想

上面这封书信是普鲁士数学家哥德巴赫在1742年6月7日写给瑞士数学家欧拉的,哥德巴赫在书信中提出了“任一大于2的整数都可以写成3个质数之和”的猜想。当时,哥德巴赫遵照的是“1也是素数”的约定。现今,数学界已经不使用这个约定了。哥德巴赫原…

新品牌在小红书上宣传推广怎么做?

对于新品牌来说,如何在小红书进行有效的宣传推广,成为了一大挑战。本文伯乐网络传媒将为你揭秘新品牌在小红书上的宣传策略,助你牢牢抓住用户流量,提升品牌知名度。 小红书作为一款以内容为核心的社交电商平台,具有极高…

Flume基础知识(二):Flume安装部署

1. Flume 安装部署 1.1 安装地址 (1)Flume 官网地址:Welcome to Apache Flume — Apache Flume (2)文档查看地址:Flume 1.11.0 User Guide — Apache Flume (3)下载地址&#xf…

数据分析-25-电商用户行为可视化分析

文章目录 0. 数据代码获取1. 项目介绍1.1 分析背景1.2 分析目的1.3 分析思路 2. 数据清洗2.1 加载必要的库2.2 读取数据2.3 统计缺失值2.4 处理数据a. 删除重复值b. 转换时间格式c. 提取日期和时间d. 转换数据类型 3. 分析内容3.1 用户活跃规律a. 日均pv与uvb. 日新增pv、uv趋势…

接口自动化-allure测试报告

学习目标: 1、测试报告的作用 2、allure的安装 3、allure的基本使用 4、allure的高级使用 学习内容: 1、测试报告的作用 自动化接口的结果呈现虽然可以通过日志文件去查看用例的成功或者失败,但是这样的结果就是不美观,不能…

删除注释(C语言)

从键盘上读入一行字符(约定:字符数≤127字节),判断其中的注释是否合法,不合法则报错,合法时则删除注释后再输出。合法注释是指“/*”标记注释开始、“*/”标记注释结束,通常表现为/* ……*/。   注意事项&#xff1a…

四种“栈溢出检测方法”实现分析(2种纯软件、一种纯硬件、一种软硬件结合)

1、两种纯软件的栈溢出检测方法 参考博客:《freeRTOS的栈溢出检测机制》; 2、纯硬件:使用栈限制寄存器 2.1、工作逻辑分析 前提条件:使用满减栈硬件上提供栈限制寄存器(用SP_limit表示),可以…

vue封装基础input组件(添加防抖功能)

先看一下效果&#xff1a; // 调用页面 <template><div><!-- v-model&#xff1a;伪双向绑定 --><my-input v-model"inputVal" label"姓名" type"textarea" /></div> </template><script> import…

Halcon根据特征值选择区域select_shape

Halcon根据特征值选择区域 关于提取图像的特征&#xff0c;比较常用的一个算子是select_shape算子&#xff0c;它能高效地根据特征提取出符合条件的区域。该算子的原型如下&#xff1a; select_shape (Regions : SelectedRegions : Features, Operation, Min, Max :)参数1和参…

Python 面向对象之继承和组合

Python 面向对象之继承和组合 【一】继承 【1】概念 继承是面向对象的三大特征之一继承允许一个类继承另一个类的属性和方法继承可以使代码重用&#xff0c;解决类与类之间代码重复的问题 【2】代码解释 不使用继承&#xff0c;创建豌豆射手类和豌豆的双发射手类 # 豌豆射…

【Golang】Json 无法表示 float64 类型的 NaN 以及 Inf 导致的 panic

【Golang】Json 无法表示 float64 类型的 NaN 以及 Inf 导致的 panic 原因 golang 服务出现了 panic&#xff0c;根据 panic 打印出的堆栈找到了问题代码&#xff0c;看上去原因是&#xff1a;json 序列化时&#xff0c;遇到了无法序列化的内容 [panic]: json: unsupported …