在pytorch中自定义dataset读取数据

这篇是我对哔哩哔哩up主 @霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享

有关我们数据读取预训练

以及如何将它打包成一个一个batch输入我们的网络的

首先我们来看一下之前我们在讲resnet网络时所使用的源码

我们去使用了官方实现的image folder去读取我们的图像数据

然后再使用官方提供的data loader去对我们读取的数据进行一个打包

大家有没有想过这个image folder它的内部到底实现了哪些功能呢

那么我们今天为什么要讲这个dataset呢

因为在之前我们讲分类网络时

有很多小伙伴私信问我

如果我的图片不是rgb图像

是灰度图像或者是雷达图像

深度图像等等

就是非rgb的图像时

我该如何去载入并预处理我的图像

那么如果你直接通过官方提供的这个方法呢

其实它是有一定的局限性的

而且比如如果你想去设计一个比较独特的网络

比如说你设计的网络

它有多个输入

那么这种情况呢官方所提供的这些方法都是无法满足你的需求的

所以本节课我们来讲一下如何去实现我们自己的一个data set

以及进一步去讲解我们的data loader是如何利用我们data set所生成的数据

打包成一批一批的数据输入网络的

那么本节课所讲的一个代码呢

我已经提前上传到我的github上了

在pytourh classification模块下的custom dataset这个文件夹当中

然后这三个文件呢就是我们今天主要要讲的内容了

那么这个内容呢也是我们在后面讲利用多gpu训练时

所使用到的一个数据读取

以及预处理的部分

那么我们接下来就进入到我们的代码当中

首先呢我们看一下我们的main这个脚本

首先呢我们这里所使用的数据集

还是我之前所说的划分类数据集

之前也有小伙伴在问我数据在哪下载呀

我该如何去划分训练集以及验证集

那么今天呢我在这里就详细地将整个流程仔细的讲一遍

并且呢我这里写了一个新的关于划分数据集的一个脚本

相比原来那个脚本呢使用起来会更加的方便

不需要再将训练集以及验证集单独划分到不同的文件夹当中了

首先呢如果你想使用之前我们所说的花分类数据集

那么大家可以自己去在这个链接当中去下载

下载完之后呢

你会得到一个点tgz的一个压缩文件

然后解压之后呢

我们可以看到都有个flower photos

在这个文件夹下呢主要有这五个子文件夹

每个文件夹呢它对应的一种花的类型

比如说我们看这个daisy

这个daisy呢它对应的就是雏菊

也就是说在这个文件夹下面的所有图片都是关于雏菊这个类别

那么我们下载完之后呢

我们这里的root这个变量就指向我们的flower photos

那么我这里就已经设置好了

就保存在我所给定的这个路径下

然后呢我们就进入到我们这个main函数

接下来呢我们就使用我们的read split data

这个方法来划分我们的训练集一验证集

那么这个方法呢我们只需要传入一个root这个参数就可以了

然后我们来仔细的看一下这个方法

进入这个方法之后呢

我们可以看到有两个参数

第一个是root

就是我们刚刚所说指向我们解压后的文件夹的路径

然后这个rate它是我们划分验证集所占所有样本的一个比例

我们这里将我们引入的random这个随机的这个包

设置一个随机种子设置为零

这里为什么要设计随机种子呢

就在于能够保证随机结果是可以复现的

也就是说只要我们将这个random的种子设置为零之后

无论是在你的电脑上

我的电脑上还是其他人电脑上

我们待会儿通过随机函数所随机划分的数据都是一模一样的

也就是都是可复现的

这样呢就能够保证大家划分的数据集都是一模一样的

然后接下来呢我们来判断一下我们所传入的这个路径

它是否存在

如果不存在

我们就会报出一个错误

接下来我们再通过os库的例子

第二来便利我们所给的那个路径下的所有的文件

那么它它变的文件呢可能就包含有文件夹以及我们普通的文件

然后这里呢我们就通过一个for循环来遍历它所编辑得到的

每一个文件夹或文件

接下来我们再判断

如果我们的这个路径它所对应的是个文件夹的话

那么我们就将它进行保存

如果不是文件夹的话

那我们就将它丢弃

那么这样我们得到的flower class就应该有五个值

初始化几个空列表

那么这里呢我再多说一句

我们这里为什么要使用PIL的image这个库

而不去使用open cv

因为在touch它所提供的这一系列预处理方法

其实它主要还是针对pl库所读入的images

比如我们随机看一个预处理方法

那么在他预处理方法的计划当中呢

他写的就是针对一个PIL的image进行一个处理的

然后这里我再多说一句

就是有时候我们在调试过程当中可能会遇到这种情况

就是我想看一下变量的一个信息

但是我设置断点之后

我们在debug这个信息当中呢

看到每个变量一直在显示正在载入数据

然后一直看不到

那么这个问题要怎么解决呢

那么这里呢大家可以点击这个file

然后在设置当中

然后在我们的build execution deployment

然后在这个地方呢大家可以勾选一下这个

然后再点ok

这样的话你在调试过程当中

每一个变量它的参数值就会很快的载入进来了

那么通过stack方法之后呢

它会增加一个新的维度

那么这个新维度是在dimension等于零的位置上

那么拼接之后我们可以来看一下我们所得到的shape

那接下来我们再将我们的labels也转化成tensor形式

因为刚在我们item的方法当中呢

我们通过transform方法将我们的image已经转换成tensor格式了

但我们label它并不是tender格式

所以这里我们要通过touch as tensor这个方法

我们label也转换成tensor

然后我们所得到的labels呢

它就是一个tensor变量了

然后我们再通过return

就可以将我们打包好的图片以及标签信息进行一个返回

那么接下来我们再停止我们的一个调试过程

我们再回到我们的main函数当中

那么这里我们讲了这么多

我说的这些到底是不是对的呢

我们接下来再通过我们所得到的这个train data loader

应该读取它的图片以及标签信息

看是否是正确的

那么这里我又实现了个plot data loader image这个方法

那我们来看一下这个方法

这个方法当中呢

首先我们获取一下我们这个data load的batchsize

然后我们这个json pass就指向我们刚刚生成的这个json文件

然后我们这里判断一下存存在

如果不存在就报错

然后我们再打开这个计算文件

然后载入它就得到了我们的一个字典

然后通过transport方法来调整它的一个通道顺序

原来通道顺序是channel

高度宽度

那么通过transpose之后

我们就还原成了高度宽度以及channel

然后在我们刚刚预处理过程当中呢

首先我们这个Totensor会将我们的数据范围从0~255

缩放到0~1之间

然后呢通过这个normalize这个方法

将我们数据rgb 个通道的数值分别减去这三个均值

然后再除以这三个标准差

得到我们标准化之后的数据

那么现在我们读入的数据就是标准化之后的数据

如果我们要绘制它呢

我们就需要将它转化回去

所以呢我们这里就对我们的rgb 通道首先乘以这三个数值

然后再加上这三个数值

然后再乘以255

我们就可以还原回原来的一个图像了

那么我们这里绘制的一个图像当中一共有1个行,plot number个列

我们这里呢由于我们刚刚进行了一系列操作之后呢

它是一个float类型

我们这里将它转化成一个int 类型然后再show

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

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

相关文章

html实现各种好看的鼠标滑过图片特效模板

文章目录 1.鼠标悬浮效果1.1 渐动效果1.2 渐变效果1.3 边框效果1.4 线行效果1.5 图标效果1.6 块状效果1.7 边线效果1.8 放大效果1.9 渐出效果1.10 痕迹效果1.11 交叉效果1.12 着重效果1.13 详展效果1.14 能动效果1.15 明细效果 2.主要源码2.1 源代码 源码下载 作者:…

linux后端基础---笔记整理(tmux、vim、shell、ssh/scp、git、thrift、docker)

目录 1.Linux常用文件管理命令 2.tmux终端复用器/vim命令式文本编辑器 3.Shell语法 3.1 Shell—版本3.2 新建一个test.sh文件3.3 Shell文件—运行方式3.4 Shell—注释3.5 Shell—变量3.6 Shell—默认变量,文件参数, “$”的用法3.7 Shell—数组3.8 shell—expr命令…

今日问题:解决最新Chrome和chromedriver版本对不上的问题

from selenium import webdriver #from .chrome.webdriver import WebDriver as Chrome from selenium.webdriver.common.by import By from time import sleep driver webdriver.Chrome()driver.get("https://www.baidu.com/") driver.maximize_window()#窗口最大化…

SpringBoot + Spring Cloud Alibaba + Nacos实现服务管理

1、参考文档 Spring Cloud Alibaba参考文档 https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html Spring Cloud Alibaba官方文档 https://github.com/alibaba/spring-cloud-alibaba/wiki/ 2、引入 Alibaba 依赖 每个 SpringBoot 都有对应的…

[Firefly-Linux] RK3568 Ubuntu固件分区详解

RK为了方便开发与产品定制,自己定义了一套固件的分区,这些分区信息存放在parameter.txt文件中,Firefly参考这个文件定义了自己的Ubuntu分区,文件为parameter-ubuntu.txt,存放于Linux_SDK的device/rockchip/rk356x目录下…

模电笔记。。。。

模电 2.8 蜂鸣器 按照蜂鸣器驱动方式分为有源蜂鸣器和无源蜂鸣器 有源的有自己的震荡电路,无源的要写代码控制。 里面有个线圈,相当于电感,储能,通直隔交。 蜂鸣器的参数:额定电压,工作电压&#xff0…

外贸辅助工具定制的价格范围,别被坑了哟!

随着全球化的不断发展,外贸已成为企业不可或缺的一部分。然而,在外贸过程中,企业往往会遇到各种问题,如语言障碍、文化差异、法规繁琐等,为了解决这些问题,许多企业选择定制外贸辅助工具。 但是&#xff0…

服务器数据恢复—ocfs2文件系统被格式化为其他文件系统如何恢复数据?

服务器故障: 由于工作人员的误操作,将Ext4文件系统误装入到存储中Ocfs2文件系统数据卷上,导致原Ocfs2文件系统被格式化为Ext4文件系统。 由于Ext4文件系统每隔几百兆就会写入文件系统的原始信息,原Ocfs2文件系统数据会遭受一定程度…

一个简单的postman设置断言,为何会难住一个工作5年的测试?

postman设置断言 作为一款接口测试工 具,postman需要对发送请求后返回的结果是否正确做验证,在postman中通过 tests页签做请求的验证,也称为断言。 postman设置断言的流程 1、在tests页签截取要对比的实际响应信息(响应头、响应…

ArkTS快速入门

一、概述 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开发者可以…

DOS 批处理 (一)

DOS 批处理 1. 批处理是什么?2. DOS和MS-DOS3. 各种操作系统shell的区别Shell 介绍图形用户界面(GUI)shell命令行界面(CLI)的 shell命令区别 1. 批处理是什么? 批处理(Batch),也称为批处理脚本…

VisualStudio反汇编功能使用

VisualStudio反汇编功能使用 使用方法 到达断点时:CtrlK(松开)G(后按)唤出反汇编界面,就可以看到当前代码对应的汇编语言了 注意:进入反汇编窗口后可以F10单次调试一条汇编指令 其他&#…

机器学习第15天:GBDT模型

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 ​​ 文章目录 GBDT模型介绍 Boosting 残差 GBDT的缺点 python代码实现 代码 模型参数解释 结语 GBDT模型介绍 GBDT(Gradient Boos…

【深度学习】AlexNet网络实现猫狗分类

【深度学习】AlexNet网络实现猫狗分类 AlexNet简介 AlexNet是一种卷积神经网络(Convolutional Neural Network,CNN)模型,它在2012年的ImageNet图像分类挑战赛中取得了重大突破,引发了深度学习在计算机视觉领域的热潮…

前端学习系列之CSS

目录 CSS 简介 发展史 优势 基本语法 引用方式 内部样式 行内样式 外部样式 选择器 id选择器 class选择器 标签选择器 子代选择器 后代选择器 相邻兄弟选择器 后续兄弟选择器 交集选择器 并集选择器 通配符选择器 伪类选择器 属性选择器 CSS基本属性 优…

基于ssm家庭理财系统源码和论文

基于ssm家庭理财系统源码和论文743 idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 环境: jdk8 tomcat8.5 开发技术 ssm 摘要 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff…

机器人刚性碰撞任务的阻抗控制性能

问题描述 对于机器人刚性碰撞任务,阻抗控制可以有效地提高机器人的适应性和稳定性。 在刚性碰撞任务中,机器人在接触外部物体时需要快速适应并调整自身的运动轨迹和速度,以实现精确的操控和稳定的交互。阻抗控制可以通过调整机器人的阻抗参…

cuda lib 线程安全的要义

1, 概述 cuda lib 线程安全的几个多线程的情景: 单卡多线程; 多卡多线程-每卡单线程; 多卡多线程-每卡多线程; 需要考虑的问题: 每个 cublasHandle_t 只能有一个stream么? 每个cusolverHandle_t 只能有一…

AR + 通信,虚实结合让工作协同从线上到「现场」

在数字经济无所不在的当下,千行百业都与数智化办公接轨并因其实现转型升级。关注【融云 RongCloud】,了解协同办公平台更多干货。 升级的背后,是利用技术把工作用更自然的方式连接起来,让整个工作流协同更顺、体验更好。 而其中…

应用架构——集群、分布式、微服务的概念及异同

一、什么是集群? 集群是指将多台服务器集中在一起, 每台服务器都实现相同的业务,做相同的事;但是每台服务器并不是缺 一不可,存在的主要作用是缓解并发能力和单点故障转移问题。 集群主要具有以下特征: …