热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mnisttorch加载fashion_PyTorch中文手册(4)数据的加载和预处理

PyTorch通过torch.utils.data(包)对一般常用的数据加载进行了封装,可以很容易地实现多线程数据预读和批量加载。并且to

PyTorch通过torch.utils.data(包)对一般常用的数据加载进行了封装,可以很容易地实现多线程数据预读和批量加载。 并且torchvision已经预先实现了常用图像数据集,包括前面使用过的CIFAR-10,ImageNet、COCO、MNIST、LSUN等数据集,可通过torchvision.datasets方便的调用

注:torch和torchvision是两个包

Dataset:将数据转化成Dataset类实现更好的读取和处理

Dataset是一个抽象类,为了能够方便的读取,需要将要使用的数据包装为Dataset类。 自定义的Dataset需要继承它并且实现两个成员方法:

  1. __getitem__() 该方法定义用索引(0 到 len(self))获取一条数据或一个样本
  2. __len__() 该方法返回数据集的总长度

注:抽象类和接口类。抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化。意义:如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。

下面我们使用kaggle上的一个竞赛bluebook for bulldozers自定义一个数据集,为了方便介绍,我们使用里面的数据字典来做说明(因为条数少)

import torch
from torch.utils.data import Dataset # 导入抽象类Dataset
import pandas as pd # 本质是使用pandas进行处理,只是相当于进行了封装。# 定义一个数据集
class BulldozerDataset(Dataset):""" 数据集演示 """def __init__(self, csv_file):# 实现初始化方法,在初始化的时候将数据读载入# 数据保存在self.df中self.df=pd.read_csv(csv_file)def __len__(self): # 本质替换定义了len()函数的作用# 返回df的长度return len(self.df)def __getitem__(self, idx): # 本质定义了替换iloc[]的作用# 根据 idx 返回一行数据return self.df.iloc[idx].SalePrice

至此,我们的数据集已经定义完成了,我们可以实例化一个对象访问它。

ds_demo= BulldozerDataset('median_benchmark.csv') #传入一个.csv文件

我们可以直接使用如下命令查看数据集数据

#实现了 __len__ 方法所以可以直接使用len获取数据总数
len(ds_demo)
------------------
11573
------------------
#用索引可以直接访问对应的数据,对应 __getitem__ 方法
ds_demo[0]
------------------
24000.0
------------------

自定义的数据集已经创建好了,下面我们使用官方提供的数据载入器,读取数据

Dataloader

DataLoader为我们提供了对Dataset的读取操作,常用参数有:batch_size(每个batch的大小)、 shuffle(是否进行shuffle操作)、 num_workers(加载数据的时候使用几个子进程)。下面做一个简单的操作

dl = torch.utils.data.DataLoader(ds_demo, batch_size=10, shuffle=True, num_workers=0)
# DataLoader返回的是一个可迭代对象,我们可以使用迭代器分次获取数据
# DataLoader本质是一个类,用来实现复杂的函数功能和其他功能
# .csv(原始数据)--->ds_demo(Dataset类对象)--->dl(DataLoader类对象)idata=iter(dl) # iter() 迭代函数
print(next(idata))# 更常见的用法是使用for循环对其进行遍历
for i, data in enumerate(dl):print(i,data)# 为了节约空间,这里只循环一遍break
----------------------------
0 tensor([24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000., 24000.,24000.], dtype=torch.float64)
# 第一个维度是batch_size==10,每一个元素其实是一个实际的数据
----------------------------

我们已经可以通过dataset定义数据集,并使用Datalorder载入和遍历数据集。除了这些以外,PyTorch还提供能torchvision的计算机视觉扩展包。

torchvision 包

torchvision 是PyTorch中专门用来处理图像的库。

torchvision.datasets:pytorch官方的图片数据集

torchvision.datasets 可以理解为PyTorch团队自定义的dataset,这些dataset帮我们提前处理好了很多的图片数据集,我们拿来就可以直接使用:

  • MNIST
  • COCO
  • Captions
  • Detection
  • LSUN
  • ImageFolder
  • Imagenet-12
  • CIFAR
  • STL10
  • SVHN
  • PhotoTour 我们可以直接使用,示例如下:

import torchvision.datasets as datasets
trainset = datasets.MNIST(root='./data', # 表示 MNIST 数据的加载的目录train=True, # 表示是否加载数据库的训练集,false的时候加载测试集download=True, # 表示是否自动下载 MNIST 数据集transform=None) # 表示是否需要对数据进行预处理,none为不进行预处理

torchvision.models:提供常见的训练好的模型

可以加载之后,直接使用,或者在进行迁移学习 torchvision.models模块的 子模块中包含以下模型结构。

  • AlexNet
  • VGG
  • ResNet
  • SqueezeNet
  • DenseNet

# 我们直接可以使用训练好的模型,当然这个与datasets相同,都是需要从服务器下载的
import torchvision.models as models
resnet18 = models.resnet18(pretrained=True) # 调用的是定义的函数来生成模型,模型类的定义还是大写

torchvision.transforms

transforms 模块提供了一般的图像转换操作类,用作数据处理和数据增强

from torchvision import transforms as transforms
transform = transforms.Compose([transforms.RandomCrop(32, padding=4), # 先四周填充0,在把图像随机裁剪成32*32transforms.RandomHorizontalFlip(), # 图像一半的概率翻转,一半的概率不翻转transforms.RandomRotation((-45,45)), # 随机旋转transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.229, 0.224, 0.225)), # R,G,B每层的归一化用到的均值和方差
])

肯定有人会问:(0.485, 0.456, 0.406), (0.2023, 0.1994, 0.2010) 这几个数字是什么意思?

官方的这个帖子有详细的说明: https://discuss.pytorch.org/t/normalization-in-the-mnist-example/457/21 这些都是根据ImageNet训练的归一化参数,可以直接使用,我们认为这个是固定值就可以。



推荐阅读
  • 一、死锁现象与递归锁进程也是有死锁的所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
author-avatar
手机用户2602917083
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有