Pytorch 中 Dataset 和 DataLoader,以及 torchvision 的 datasets 完全理解

目录

  • 1、torch.utils.data.Dataset()
  • 2、torch.utils.data.Sampler()
  • 3、torch.utils.data.DataLoader()
  • 4、torchvision.datasets.ImageFolder()
  • 5、例子 torchvision.datasets.FashionMNIST()

1、torch.utils.data.Dataset()

首先最基础的,是 torch.utils.data.Dataset() (官方文档),它是 Pytorch 中表示数据集的抽象类,可以将其理解为如下:

class Dataset(object):def __getitem__(self, index):raise NotImplementedErrordef __len__(self):raise NotImplementedError
  • __getitem__() 方法通过索引返回数据集中选定的样本
  • __len__() 方法返回数据集的总大小(实际上没定义在抽象类中,而是在 Sampler 中)

可见抽象类中的两个方法都是还没实现的,所以如果想实际使用 Dataset,就必须继承这个抽象类,创建一个子类,改写这两个方法,例如:

class CustomDataset(torch.utils.data.Dataset):# Basic Instantiationdef __init__(self, ..., *args, **kwargs):...# Fetch an item from the Datasetdef __getitem__(self, index):...	# Length of the Datasetdef __len__(self):...

自定义数据集的具体例子可以看看这篇博客。

2、torch.utils.data.Sampler()

有了数据集之后,就需要从中采样数据,这就是 torch.utils.data.Sampler()(官方文档) 的作用,它是所有采样器的基类,可以将其理解如下:

class Sampler(object)def __init__(self, data_source):passdef __iter__(self):raise NotImplementedError
  • __iter__() 方法用于迭代数据集元素索引

从官方实现的各种 Sampler 的子类源代码中可以看出,__iter__() 方法实际上就是用 Python 中的 iter()next()yield 等迭代器和生成器的方法(详见这篇博客),基于数据集产生一个迭代器,可以迭代得到数据集上的样本。

3、torch.utils.data.DataLoader()

最后就是 torch.utils.data.DataLoader()(官方文档),它的作用就是:

Combines a dataset and a sampler, and provides an iterable over the given dataset

结合一个 Dataset 和一个 Sampler,然后返回一个该数据集上的可迭代对象。当然它还可以指定 Batch_size,以及支持多进程等等。

4、torchvision.datasets.ImageFolder()

首先介绍下 torchvision 包,它和 torch 一样都归属于 Pytorch 深度学习框架,torchvision 是由常用数据集、模型架构和用于计算机视觉的常见图像转换所组成的。

torchvision.datasets 模块(官方文档)既有官方提供的数据集,也有自定义数据集的类,它们都是 torch.utils.data.Dataset子类,因此可以直接输入到 torch.utils.data.DataLoader 中。

官方提供的数据集如:torchvision.datasets.MNIST()torchvision.datasets.FashionMNIST()torchvision.datasets.ImageNet() 等等;

自定义的数据集类有三个,最常用的是 torchvision.datasets.ImageFolder(),它继承自 torchvision.datasets.DatasetFolder(),后者又继承自 torchvision.datasets.VisionDataset(),VisionDataset 则是 torch.utils.data.Dataset 的子类。传入 ImageFolder 的 root 路径参数,里面的子文件夹对应类别名,然后类别名文件夹里面就存放有该类别的图片,如下:

 root
├── orange
│   ├── orange_image1.png
│   └── orange_image1.png
├── apple
│   └── apple_image1.png
│   └── apple_image2.png
│   └── apple_image3.png

5、例子 torchvision.datasets.FashionMNIST()

首先是导入库:

# imports 导入各种库
import matplotlib.pyplot as plt
import numpy as npimport torch
import torchvision
import torchvision.transforms as transforms

然后就可以直接使用官方提供的数据集了,其中有许多参数,如存放的路径、作为训练集还是测试集、如何数据增强等等:

train_set = torchvision.datasets.FashionMNIST( root='./data' ,train=True ,download=True ,transform=transforms.Compose([ transforms.ToTensor() ]) 
)

得到数据集之后,就可以输入到 DataLoader 中,它也有很多参数,如批量大小、是否打乱、使用 CPU 的进程数等等:

train_loader = torch.utils.data.DataLoader(train_set ,batch_size=4,shuffle=True 
)

此时,train_loader 就是一个可迭代对象,我们既可以先用 iter() 将其变成迭代器再用 next() 逐个批次进行迭代,例如:

在这里插入图片描述

next() 返回的一个批次大小为 4,包含图像数据和标签数据,对图像进行可视化如下:

在这里插入图片描述

也可以直接 for 循环进行迭代,如:

for batch_idx, samples in enumerate(train_loader):print(batch_idx, samples)

更具体的例子可以看看这篇博客。

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

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

相关文章

蓝桥杯-成绩分析-编程题

一:题目 二&#xff1a;上码 #include<bits/stdc.h> using namespace std;int main() {int n;cin >> n;vector<int> v(n,0);for (int i 0; i < n; i) {cin >> v[i];}sort(v.begin(),v.end());double sum accumulate(v.begin(),v.end(),0);double…

BeetleX框架详解-小结

到这里BeetleX组件代码讲解完成了&#xff0c;由于组件只封装了TCP基础通讯的功能&#xff0c;因此在内容上并不会有太多&#xff1b;通以上内容相信对BeetleX的设计有一定的了解&#xff0c;在使用上也更加容易。要点Socket对象应用SocketAsyncEventArgs对象应用线程池的应用与…

深度学习入门笔记 —— 循环神经网络 RNN

首先&#xff0c;明确 RNN 的主要任务是用于文本分类&#xff0c;而解决文本分类任务最经典的模型是词袋模型&#xff08;Bag-of-Words Model&#xff09;&#xff0c;如图所示&#xff0c;输入是三个句子&#xff0c;词袋模型首先要定义一个词汇表 vocabulary&#xff0c;里面…

深圳店匠笔试题-4.01

一:题目类型 10个选择10个填空2道编程题 二&#xff1a;编程题 1&#xff1a;34 在排序数组中查找元素的第一个和最后一个位置 class Solution { public:/**思路:1.分为两种情况 那就是该元素是存在于排序数组当中,该元素不存在该排序数组当中。2.如果元素是存在于排序数组当…

进击吧! Blazor !第二期 回顾

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

蓝桥杯-长草-代码(BFS)

一:题目 题目描述 小明有一块空地&#xff0c;他将这块空地划分为 nn 行 mm 列的小块&#xff0c;每行和每列的长度都为 1。 小明选了其中的一些小块空地&#xff0c;种上了草&#xff0c;其他小块仍然保持是空地。 这些草长得很快&#xff0c;每个月&#xff0c;草都会向外…

Pytorch 中 LSTM 和 LSTMCell 的区别

LSTM 的官方文档在这里 在例子中&#xff1a; LSTM 函数的参数为输入特征向量的长度 input_size 10、隐藏层向量的长度 hidden_size 20、隐藏层的数量 num_layers 2&#xff1b; 输入 input 的维度是时间/序列长度&#xff08;句子有多少个单词&#xff09; time_steps 5、…

程序员修神之路--缓存架构不够好,系统容易瘫痪

“灵魂拷问缓存能大幅度提高系统性能&#xff0c;也能大幅度提高系统瘫痪几率怎么样防止缓存系统被穿透&#xff1f;缓存的雪崩是不是可以完全避免&#xff1f;前几篇文章我们介绍了缓存的优势以及数据一致性的问题&#xff0c;在一个面临高并发系统中&#xff0c;缓存几乎成了…

Magicodes.IE之花式导出

总体设计Magicodes.IE是一个导入导出通用库&#xff0c;支持Dto导入导出以及动态导出&#xff0c;支持Excel、Word、Pdf、Csv和Html。在本篇教程&#xff0c;笔者将讲述如何使用Magicodes.IE进行花式导出。在本篇教程&#xff0c;笔者主要讲述如何使用IE进行花式导出并满足客户…

京东笔试4.2-19:00随笔

30道选择考察到了数据结构&#xff0c;计网&#xff0c;linux,数据库&#xff0c;java基础&#xff0c;就记得这些了 两道编程题 一道二叉树 一道 动态规划 一道也没AC出来 第一道需要会做的前提是 需要创建二叉树 并给其赋值 然后再谈算法 因为一直刷leetcode&#xff0c;转换…

我又踩坑了!如何为HttpClient请求设置Content-Type标头?

最近在重构认证代码&#xff0c;认证过程相当常规&#xff1a;POST /open-api/v1/user-info?client_id&timstamp&rd12345&sign***&methodhmac content-type: application/json payload: { "token":"AA2917B0-C23D-40AB-A43A-4C4B61CC7C74&qu…

利用数组创建二叉树并赋值

1:二叉树的创建与赋值 (1):前言知识 这里的创建是利用层序序列进行创建,主要就是根节点的坐标为i 的话 那么左节点的坐标为 2i1,右节点的坐标为2i2;开辟一个结构体 struct Node {int val;Node * left;Node * right;Node () : val(-1),left(NULL),right(NULL) {};Node(int x)…

2020 中国开源年会(COSCon'20)再启程:开源向善(Open Source for Good)

中国开源年会COSCon2020正式启动&#xff01;*本图由开源社设计组叶凯设计时间&#xff1a;2020年10月24-25日线上直播地址&#xff1a;bilibili & Youtube讲师互动平台&#xff1a;Zoom时间弹指飞逝&#xff0c;转眼即过去了一年。不知道各位在这多舛的半年间又和开源这二…

使用Azure Functions玩转Serverless

Serverless&Azure Functions通过无服务器计算&#xff0c;开发者无需管理基础结构&#xff0c;从而可以更快构建应用程序。通过无服务器应用程序&#xff0c;将由云服务提供商自动预配、缩放和管理运行代码所需的基础结构。要理解无服务器计算的定义&#xff0c;注意到服务…

java并发之初识

一:并发编程的难点 1:原子性问题 操作系统做任务切换,可以发生在任何一条CPU指令执行完成后&#xff1b;CPU能保证的原子操作是指令级别的&#xff0c;而不是高级语言的操作符&#xff1b; n不是原子操作的&#xff0c;而是3条指令 2:可见性问题 可见性是指一个线程对一个…

java并发之synchronized实现原理及其优化

1:synchronnized概述 synchronized修饰的方法或代码块相当于并发中的临界区&#xff0c;即在同一时刻jvm只允许一个线程进入执行。synchronized是通过锁机制实现同一时刻只允许一个线程来访问共享资源的。另外synchronized锁机制还可以保证线程并发运行的原子性&#xff0c;有…

.NET 是信息技术应用创新产业重要参与者

今天是国庆节&#xff0c;也是中秋节&#xff0c;月满中秋&#xff0c;举国欢庆&#xff0c;在这里祝各位开发者中秋国庆快乐。放假在家就想把这几年对于.NET发展相关生态做个梳理&#xff0c;写一篇文章来总结一下这两年从腾讯出来自己创业&#xff0c;推动.NET在国内的应用的…

蓝桥杯- 包子凑数

一:题目 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有 NN 种蒸笼&#xff0c;其中第 ii 种蒸笼恰好能放 A_iA i ​ 个包子。每种蒸笼都有非常多笼&#xff0c;可以认为是无限笼。 每当有顾客想买 XX 个包子&#xff0c;卖包子的大叔就会迅速选出若…

秋天 | 等疫情过后,我们继续背起相机去旅行

这是头哥侃码的第218篇原创2020年&#xff0c;注定是不平凡的一年。八个月前&#xff0c;我正和家人一起沉浸在春节的喜悦中&#xff0c;可没成想一场疫情的到来彻底改变了欢快的气氛。别的倒没什么&#xff0c;只是之前所有的计划全部被打乱了。先说春节假期&#xff0c;和舅舅…

简单理解CAP-BASE

1、CAPCAP是分布式系统的指导理论&#xff0c;是NoSQL数据库的理论基石。CAP其实就是对分布式系统的特性总结&#xff0c;即一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;、分区容错性&#xff08;Partition tolerance&#xff09;。…