pytorch中的dataloader使用方法详解

 更新时间:2023年11月04日 09:34:02   作者:惊瑟  
这篇文章主要介绍了pytorch中的dataloader使用方法详解,构建自己的dataloader是模型训练的第一步,本篇文章介绍下pytorch与dataloader以及与其相关的类的用法,需要的朋友可以参考下

pytorch中的dataloader使用方法详解

DataLoader类中有一个必填参数为dataset,因此在构建自己的dataloader前,先要定义好自己的Dataset类。这里先大致介绍下这两个类的作用:

  • Dataset:真正的“数据集”,它的作用是:只要告诉它数据在哪里(初始化),就可以像使用iterator一样去拿到数据,继承该类后,需要重载__len__()以及__getitem__
  • DataLoader:数据加载器,设置一些参数后,可以按照一定规则加载数据,比如设置batch_size后,每次加载一个batch_siza的数据。它像一个生成器一样工作。

有小伙伴可能会疑惑,自己写一个加载数据的工具似乎也没有多“困难”,为何大费周章要继承pytorch中类,按照它的规则加载数据呢?

总结一下就是:

  • 当数据量很大的时候,单进程加载数据很慢
  • 一次全加载过来,会占用很大的内存空间(因此dataloader是一个生成器,惰性加载)
  • 在进行训练前,往往需要一些数据预处理或数据增强等操作,pytorch的dataloader已经封装好了,避免了重复造轮子

使用方法

两步走:

  1. 定义自己的Dataset类,具体要做的事:
    • 告诉它去哪儿读数据,并将数据resize为统一的shape(可以思考下为什么呢)
    • 重写__len__()以及__getitem__,其中__getitem__中要确定自己想要哪些数据,然后将其return出来。
  2. 将自己的Dataset实例传到Dataloder中并设置想要的参数,构建自己的dataloader

下面简单加载一个目录下的图片以及label:

import os
import numpy as np

from torch.utils.data.dataset import Dataset
from torch.utils.data.dataloader import DataLoader
import cv2

# Your Data Path
img_dir = '/home/jyz/Downloads/classify_example/val/骏马/'
anno_file = '/home/jyz/Downloads/classify_example/val/label.txt'


class MyDataset(Dataset):
    def __init__(self, img_dir, anno_file, imgsz=(640, 640)):
        self.img_dir = img_dir
        self.anno_file = anno_file
        self.imgsz = imgsz
        self.img_namelst = os.listdir(self.img_dir)

    # need to overload
    def __len__(self):
        return len(self.img_namelst)

    # need to overload
    def __getitem__(self, idx):
        with open(self.anno_file, 'r') as f:
            label = f.readline().strip()
        img = cv2.imread(os.path.join(img_dir, self.img_namelst[idx]))
        img = cv2.resize(img, self.imgsz)
        return img, label


dataset = MyDataset(img_dir, anno_file)
dataloader = DataLoader(dataset=dataset, batch_size=2)

# display
for img_batch, label_batch in dataloader:
    img_batch = img_batch.numpy()
    print(img_batch.shape)
    # img = np.concatenate(img_batch, axis=0)
    if img_batch.shape[0] == 2:
        img = np.hstack((img_batch[0], img_batch[1]))
    else:
        img = np.squeeze(img_batch, axis=0)  # 最后一张图时,删除第一个维度
    print(img.shape)
    cv2.imshow(label_batch[0], img)
    cv2.waitKey(0)

上面是一次加载两张图片,效果如下:

在这里插入图片描述

其实从这里可以看出,为什么要在Dataset中将数据resize为统一的shape。因为dataloader加载数据时,将一个batch_size的数据拼接成一个大的tensor,如果shape不同,就无法拼接了。

就像这两张图片加入shape不一样就无法通过拼接的方式show出来一样。

结论

  • 使用pytorch的dataloader,需要先构建自己的Dataset
  • 构建自己的Dataset,需要重载__len__()以及__getitem__

到此这篇关于pytorch中的dataloader使用方法详解的文章就介绍到这了,更多相关pytorch的dataloader使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python Matplotlib绘制箱线图的全过程

    Python Matplotlib绘制箱线图的全过程

    又称箱形图(boxplot)或盒式图,数据大小、占比、趋势等等的呈现其包含一些统计学的均值、分位数、极值等等统计量,因此该图信息量较大,下面这篇文章主要给大家介绍了关于Python Matplotlib绘制箱线图的相关资料,需要的朋友可以参考下
    2021-09-09
  • R语言属性知识点总结及实例

    R语言属性知识点总结及实例

    在本篇文章里小编给大家整理了一篇关于R语言属性知识点总结及实例内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • 利用Python进行异常值分析实例代码

    利用Python进行异常值分析实例代码

    数据挖掘工作中的第一步就是异常值检测,异常值的存在会影响实验结果。下面这篇文章主要给大家介绍了关于利用Python进行异常值分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • 卡尔曼滤波数据处理技巧通俗理解及python实现

    卡尔曼滤波数据处理技巧通俗理解及python实现

    这篇文章主要为大家介绍了卡尔曼滤波数据处理技巧的通俗理解及python实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python爬虫框架Scrapy基本应用学习教程

    python爬虫框架Scrapy基本应用学习教程

    这篇文章主要为大家介绍了python爬虫框架Scrapy的基本应用学习教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Python学习之线程池与GIL全局锁详解

    Python学习之线程池与GIL全局锁详解

    本文我们将学习线程池的创建与全局锁。线程池的创建于进程池的原理是相同的;关于GIL全局锁,暂时没有代码上的练习,而是对其概念进行一个简单的启蒙,感兴趣的可以了解一下
    2022-04-04
  • 基于django micro搭建网站实现加水印功能

    基于django micro搭建网站实现加水印功能

    这篇文章主要介绍了基于django micro搭建网站实现加水印功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python中2种常用数据可视化库Bokeh和Altair使用示例详解

    Python中2种常用数据可视化库Bokeh和Altair使用示例详解

    本文对Python中两个常用的数据可视化库 Bokeh 和 Altair 进行了比较和探讨,通过对它们的特点、优缺点以及使用示例的详细分析,读者可以更好地了解这两个库的功能和适用场景,从而更好地选择合适的库来进行数据可视化工作,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • 浅析Python的命名空间与作用域

    浅析Python的命名空间与作用域

    这篇文章主要介绍了Python的命名空间与作用域的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-11-11
  • python中对正则表达式re包的简单引用方式

    python中对正则表达式re包的简单引用方式

    这篇文章主要介绍了python中对正则表达式re包的简单引用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论