Dataset的简单使用

news2024/11/16 23:39:58

Pytorch 给我们提供了一个方法,方便我们加载数据,我们可以使用这个框架,去加载我们的数据。看下伪代码:

# ================================================================== #
#                Input pipeline for custom dataset                 #
# ================================================================== #

# You should build your custom dataset as below.
class CustomDataset(torch.utils.data.Dataset):
    def __init__(self):
        # TODO
        # 1. Initialize file paths or a list of file names. 
        pass
    def __getitem__(self, index):
        # TODO
        # 1. Read one data from file (e.g. using numpy.fromfile, PIL.Image.open).
        # 2. Preprocess the data (e.g. torchvision.Transform).
        # 3. Return a data pair (e.g. image and label).
        pass
    def __len__(self):
        # You should change 0 to the total size of your dataset.
        return 0 

# You can then use the prebuilt data loader. 
custom_dataset = CustomDataset()
train_loader = torch.utils.data.DataLoader(dataset=custom_dataset,
                                           batch_size=64, 
                                           shuffle=True)
  • __getitem__:返回一个样本
  • __len__:返回样本的数量

首先先创建一个文件夹,将图片放在同一个文件夹下。

image-20230829102904815

导入库文件

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

图片数据预处理

预处理在机器学习和深度学习中起着重要的作用,它包括对输入数据进行一系列的变换和标准化操作。以下是为什么需要预处理的一些常见原因:

  1. 数据归一化/标准化:预处理过程中的归一化/标准化步骤有助于将数据的范围缩放到一个可接受的范围,以便更好地适应模型的训练。这有助于提高模型的收敛速度,并可以避免梯度消失或爆炸的问题。
  2. 数据增强:通过应用一系列的图像变换,如旋转、裁剪、平移、翻转等,可以扩增训练数据集,从而增加模型的泛化能力。数据增强可以减轻过拟合问题,并提高模型对多样性数据的鲁棒性。
  3. 数据格式转换:预处理可以将数据从原始格式(如图像文件、文本文件等)转换为模型所需的张量格式。例如,在计算机视觉任务中,图像通常被转换为张量,并进行通道重新排列、大小调整等操作。
  4. 噪声去除和数据清洗:预处理过程也可以用于去除数据中的噪声、异常值或无效样本。这有助于提高数据质量,并减少对模型的负面影响。

来自chatGPT

# 预处理
transform = transforms.Compose([ # 使用 Compose 可以将这些操作串联在一起
    
    transforms.Resize((224,224)), # 调整图片大小
    transforms.ToTensor(), # 将图片转换为Tensor对象,方便作为神经网络的输入
    transforms.Normalize( (0.1307, ), (0.3081, )) # 对图片进行归一化
])

定义Dataset类

__init__

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

    # 初始化:指定路径,是否进行预处理等
    def __init__(self, path, transform = None) -> None: 
        super().__init__()
        # os.listdir : 会将data下面的image中所有的文件读取,放在imgs里面
        img_path = os.path.join(path, "image/") # 进行拼接 得到 data/train/image/
        imgs = os.listdir(img_path) 
        # 取出path下所有的文件
        self.imgs = [os.path.join(img_path, img) for img in imgs]
        self.transforms = transform # 图像预处理

__getitem__

__getitem__用于返回一个样本,返回之前做的处理数据的操作,也在__getitem__里面。

    def __getitem__(self, index): # 读取图片
        img_path = self.imgs[index] # 图片路径

        label_path = img_path.replace("image", "label") # 得到label文件夹下数据
        label = Image.open(label_path)
        data = Image.open(img_path)
        if self.transforms: # 图片预处理
            data = self.transforms(data)

        return data, label # tuple类型

__len__

__len__返回样本个数(图片路径的个数)

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

测试

image-20230829103513330

全部代码

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


# 预处理
data_transform = transforms.Compose([ # 使用 Compose 可以将这些操作串联在一起
    
    transforms.Resize((224,224)), # 调整图片大小
    transforms.ToTensor(), # 将图片转换为Tensor对象,方便作为神经网络的输入
    transforms.Normalize( (0.1307, ), (0.3081, )) # 对图片进行归一化
])

class Data(Dataset):
    # 初始化:指定路径,是否进行预处理等
    def __init__(self, path, transform = None) -> None: 
        super().__init__()
        # os.listdir : 会将data下面的image中所有的文件读取,放在imgs里面
        img_path = os.path.join(path, "image/") # 进行拼接 得到 data/train/image/
        imgs = os.listdir(img_path) 
        # 取出path下所有的文件
        self.imgs = [os.path.join(img_path, img) for img in imgs]
        self.transforms = transform # 图像预处理

    def __getitem__(self, index): # 读取图片
        img_path = self.imgs[index] # 图片路径

        label_path = img_path.replace("image", "label") # 得到label文件夹下数据
        label = Image.open(label_path)
        data = Image.open(img_path)
        if self.transforms: # 图片预处理
            data = self.transforms(data)
            label = self.transforms(label)
        return data, label # tuple类型
    def __len__(self):
        return len(self.imgs)

# ts1 = Data('data/train/', transform=data_transform)
# print(type(ts1[0]))
# print(ts1[0])
# print(len(ts1))

if __name__ == '__main__':
    ts1 = Data('data/train/', transform=data_transform)
    for i,(img, label) in enumerate(ts1):
        print(i, 'img', img.size(), 'label', label.size())

关于pytorch的数据处理-数据加载Dataset_datasets pytorch_Henry_zhangs的博客-CSDN博客

Pytorch深度学习实战教程(三):UNet模型训练,深度解析! - 知乎 (zhihu.com)

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

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

相关文章

中国资产深夜狂飙,多股涨超10%

刚刚,中国资产集体狂飙。 8月29日晚间,美股市场开盘后,中概股集体大涨,纳斯达克中国金龙指数盘中一度大涨超4%,老虎证券盘中一度暴涨超24%,拼多多涨幅超18%,贝壳、每日优鲜、雾芯科技等多股涨超…

Maven - 使用maven-release-plugin规范化版本发布

文章目录 Maven Release plugin – IntroductionMaven Release plugin – Plugin DocumentationMaven Release plugin – Usage实战案例 Maven Release plugin – Introduction Maven Release Plugin(Maven 发布插件)是一个用于帮助在Maven项目中执行版…

BFS4专题 迷宫最短路径(输出路径)

题目:样例: 输入 3 3 0 1 0 0 0 0 0 1 0 输出 1 1 2 1 2 2 2 3 3 3 思路: 这里刚开始看的时候会可能有点复杂了,因为是递归。 但是只要理解了含义,脑袋里模拟一下还是可以理解的。首先还是 之前那样 BFS 常规搜索 …

深圳寄墨西哥专线国际物流详解

随着全球贸易的不断发展,国际物流服务的需求也越来越大。深圳这座中国的特区城市,不仅是全球电子产品供应链的重要节点,也是国际物流服务的中心之一。对于那些需要将物品从深圳邮寄到墨西哥的人来说,深圳邮寄到墨西哥专线的国际物…

【JavaEE进阶】拦截器与统一功能处理

文章目录 一. 用户登录权限效验1. 最初用户登录验证2. Spring AOP 用户统一登录的验证3. Spring拦截器3.1 自定义拦截器3.2 将自定义拦截器设置到当前的项目中 4. 拦截器实现的原理 二. 统一的异常处理三. 统一数据返回格式1. 统一数据返回格式的优点2. 统一数据返回格式的实现…

vim编辑器的基本使用复习

之前写过vim的使用,还不是太熟悉;复习一下, 在MSYS2下使用vim;先安装;单安装vim的话非常快; 输入 vim hello.c,进入文件hello.c的编辑;刚进入时是在vim的命令模式,不能输…

计算机视觉主要任务

计算机视觉:使用计算机及相关设备对生物视觉的一种模拟。 主要包含6大任务,图像分类,目标检测,目标跟踪,语义分割,实例分割,影像重构。 图像分类:根据图像信息中所反映的不同特征&am…

[Android 四大组件] --- Service

1 service是什么 Service是Android系统中的四大组件之一&#xff0c;它是一种长生命周期的&#xff0c;没有可视化界面&#xff0c;运行于后台的一种服务程序。 2 service分类 3 service启动方式 3.1 startService显示启动 // AndroidManifest.xml<?xml version"1…

2023第七届蓝帽杯 初赛 web LovePHP

LovePHP 直接给了源码。 network查看到&#xff0c;PHP版本是7.4.33 题目要求我们GET一个my_secret.flag参数&#xff0c;根据PHP字符串解析特性&#xff0c;PHP需要将所有参数转换为有效的变量名&#xff0c;因此在解析查询字符串时&#xff0c;它会做两件事&#xff1a; 删…

各个微服务模块之间互相依赖调用的问题

首先是模块之间不能够循环引用&#xff0c;否则会报循环依赖引入的错误。 没有了模块之间的相互依赖&#xff0c;在项目中这两个模块是相互调用的&#xff0c;分别各自定义相应的Feign接口&#xff0c;如下&#xff1a; 最开始写的运行报错的代码如下&#xff1a; FeignCli…

概念解析 | 量子机器学习:将量子力学与人工智能的奇妙融合

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:量子机器学习。 量子机器学习:将量子力学与人工智能的奇妙融合 量子增强机器学习:量子经典混合卷积神经网络 量子机器学习是量子计算和机器学习的结合,它利用量子力学的特…

Python小知识 - 一个简单的Python爬虫实例

一个简单的Python爬虫实例 这是一个简单的Python爬虫实例&#xff0c;我们将使用urllib库来下载一个网页并解析它。 首先&#xff0c;我们需要安装urllib库&#xff1a; pip install urllib接下来&#xff0c;我们来看看如何使用urllib库来下载一个网页&#xff1a; import url…

Mybatis学习笔记(三)——Mybatis的配置(Mybatis-config.xml)

Mybatis学习笔记&#xff08;三&#xff09;——Mybatis的配置&#xff08;Mybatis-config.xml&#xff09; 传送门&#xff1a;Mybatis中文网——配置 Mybatis配置文档的顶层结构&#xff1a; configuration&#xff08;配置&#xff09; properties&#xff08;属性&#…

软考A计划-网络工程师-复习背熟-网络管理和计算机基础知识

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

基于SpringBoot+Vue的旅游系统

摘 要 随着旅游业的发展&#xff0c;越来越多的人选择旅游作为自己的出行方式。在旅游规划过程中&#xff0c;旅游景点选择是至关重要的环节。本文提出了一种基于协同过滤推荐算法的旅游平台系统。该系统采用前后端分离的设计&#xff0c;主要使用了SpringBoot、Vue等技术&…

springmvc没有绿标,怎么配置tomcat插件运行?

一、添加插件后&#xff0c;刷新&#xff0c;自动从maven仓库下载tomcat插件 二、写好项目后&#xff0c;添加tomcat配置 三、即可点击绿标运行

2024王道408数据结构P144 T17

2024王道408数据结构P144 T17 思考过程 先看题目&#xff0c;让我们判断两棵二叉树是否相似&#xff0c;相似指的是以下三个方面&#xff1a; T1和T2都是空的二叉树或T1和T2都只有一个结点T1的左子树和T2的左子树是相似的&#xff0c;且T1的右子树和T2的右子树是相似的。 题…

61.linux系统上c程序的编译与调试

目录 1.检查GCC是否已经安装&#xff1a;​编辑 2.使用包管理器来安装gcc: 3.c程序执行需要经过四个步骤 4.make和makefile 5.gdb调试 基础调试命令 一些示例 对于在Linux系统上编译和调试C程序&#xff0c;首先&#xff0c;需要确保已经安装了合适的编译器。在大多数…

均匀性校准积分球光源

随着LED半导体照明技术的发展和LED半导体照明产业的不断壮大&#xff0c;合理有效的LED 灯具或芯片的光度、色度检测方法是支撑半导体照明产业发展的重要技术基础&#xff0c;同时也 为积分球内部照明产品的提升提供了重要的技术保障。 在物理世界中&#xff0c;存在着各种各样…

elementui tree 层级过多时,高亮状态无法选满整行

问题&#xff1a; 如上图所示&#xff0c;官方的tree组件&#xff0c;在层级很多时 elementui -tree 的高亮状态并没有选中整行。 &#xff08;衍生库 vue-easy-tree 也会出现此问题&#xff09; 原因&#xff1a; &#xff08;没有查看源码&#xff0c;只是根据dom简单定位…