【Pytorch】加载数据

news2024/11/15 17:56:31

数据集获取:链接: https://pan.baidu.com/s/1jZoTmoFzaTLWh4lKBHVbEA 密码: 5suq

本文基于P5. PyTorch加载数据初认识_哔哩哔哩_bilibili 

dataset:提供一种方式去获取数据及其label值,解释:Pytorch中的dataset类——创建适应任意模型的数据集接口_datasetpath-CSDN博客

dataloader:为网络提供不同的数据形式

首先新建一个python文件:read_data

把数据集文件与代码文件放在同一目录下

找到图片,复制路径。

read_data文件代码:

from torch.utils.data import Dataset
# 读取图片
from PIL import Image
import os


# Dataset 是 PyTorch 的数据集基类。
# Image 用于打开和处理图片。
# os 用于处理文件路径。

# MyData 类继承自 PyTorch 的 Dataset 类,需要实现三个方法:__init__()、__getitem__() 和 __len__()。
class MyData(Dataset):
    # 初始化s
    def __init__(self, root_dir, label_dir):
        # self.root_dir和self.label_dir分别保存图像数据的根目录和标签目录。
        # self.path是root_dir 和 label_dir的连接路径。
        # self.img_path是指定目录下所有文件的列表,即图像文件的名称。
        # 路径
        self.root_dir = root_dir
        # 标签名
        self.label_dir = label_dir
        # 拼接成路径名
        self.path = os.path.join(self.root_dir, self.label_dir)
        # 获取所有图片的编号
        self.img_path = os.listdir(self.path)

    # 传编号
    def __getitem__(self, idx):
        # idx是数据集中的索引。
        # img_name是根据索引获取的图像文件名称。
        # img_item_path是图像的完整路径。
        # Image.open(img_item_path)用于打开图像文件。
        # label是图像的标签(在这个例子中,标签是目录名)。
        # return img, label返回图像和标签的元组。

        # 当前图片的名字
        img_name = self.img_path[idx]
        # 当前图片的地址
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)

        # 打开图片
        # Image.open()返回值是PIL类型格式,可以直接图片展示
        img = Image.open(img_item_path)
        label = self.label_dir

        # 返回样本对{x:y}
        return img, label

    def __len__(self):
        # 返回数据集中图像的数量,即img_path列表的长度。
        # 返回长度
        return len(self.img_path)

# root_dir 是数据的根目录。
# ants_label_dir 和 bees_label_dir 是两个标签目录,分别代表蚂蚁和蜜蜂的图像数据。
# ants_dataset 和 bees_dataset 分别是两个 MyData 实例,表示蚂蚁和蜜蜂的图像数据集。
root_dir = "dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)

train_dataset = ants_dataset + bees_dataset

进阶版:

from torch.utils.data import Dataset, DataLoader
from torch.utils.data import ConcatDataset
import numpy as np
from PIL import Image
import os
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
from torchvision.utils import make_grid

# Dataset 和 DataLoader 用于创建和加载数据集。
# ConcatDataset 用于合并多个数据集。
# Image 用于打开和处理图像。
# os 用于处理文件路径。
# transforms 用于图像预处理。
# SummaryWriter 用于 TensorBoard 日志记录。
# make_grid 用于将多个图像合并成一个网格图像。

writer = SummaryWriter("logs")

class MyData(Dataset):

    def __init__(self, root_dir, image_dir, label_dir, transform):
        self.root_dir = root_dir
        self.image_dir = image_dir
        self.label_dir = label_dir

        self.label_path = os.path.join(self.root_dir, self.label_dir)
        self.image_path = os.path.join(self.root_dir, self.image_dir)

        self.image_list = os.listdir(self.image_path)
        self.label_list = os.listdir(self.label_path)

        # 应用于图像的转换操作(如调整大小和转换为 Tensor)
        self.transform = transform
        # 因为label 和 Image文件名相同,进行一样的排序,可以保证取出的数据和label是一一对应的
        self.image_list.sort()
        self.label_list.sort()

    def __getitem__(self, idx):
        # 根据索引idx获取图像和标签。
        # img_item_path和label_item_path是图像和标签的完整路径。
        # Image.open(img_item_path)
        # 打开图像文件。
        img_name = self.image_list[idx]
        label_name = self.label_list[idx]

        img_item_path = os.path.join(self.root_dir, self.image_dir, img_name)
        label_item_path = os.path.join(self.root_dir, self.label_dir, label_name)

        #获取图片文件
        img = Image.open(img_item_path)

        # 读取标签文件的内容。
        with open(label_item_path, 'r') as f:
            label = f.readline()

        # 应用转换操作self.transform。
        img = self.transform(img)

        # 返回一个字典,包含图像和标签。
        sample = {'img': img, 'label': label}
        return sample

    def __len__(self):
        # 确保图像和标签的数量相同。
        # 返回数据集中图像的数量。
        assert len(self.image_list) == len(self.label_list)
        return len(self.image_list)

if __name__ == '__main__':
    # transform定义了图像预处理操作。
    transform = transforms.Compose([transforms.Resize((256, 256)), transforms.ToTensor()])

    root_dir = "dataset/train"
    image_ants = "ants_image"
    label_ants = "ants_label"
    ants_dataset = MyData(root_dir, image_ants, label_ants, transform)

    image_bees = "bees_image"
    label_bees = "bees_label"
    bees_dataset = MyData(root_dir, image_bees, label_bees, transform)

    train_dataset = ants_dataset + bees_dataset

    # 使用DataLoader创建一个数据加载器,batch_size = 1和num_workers = 2。
    dataloader = DataLoader(train_dataset, batch_size=1, num_workers=2)

    # 使用SummaryWriter将索引为119的图像写入TensorBoard。
    writer.add_image('error', train_dataset[119]['img'])
    writer.close()

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

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

相关文章

使用rsyslog转发自定义日志到指定服务器

rsyslog简介 rsyslog 是一个高度可配置的、功能强大的系统日志守护进程,广泛用于 UNIX 和 Linux 系统中。它是 syslog 的一个扩展版本,提供了许多额外的功能和改进。能够收集、过滤、存储和转发日志数据。它的灵活性和扩展性使其成为现代 Linux 系统中日…

剪辑视频,这四大工具助你一臂之力!

在这个数字化的时代,视频已成为一种重要的表达手段。无论您是专业视频制作者还是只是偶尔想要编辑一些个人视频,一款优秀的视频剪辑软件都将是您不可或缺的好帮手。以下是几款值得推荐的视频剪辑软件。 福昕视频剪辑 直达链接:www.pdf365.c…

巧用智能表单高效收集客户信息

企客宝企微版的智能表单功能,方便企微好友提交信息,直接入库管理,确保了一些类似身份证号等敏感信息,在传递过程中的数据安全 前言 很多企业在与企微好友沟通时,有时会有收集客户信息的需求,比如客户报名的…

PID控制算法(一)

PID算法控制: PID算法应用十分广泛,包括温度、气压控制,流速、液位控制,无人机悬停,小球摆动受力以及姿态调整等等。 此时,假定有固定时间间隔t,对应有不同t时刻的输出值x;另外&…

【机器学习】生成对抗网络(Generative Adversarial Networks, GANs)详解

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 生成对抗网络(Generative Adversarial Networks, GANs)详解GANs的基本原理GANs的…

基于人工智能的情感分析系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 情感分析系统是自然语言处理中的重要应用之一,用于从文本中自动识别和分析用户情感,如“积极”、“消极”或“…

UDP通信实现

目录 前言 一、基础知识 1、跨主机传输 1、字节序 2、主机字节序和网络字节序 3、IP转换 2、套接字 3、什么是UDP通信 二、如何实现UDP通信 1、socket():创建套接字 2、bind():绑定套接字 3、sendto():发送指定套接字文件数据 4、recvfrom():接收指定地址信息的数据 三…

C语言操作符汇总(上)

目录 前言 一、操作符的分类 二、⼆进制和进制转换 1. 二进制转10进制 2. 10进制转2进制数字 3. 2进制转8进制和16进制 3.1 2进制转8进制 3.2 二进制转16进制 三、原码、反码、补码 四、移位操作符 1. 左移操作符 2. 右移操作符 五、位操作符:&…

10-1RT-Thread动态内存管理

10-1RT-Thread动态内存管理 在嵌入式系统中,变量和中间数据一般存放在系统存储空间中。只有在实际使用时,才将它们从存储空间读取到CPU进行运算。存储空间可分为两种,内部存储空间rem和外部存储空间rome或flash。其中ram或称之为内存&…

【Linux详解】命令行参数|环境变量

目录 一、命令行参数 二、环境变量 1.环境变量的基本概念 2.查看环境变量的方法 3.环境变量相关命令 4.环境变量的组织方式以及获取环境变量的三种方法 环境变量具有全局属性 一、命令行参数 【示例1】main函数也是函数,main函数可以带参吗? 没…

Python教程(二十) : 十分钟入门【PyQt6】

文章目录 专栏列表环境准备1 安装 Python2 安装 PyQt6 PyQt6 中的模块使用模块创建一个窗体: PyQt6 常用的控件1. QPushButton(按钮)2. QLabel(标签)3. QLineEdit(文本输入框)4. QTextEdit&…

(4)SVG-path中的椭圆弧A(绝对)或a(相对)

1、概念 表示经过起始点(即上一条命令的结束点),到结束点之间画一段椭圆弧 2、7个参数 rx,ry,x-axis-rotation,large-arc-flag,sweep-flag,x,y (1)和(2&a…

FFMpeg环境搭建(WIN10)

0、前期准备 软件环境:Win10 qtcreator 软件准备:MSYS2 安装包、 FFmpeg源码 1、软件安装 通过MSYS2安装编译工具 1、打开MSYS2安装包,一路next即可 (注:如果需要更改路径可以自行更改) 2、安装完成…

虚拟现实辅助工程技术助力多学科协同评估

在当今高速发展的经济环境中,制造业面临着多重挑战,包括提高产品性能、压缩设计周期、实现轻量化设计和降低成本。为了有效应对这些挑战,多学科协同评估成为缩短研发周期和提升研制质量的关键手段。 传统的多学科评估面临着数据孤立与融合困难…

Android 系统源码项目加载预编好的so库

Android 系统源码项目加载预编好的so库 文章目录 Android 系统源码项目加载预编好的so库一、前言二、源码中加载so1、Android.mk加载so加载so的主要相关代码: 2、Android.bp加载so(1)Android.mk使用源码命令编译成Android.bp(2&am…

Java灰度发布

有没有在北京面试java的小伙伴,每家公司面试问的问题都不一样,昨天面试官问到了灰度发布,一脸懵,好像在哪儿听说过,毕竟我都没发布过,之前都是项目组长在干这些事儿,所以聊聊,了解一…

驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结

前言 嘿,小伙伴们,今天我们来一场 Autofac 的学习之旅吧! Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 “魔法师”,用它来管理对象的生命周期,让你…

828华为云征文|华为云Flexus X实例docker部署最新gitlab社区版,搭建自己的私人代码仓库

828华为云征文|华为云Flexus X实例docker部署最新gitlab社区版,搭建自己的私人代码仓库 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Ng…

大数据采集迁移工具

Flume Sqoop kafka框架 MQ:消息队列 broker相当于服务器 消息队列

栈和队列(1)

空栈先移动栈顶再加数据,满栈先插入数据再移 栈的基本概念栈是一种后进先出(LIFO,Last In First Out)的数据结构。栈支持两种主要的操作:•压栈(Push):向栈中添加一个元素。•弹栈&…