卷积神经网络|制作自己的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模块所提供的方法以简化步骤,当然,算数据的均值和标准差用于归一化仍然还是比较繁琐的。

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

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

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

相关文章

MySQL之视图内连接、外连接、子查询

一、视图 1.1 含义 虚拟表,和普通表一样使用 视图(view)是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放…

CSS animation动画和关键帧实现轮播图效果HTML

CSS animation动画和关键帧实现轮播图效果HTML 这轮播图效果使用h5和css3实现效果&#xff0c;不需要js控制&#xff0c;但是其中的缺点就是不能使用鼠标进行切换效果。 具有代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

Java并发集合详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在这篇博客中&#xff0c;咱们将一起深入探索Java中的并发集合。多线程编程是一个不可或缺的部分&#xff0c;它能让程序运行得更快&#xff0c;处理更多的任务。但同时&#xff0c;多线程也带来了一些挑战&…

跟cherno手搓游戏引擎【1】:配置与入口点

环境配置&#xff1a; 编译环境&#xff1a;VS2019 创建两个项目&#xff1a; 设置Sandbox为启动项&#xff1a; 设置sandbox的配置属性-常规-输出目录\中间目录为如下&#xff1a; 预处理定义&#xff1a;为了配置一些只有windows才能用的函数。 设置YOTOEngin&#xff08;我…

护眼台灯是智商税吗?眼科医生告诉你哪款护眼台灯最好

青少年近视发病率高达67%&#xff0c;如今&#xff0c;人们都被屏幕包围着&#xff0c;电脑、手机和电视已经成为最重要的信息手段&#xff0c;我们周围的屏幕也隐藏着有害的光污染。 对于4-15岁年龄段的孩子而言&#xff0c;除了学习本身带来的视力损伤外&#xff0c;每天接触…

汽车架构解析:python cantools库快速解析arxml

文章目录 前言一、安装cantools二、官方说明文档三、cantools方法1、解析message的属性2、解析pdu中的signals3、根据message查找signals4、报文组成bytes 四、总结 前言 曾经有拿cantools来解析过dbc&#xff0c;用得比较浅&#xff0c;不知道可以用来解析arxml。最近有个需求…

Linux系统安全及应用

目录 一、账号安全控制 1. 系统账号清理 1.1 将用户设置为无法登录 1.2 锁定用户 1.3 删除用户 1.4 锁定配置文件 2. 密码安全控制 2.1 设置密码规则 3. 命令历史 4. 切换用户 4.1 su和su - 4.2 限制使用su命令的用户 5. PAM安全认证 5.1 概述 5.2 pam相关…

python总结高阶-文件

文章目录 文件操作文本文件和二进制文件1 文本文件2 二进制文件 文件操作相关模块创建文件对象open()文本文件的写入基本的文件写入操作常用编码介绍write()/writelines()写入数据close()关闭文件流with语句(上下文管理器) 文本文件的读取read([size])readline()readlines() 二…

数据结构之二叉树

树的简介&#xff1a; 再来看看二叉树的简介&#xff1a; 容易想到p叉树就是每个节点最多有p个子节点的树。 接下来看两种特殊的二叉树&#xff1a; 接下来我们思考两个问题&#xff1a; 1.深度为h的满二叉树一共有多少个节点&#xff1f; 对于这一个问题&#xff0c;我们观…

BDD - Python Behave 用户自定义命令行选项 -D

BDD - Python Behave 用户自定义命令行选项 -D 引言behave -Dbehave -D 应用feature 文件behave.ini 配置文件step 文件执行 引言 日常运行测试用例&#xff0c;有时需要自定义命令行参数&#xff0c;比如不同环境的对应的配置是不一样的&#xff0c;这样就需要传一个环境参数…

2023版本QT学习记录 -11- 多线程的使用(QT的方式)

———————多线程的使用(QT方式)——————— &#x1f384;效果演示 两个线程都输出一些调试信息 &#x1f384;创建多线程的流程 &#x1f384;头文件 #include "qthread.h"&#x1f384;利用多态重写任务函数 class rlthread1 : public QThread {Q_OBJE…

C++程序设计兼谈对象模型(侯捷)笔记

C程序设计兼谈对象模型&#xff08;侯捷) 这是C面向对象程序设计的续集笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 主要内容&#xff1a;涉及到模板中的类模板、函数模板、成员模板以及模板模板参数&#xff0c;后面包含对象模型中虚函数调用&…

【计算机毕业设计】SSM企业OA管理系统

项目介绍 本项目包含管理员与普通员工两种角色&#xff0c; 管理员角色包含以下功能&#xff1a; 岗位管理,部门管理,工龄奖金管理,员工管理,考勤管理,工资查询,职称管理,统计图表,工资项管理,管理员登录等功能。 员工角色包含以下功能&#xff1a; 个人信息管理,工资详情…

基于PHP的花店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的花店管理系统 一 介绍 此花店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 …

[蓝桥 2023 ]三带一

问题描述 小蓝和小桥玩斗地主&#xff0c;小蓝只剩四张牌了&#xff0c;他想知道是否是“三带一”牌型。 所谓“三带一”牌型&#xff0c;即四张手牌中&#xff0c;有三张牌一样&#xff0c;另外一张不与其他牌相同&#xff0c;换种说法&#xff0c;四张手牌经过重新排列后&am…

使用jmeter从0开始完成性能测试

使用JMeter从0开始完成性能测试 介绍 在软件开发过程中&#xff0c;性能测试是一项关键任务&#xff0c;它可以帮助我们评估系统在不同负载条件下的性能表现&#xff0c;发现潜在的性能瓶颈。JMeter是一款功能强大且易于使用的性能测试工具&#xff0c;它可以帮助我们完成各种…

网络故障排查和流量分析利器-Tcpdump命令

Tcpdump是一个在Unix/Linux系统上广泛使用的命令行网络抓包工具。它能够捕获经过网络接口的数据包&#xff0c;并将其以可读的格式输出到终端或文件中。Tcpdump是一个强大的命令行工具&#xff0c;能够捕获和分析网络数据包&#xff0c;为网络管理员和安全专业人员提供了深入了…

手写视频裁剪框

<!-- 截取框 --><divv-show"isShow"class"crop-box":style"{width: cropWidth px,height: cropHeight px,left: cropX px,top: cropY px,}"ref"cropBox"mousedown"startInteraction"><!-- 内容在这里 --…

mysql 单表 操作 最大条数验证 以及优化

1、背景 开车的多年老司机&#xff0c;是不是经常听到过&#xff0c;“mysql 单表最好不要超过 2000w”,“单表超过 2000w 就要考虑数据迁移了”&#xff0c;“你这个表数据都马上要到 2000w 了&#xff0c;难怪查询速度慢”。 2、实验 实验一把看看… 建一张表 CREATE TABL…

Java BIO、NIO、AIO、Netty知识详解(值得珍藏)

1. 什么是IO Java中I/O是以流为基础进行数据的输入输出的&#xff0c;所有数据被串行化(所谓串行化就是数据要按顺序进行输入输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。 在Java类库中&#xff0c;IO部分的内容是很庞大的&#xff0c;因为它涉及的领…