pytorch系列教程(二)-数据预处理Dataset、DataLoader、Transform

前言

pytorch对于怎么样把数据放进神经网络训练有一套非常成熟的机制,我们只需要按照流程即可,这个流程只要是涉及了Dataset、DataLoader和Transform
这篇博客参考了:
(第一篇)pytorch数据预处理三剑客之——Dataset,DataLoader,Transform
(第二篇)pytorch数据预处理三剑客之——Dataset,DataLoader,Transform
(第三篇)pytorch数据预处理三剑客之——Dataset,DataLoader,Transform
  

步骤

还是拿前一篇文章的例子pytorch系列教程(一)-训练和测试模型流程来讲述如何把数据放到神经网络中训练的

#前一篇文章的代码
train_datasets = MyDataset()           # 第一步:构造Dataset对象
train_dataloader = DataLoader(train_datasets)# 第二步:通过DataLoader来构造迭代对象

以yolov1网络为例子,data/train.txt中的内容
在这里插入图片描述
下面来看看 MyDataset()中要做什么

 
import os
import torch
from torch.utils.data import Dataset, DataLoader
from PIL import Image
import cv2
import numpy as np
 
from torchvision.transforms import ToTensor
from torchvision import datasets, transforms
 
import random


class MyDataset()(Dataset):
    def __init__(self,transform):
        self.transform = transform
        self.img_list = []
        self.labels=np.zeros((7,7,5*NUM_BBOX+len(CLASSES)))
        
        #data/train.txt存放的是训练数据的路径
        with open("data/train.txt", 'r') as f: 
             #将训练数据的路径放到img_list中
             self.img_list = [x.strip() for x in f]
 
    def __getitem__(self, idx):
        ###################################
        #idx最大值为len(self.img_list)-1
        img = cv2.imread(self.img_list[idx])
        if self.transform:
          #将数据转成tensor
          img = self.transform(img)
          label= self.transform(label)
        return img,label

    def __len__(self):
        #返回训练数据的长度
        return len(self.img_list)

def main(): 
     transform=transforms.Compose([
                transforms.ToTensor()
            ])
     train_datasets = MyDataset(transform)           # 第一步:构造Dataset对象
     train_loader = DataLoader(train_dataset, batch_size=8, shuffle=True)# 第二步:通过DataLoader来构造迭代对象
     
if __name__ == '__main__':
     main()

  

总结

看完代码之后总结一下
1、构造一个类继承Dataset,例如 MyDataset(Dataset)。在类中
首先新建一个变量用来存放训练数据或者标签的路径,例如self.img_list
然后在类中重写 getitem(self, index)和__len__(self)

  • getitem(self, index)中主要做的是返回的img和label。这个img和label都已经是tensor形式
  • len(self)中主要做的是返回训练数据的总长度

  
Dataset详解
Dataset类是Pytorch中图像数据集中最为重要的一个类,也是Pytorch中所有数据集加载类中应该继承的父类。其中Dataset类中的两个私有成员函数必须被重载,否则将会触发错误提示:

  • def getitem(self, index):
  • def len(self):
  • def init(self):

构造函数一般情况下我们也是要自己定义的,但是不是强制性的。
其中__len__应该返回数据集的大小,而__getitem__应该编写支持数据集索引的函数,例如通过dataset[i]可以得到数据集中的第i+1个数据。这个Dataset抽象父类的定义如下:

class Dataset(object):
    def __getitem__(self, index):
        raise NotImplementedError
 
    def __len__(self):
        raise NotImplementedError
 
    def __add__(self, other):
        return ConcatDataset([self, other])

  
2、利用transforms.Compose添加图像变换
transforms中的图像变换操作大全

__all__ = ["Compose", "ToTensor", "ToPILImage", "Normalize", "Resize", "Scale", "CenterCrop", "Pad",
           "Lambda", "RandomApply", "RandomChoice", "RandomOrder", "RandomCrop", "RandomHorizontalFlip",
           "RandomVerticalFlip", "RandomResizedCrop", "RandomSizedCrop", "FiveCrop", "TenCrop", "LinearTransformation",
           "ColorJitter", "RandomRotation", "RandomAffine", "Grayscale", "RandomGrayscale"]

  
3、通过DataLoader来构造迭代对象
看一下DataLoader的定义

class DataLoader(object):
    __initialized = False
    def __init__(self, dataset, batch_size=1, shuffle=False, sampler=None, 
    def __setattr__(self, attr, val):
    def __iter__(self):
    def __len__(self):
    
Arguments:
        dataset (Dataset): 是一个DataSet对象,表示需要加载的数据集.
        batch_size (int, optional): 每一个batch加载多少组样本,即指定batch_size,默认是 1 
        shuffle (bool, optional): 布尔值True或者是False ,表示每一个epoch之后是否对样本进行随机打乱,默认是False

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你是在问 PyTorch 中的数据集和数据加载器,那么我很愿意为您解答。 PyTorch 是一个开源深度学习框架,其中包含了用于加载和预处理数据的工具。其中最重要的两个组件是数据集 (Dataset) 和数据加载器 (DataLoader)。 数据集是一个 PyTorch 类,它定义了如何读取数据、如何访问数据以及如何将数据转换为张量。您可以使用内置的数据集类,例如 torchvision.datasets 中的 ImageFolder,或者自定义数据集类。 数据加载器是一个 PyTorch 类,它可以从数据集中读取数据并将其批量加载到内存中。数据加载器可以进行并行加载,以提高加载速度,并且可以通过 shuffle 参数来随机打乱数据。 举个例子,如果您有一个图像数据集,您可以使用以下代码来创建数据集和数据加载器: ``` import torch import torchvision # 创建数据集 dataset = torchvision.datasets.ImageFolder(root='path/to/data', transform=transforms.ToTensor()) # 创建数据加载器 dataloader = torch.utils.data.DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4) ``` 然后,您可以使用以下代码来读取数据: ``` for inputs, labels in dataloader: # 处理输入数据 ... ``` 希望对您有所帮助! ### 回答2: PyTorch是一种广泛使用的深度学习框架,具有易于使用的API和优秀的性能。其中,DatasetDataLoader是两个非常重要的类,它们可以帮助我们有效地加载和处理数据。 Dataset是一个抽象的概念,用于表示一组数据。我们可以继承它并重写其中的方法,以实现对不同数据集的适配。在初始化时,我们需要传递一个数据集,比如说图片数据集,然后在DataLoader中使用这个数据集,实现数据的准备和加载。在自定义Dataset时,我们需要定义__getitem__和__len__两个方法,分别用于返回数据集中的某个数据和数据总数。 DataLoader是一个非常实用的工具,用于加载数据并把数据变成可迭代的对象,其中包含了批量大小、数据是否随机等设置。我们可以设置num_workers参数,用多个进程来读取数据提高读取数据的速度。通过使用DataLoader,我们可以很方便地迭代整个数据集,可以按批次加载和处理数据。 当我们使用在线学习时,经常需要不断地读取数据并进行训练。在应用中,我们会遇到许多不同的数据集,其中可能包含不同的数据类型,比如图像、音频、文本等。使用DatasetDataLoader类,我们可以轻松处理这些数据,从而使我们的深度学习应用具有更广泛的适用性和扩展性。 总之,DatasetDataLoaderPyTorch中非常重要的类,它们可以帮助我们非常方便地进行数据的处理和加载。无论你想要使用哪种数据集,它们都能够很好地适配。在实际应用中,我们可以灵活地使用这两个类来加载和准备数据并进行训练,从而加快应用的速度并提高深度学习的精度。 ### 回答3: PyTorch是一个流行的深度学习框架,它提供了DatasetDataLoader这两个类来帮助我们更方便地处理数据。 Dataset可以看作是一个数据集,它定义了如何读取数据。官方提供了两种Dataset:TensorDataset和ImageFolder。TensorDataset是用来处理张量数据,而ImageFolder则是用来处理图像数据。如果我们需要使用其他类型的数据,我们可以通过重写Dataset类中的__getitem__和__len__方法来实现。 在实现Dataset之后,我们需要将数据读取到内存中,在模型训练时提供给模型,这时我们就需要使用到DataLoader了。DataLoader可以看作是一个数据加载器,它会自动将Dataset中的数据批量读取到内存中,并且支持数据的分布式加载。 在使用DataLoader时我们可以设置很多参数,比如batch_size表示每个batch的大小,shuffle表示是否打乱数据顺序,num_workers表示使用多少线程读取数据等等。这些参数都可以帮助我们更好地利用硬件资源,提高训练速度和效率。 使用PyTorchDatasetDataLoader可以帮助我们更方便快捷地处理数据,并且让我们可以更专注于模型的设计和训练。但我们也要注意一些细节问题,比如数据读取是否正确、内存使用是否合理等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值