关于pytorch的数据处理-数据加载Dataset

news2025/7/3 19:16:27

目录

1. 数据加载

2. Dataset 

__init__

__getitem__

__len__

测试一下

完整代码

3. Dataset - ImageFolder


1. 数据加载

最近在使用 Unet 做图像分割,设计到 处理数据有关的工作,查了点资料,做一些简单的总结

在pytorch 中,数据的加载可以通过自定义的数据集对象实现,这里是Dataset 类,实现自定义的数据集需要继承Dataset,并且实现两个方法

  • __getitem__: 返回一个样本
  • __len__: 返回样本的数量

其实,之前一直都有用过Dataset类,但是都是直接调库的,所以导致现在对Dataset有点熟悉又有点陌生的感觉

之前下载CIFAR10 数据集的时候,用的都是:

  •  这里的torchvision 提供数据集
  •  torchvision 里面的dataset 就包含了各种的数据集

2. Dataset 

接下来,通过猫和狗的图像介绍Dataset ,介绍如何处理数据

首先先创建一个文件夹,里面随便上网上下载几张猫和狗的图片,放在同一个文件夹下

这里的猫狗文件名被改了,后面数字是随机输的,目的是通过 ' . ' 前面的dog和cat生成label


然后提前导入下面的库文件

 


__init__

接下来定义初始化方法

 init 里面是初始化方法,例如传入图片的路径,或者要不要选择预处理等等

这里并不实际加载图片,只是指定路径,真正的读取图片在getitem方法里面

os.listdir : 会将data下面所以的文件读取,放在imgs里面,打印结果是上面的注释

然后self.imgs 会将imgs里面的路径和root路径 拼接在一块,输出结果如下:

['./data/cat.15454.jpg', './data/cat.445.jpg', './data/cat.46456.jpg', './data/cat.656165.jpg', './data/dog.123.jpg', './data/dog.15564.jpg', './data/dog.4545.jpg', './data/dog.456465.jpg']

imgs 里面是具体文件的路径,root里面是文件夹的路径

__getitem__

上面说过,getitem 是返回一个样本,所以说这里是将结果返回的。那么返回之前做的处理数据的操作,也在__getitem__里面。

 

这里的img_path 通过self.imgs[index] 会将self.imgs里面的内容一个个读取出来

而self.imgs 里面是下图,每个数据的路径

 所以self.imgs[index]会遍历self.imgs 里面的路径,返回给img_path

打印结果: 

 然后,就可以根据每个路径的id去做label了。将img_path 路径按照 '/ '分割,-1代表取最后一个字符串,如果里面有dog就为1,cat就为0,例如:下面的例子打印的就是Yes

 

最后,看看有没有预处理transforms ,然后返回data和label就行了

__len__

返回样本的个数 = 图片路径的个数 

测试一下

最后的结果如下:

 

所以通过上面的代码,就可以实现一个自定义自己数据集的办法,并且可以获取

完整代码

import torch
import torchvision.datasets
from torch.utils.data import Dataset        # 继承Dataset类
import os
from PIL import Image
import numpy as np
from torchvision import transforms


# 预处理
data_transform = transforms.Compose([
    transforms.Resize((224,224)),           # 缩放图像
    transforms.ToTensor(),                  # 转为Tenso
    transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))       # 标准化
])


class DogCat(Dataset):      # 数据处理
    def __init__(self,root,transforms = None):                  # 初始化,指定路径,是否预处理等等

        #['cat.15454.jpg', 'cat.445.jpg', 'cat.46456.jpg', 'cat.656165.jpg', 'dog.123.jpg', 'dog.15564.jpg', 'dog.4545.jpg', 'dog.456465.jpg']
        imgs = os.listdir(root)

        self.imgs = [os.path.join(root,img) for img in imgs]    # 取出root下所有的文件
        self.transforms = data_transform                        # 图像预处理

    def __getitem__(self, index):       # 读取图片
        img_path = self.imgs[index]
        label = 1 if 'dog' in img_path.split('/')[-1] else 0        #  dog -> 1,cat -> 0

        data = Image.open(img_path)

        if self.transforms:     # 图像预处理
            data = self.transforms(data)

        return data,label

    def __len__(self):
        return len(self.imgs)


dataset = DogCat('./data/',transforms=True)

for img,label in dataset:
    print('img:',img.size(),'label:',label)
'''
img: torch.Size([3, 224, 224]) label: 0
img: torch.Size([3, 224, 224]) label: 0
img: torch.Size([3, 224, 224]) label: 0
img: torch.Size([3, 224, 224]) label: 0
img: torch.Size([3, 224, 224]) label: 1
img: torch.Size([3, 224, 224]) label: 1
img: torch.Size([3, 224, 224]) label: 1
img: torch.Size([3, 224, 224]) label: 1
'''

3. Dataset - ImageFolder

ImageFolder 可以更好的将上述的猫狗打好标签

ImageFolder 假设所有的文件按文件夹保存,每个文件夹下存储同一个类别的图片,文件名为类名

例如:将上述的图片放在不同的文件夹下

文件名的大小写要一致,如首字母大写,都要大写

 

 这样ImageFolder 读取的label就是按照文件名顺序排序成为字典的,也就是{类名:序号}。就是类名+对应的label

可以通过 .class_to_idx 查看

 

打印结果为:

['Cat', 'Dog']



{'Cat': 0, 'Dog': 1}



Dataset ImageFolder
    Number of datapoints: 8
    Root location: ./DogCat/



[('./DogCat/Cat\\cat.15454.jpg', 0), ('./DogCat/Cat\\cat.445.jpg', 0), ('./DogCat/Cat\\cat.46456.jpg', 0), ('./DogCat/Cat\\cat.656165.jpg', 0), ('./DogCat/Dog\\dog.123.jpg', 1), ('./DogCat/Dog\\dog.15564.jpg', 1), ('./DogCat/Dog\\dog.4545.jpg', 1), ('./DogCat/Dog\\dog.456465.jpg', 1)]
 

这个就是为什么 pytorch 搭建AlexNet 对花进行分类 这里面对花分类,文件夹的顺序就是这个类别的顺序

 

最后就是:

 

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

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

相关文章

Thinkphp安装报错解决办法

跟着官方文档的步骤安装thinkphp报错该如何解决: 前言 ThinkPHP无需安装过程,但是需要把ThinkPHP框架放入WEB运行环境(前提是你的WEB运行环境没有问题)。 一、Thinkphp安装以及报错解决方式 Thinkphp官网:安装ThinkP…

Mysql为何不推荐写多表SQL

前言 在大部分情况下,单表并不是比多表快单表优势在于理解成本与可控性有时候你觉得单表SQL不好写的时候,你改更新的是表结构 现状 在我们学习MySql的路程之中,估计不少人告诫我们不要写长语句。 至于为什么,确实很少人提起。 …

2.6 用一套万能文案公式来拆解4个小红书爆文案例【玩赚小红书】

公式细分人群他们的痛点数字干货分享情感共鸣 我们一个一个来看。 ​ ​ 一、《9平次卧小房间,再见了传统榻榻米(附户型图)》 家装类:避坑/攻略/小价钱装出大效果/装修效果拔群 标题直接点出了目标人群的需求:如何…

XSS进阶之CSP绕过

目录预备知识实验目的实验环境实验步骤一实验步骤二实验步骤三预备知识 1.了解Javascript、PHP和CSP的一些特性,比如“strict-dynamic”。 2.CSP:实质就是白名单制度,它规定哪些外部资源可以加载和执行。它的实现和执行全部由浏览器完成。资…

python实战指西<1>pygame安装,以及vscode

目录 1,安装pygame 1.1,(如果前一个没反应的化) 1.2如果飘红字 1,检查是否开了网络代理(不要开) 2,检查是否有pip模块更新需要 2.这里顺便记录一下vscode 蛇蛇的环境搭载 2.1首…

Postgresql实验系列(4)SIMD提升线性搜索性能24.5%(附带PG SIMD完整用例)

概要 接上一篇《Postgresql引入SIMD指令集》 PG引入SIMD执行集后具体有多大性能提升?本篇抽取PG的simd库,对比线性搜索场景的性能: 测试场景(文章最后提供完整程序) 构造一个存有14亿数字的数组 uint32 cnt 14100…

【python3】3.函数、类、模块

2022.11.15 本学习内容总结于莫烦python:3.函数、类、模块 https://mofanpy.com/tutorials/python-basic/interactive-python/function1. Function 函数 我常会重复写一些功能,比如查询文件时间,查询文件名字等等.后续我只需要引用到这个功能&#xff0…

Flink架构重要概念解析-超详理解

文章目录💎 1.1 系统架构1.1.1 整体构成1.1.2 作业管理器(JobManager)1.1.3 任务管理器(TaskManager)🚀1.2 作业提交流程1.2.1 高层级抽象视角1.2.2 独立模式(Standalone)1.2.3 YARN…

网页数据采集系统-怎样利用爬虫爬网站数据

随着社会不停地发展。人们也是越来越离不开互联网,今天小编就给大家盘点一下免费的网页数据采集系统,只需要点几下鼠标就能轻松爬取数据,不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四! 企业人员 通过爬…

【直播预告】相机模型与标定——Real world超级公开课

导言 《Realworld超级公开课》是奥比中光3D视觉开发者社区打造的品牌活动之一,聚焦于3D视觉传感技术。每期课程邀请奥比中光及生态合作伙伴的技术专家,以线上线下相结合的授课形式,面向高校与人工智能企业的开发者,分享3D视觉技术…

线程的“结束”

【一道概率很高的面试题】: 如何优雅的结束一个线程? 上传一个大文件,正在处理费时的计算,如何优雅的结束这个线程呢? 【stop方法】: 【为何不建议使用stop呢?】: 因为很容易产生…

【附源码】计算机毕业设计JAVA成绩分析系统

【附源码】计算机毕业设计JAVA成绩分析系统 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA mybati…

ORA-01940 无法删除当前已连接的用户之解决方案(脚本)

第一部分:配置数据库连接 1. 安装ODBC yum -y install unixODBC unixODBC-devel 2. 安装Oracle-instantclient #以下所有操作使用root账号执行 #创建目录 mkdir -p /opt/oracle cd /opt/oracle #下载odbc安装包 wget https://download.oracle.com/otn_software…

计算机毕业设计ssm+vue基本微信小程序的好物推荐分享系统

项目介绍 我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,好物分享系统小程序被用户普遍使用,为方便用户能够可以随时进行好物分享系统小程序的数据信息管理,特开发了基于好物分…

做食品能入驻Lazada吗?带你解锁东南亚当地热销及需求食品系列

中国的电商领域已经趋于饱和状态,中国食品电商领域已经呈现出存量的趋势了,例如:良品铺子、三只松鼠、百草味、口水娃、盼盼等国内知名品牌已经占比了国内大部分的市场份额,跟着巨头抢市场 无疑是很难的,那么中国这么多…

红外线热像仪的热成像质量介绍

摘要 毫无疑问,你在过去几年的某个时候,购买了数位相机来更换旧的胶卷相机。你的购买可能受到你的信念的影响,即在尝试判断提供的所有相机选择之间的图像质量时,像素数是最重要的规格。 任何阅读过消费者报告及其对数位相机的详…

CVE-2020-1472-ZeroLogon复现

CVE-2020-1472-ZeroLogon复现 简介 Netlogon使用的AES认证算法中的vi向量默认为0,导致攻击者可以绕过认证,同时其设置域控密码的远 程接口也使用了该函数,导致可以将域控中保存在AD中的管理员password设置为空 影响版本 Windows Server 2…

大牛耗时两年完成的实战手册。Elasticsearch实战,掌握这些刚刚好!

记得刚接触Elasticsearch的时候,没找啥资料,直接看了遍Elasticsearch的中文官方文档,中文文档很久没更新了,一直都是2.3的版本。最近又重新看了遍6.0的官方文档,由于官方文档介绍的内容比较多,每次看都很费…

10.基础备份与时间点恢复

目录 基础备份 时间点恢复 时间线 基础备份与时间线都是为了时间点恢复。 基础备份 基础备份的目的是备份当前的数据库集簇的快照,结合归档日志一起可以恢复至任意的时间点。 基础备份通过pg_start_backup命令开始为基础备份做准备,它会: 强制进行整…

[附源码]java毕业设计基于web的停车收费管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…