Dataset的简单使用

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. passdef __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).passdef __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.rhkb.cn/news/110265.html

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

相关文章

React笔记(一)初识React

一、React概述 1、什么是react react的官网:React 用于构建用户界面的 JavaScript 库,它也是一个渐进式的用于构建用户界面的javascript框架 2、主要特征 声明式:使用原生JS编写的页面存在着开发效率低下、性能较差的情况,使用react大家就…

C++ DAY6

一、菱形继承 又叫钻石继承,由公共子类派生出多个中间子类,又由多个中间子类派生出汇聚子类,汇聚子类会 从中间子类得到从公共基类继承下来的多个成员。 A --------公共基类/ \B C ------- 中间子类\ /D -------…

高忆管理:科创板代码多少开头?

科创板在上海证券买卖所正式开市,这是我国股票商场上的一次重磅改革。科创板旨在推进我国科技立异式企业的发展,招引更多高科技企业到A股上市。那么,科创板的代码多少最初呢?这个问题也让许多投资者和重视者非常重视。接下来&…

Java简便集成工作流(activiti),通用审批系统

前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,请假审批demo从流程绘制到审批结束实例。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平…

用NeRFMeshing精确提取NeRF网络中的3D网格

准确的 3D 场景和对象重建对于机器人、摄影测量和 AR/VR 等各种应用至关重要。 NeRF 在合成新颖视图方面取得了成功,但在准确表示底层几何方面存在不足。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 我们已经看到了最新的进展,例如 NVIDIA 的…

Ansible学习笔记(二)

3.ansible的使用示例(playbook) 1.创建mysql 账户和mysql 组的 playbook ---#create mysql user and group - hosts: allremote_user: roottasks:- name: create groupgroup: namemysql systemyes gid306- name: create useruser: namemysql systemyes…

【FreeRTOS】【STM32】中断详细介绍

文章目录 一、三种优先级的概念辨析1. 先理清楚两个概念:CPU 和 MPU2. Cortex-M3 内核与 STM32F1XX 控制器有什么关系3. 优先级的概念辨析① Cortex-M3 内核和 STM32F1XX 的中断优先级② FreeRTOS 的任务的优先级 二、 Cortex-M3 内核的中断优先级1. 中断编号2. 优先…

Prometheus关于微服务的监控

在微服务架构下随着服务越来越多,定位问题也变得越来越复杂,因此监控服务的运行状态以及针对异常状态及时的发出告警也成为微服务治理不可或缺的一环。服务的监控主要有日志监控、调用链路监控、指标监控等几种类型方式,其中指标监控在整个微服务监控中比重最高,也是实际生…

kafka学习笔记

1、kafka是什么? kafka是一个高吞吐,分布式,基于发布/订阅的消息系统,最大的特性就是可以实时的处理大量的数据以满足各种需求场景:日志收集,离线和在线的消息消费,等等 2、kakfa的基础架构&am…

SMC_TRAFO_GantryCutter2 (FB) 带刀片旋向龙门

裁布机:刀片按XY走向,偏转刀片角度。 pi:目标位置矢量(x,y),插值器的输出 v:当前路径切线的矢量,插值器的输出 dOffsetX: x轴的附加偏移 dOffsetY&#xf…

NeRFMeshing - 精确提取NeRF中的3D网格

准确的 3D 场景和对象重建对于机器人、摄影测量和 AR/VR 等各种应用至关重要。 NeRF 在合成新颖视图方面取得了成功,但在准确表示底层几何方面存在不足。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 我们已经看到了最新的进展,例如 NVIDIA 的 …

基于 xhr 实现 axios

基于 xhr 实现 axios 上面我们讲到二次封装 axios ,但是现在我们尝试完全脱离 axios,自己实现一个 axios,由于 axios 底层是基于 xhr 做了二次封装,所以我们也可以尝试一下。 xhr 二次封装 src/plugins/xhr.js /*** 请求拦截器…

新能源电驱动总成相关标准简介

新能源电驱动总成相关标准简介 电驱动系统标准体系是电动汽车标准体系中重要的组成部分,其制定和更新对于保障电动汽车的使用性能和安全性能具有非常重要的作用。 随着电动汽车行业的快速发展和普及,电驱动系统的重要性也越来越凸显。为了确保电动汽车的…

循环神经网络(RNN) | 项目还不成熟 |还在初级阶段

一,定义 循环神经网络(Recurrent Neural Network,RNN)是一种深度学习神经网络架构,专门设计用于处理序列数据,如时间序列数据、自然语言文本等(一般用来解决序列问题)。 因为它们具…

ResNet详解:网络结构解读与PyTorch实现教程

目录 一、深度残差网络(Deep Residual Networks)简介深度学习与网络深度的挑战残差学习的提出为什么ResNet有效? 二、深度学习与梯度消失问题梯度消失问题定义为什么会出现梯度消失?激活函数初始化方法网络深度 如何解决梯度消失问…

线性代数的学习和整理12: 矩阵与行列式,计算上的差别对比

目录 1 行列式和矩阵的比较 2 简单总结矩阵与行列式的不同 3 加减乘除的不同 3.1 加法不同 3.2 减法不同 3.3 标量乘法/数乘 3.3.1 标准的数乘对比 3.3.2 数乘的扩展 3.4 乘法 4 初等线性变换的不同 4.1 对矩阵进行线性变换 4.2 对行列式进行线性变换 1 行列式和…

算法通关村第5关【白银】| 哈希和栈经典算法题

1.两个栈实现队列 思路:两个栈,一个输入栈,一个输出栈。 当需要输入的时候就往inStack中插入,需要输出就往outStack中输出,当输出栈是空就倒出输入栈的数据到输出栈中,这样就保证了后插入的数据从栈顶倒入…

Docker修改容器ulimit的全部方案及各方案的详细步骤

要修改Docker容器的ulimit(用户资源限制),有以下三种方案,每个方案的详细步骤如下: 方案一:在Dockerfile中设置ulimit 打开您的Dockerfile。在文件中添加以下命令来修改ulimit:RUN ulimit -n …

他们朝我扔泥巴(scratch)

前言 纯~~~属~~~虚~~~构~~~(同学看完短视频要我做,蟹蟹你) 用scratch做的,幼稚得嘞( ̄_ ̄|||)呵呵(强颜欢笑) 完成视频 视频试了好久,就是传不上来,私信我加我…

LabVIEW开发灭火器机器人

LabVIEW开发灭火器机器人 如今,自主机器人在行业中有着巨大的需求。这是因为它们根据不同情况的适应性。由于消防员很难进入高风险区域,自主机器人出现了。该机器人具有自行检测火灾的能力,并通过自己的决定穿越路径。 由于消防安全是主要问…