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

PyTorch数据集类和数据加载类的一些尝试

最近在学习PyTorch, 但是对里面的数据类和数据加载类比较迷糊,可能是封装的太好大部分情况下是不需要有什么自己的操作的,不过偶然遇到一些自己导入的数据时就会遇到一些问题,因此自

最近在学习PyTorch,  但是对里面的数据类和数据加载类比较迷糊,可能是封装的太好大部分情况下是不需要有什么自己的操作的,不过偶然遇到一些自己导入的数据时就会遇到一些问题,因此自己对此做了一些小实验,小尝试。

 

 

下面给出一个常用的数据类使用方式:

def data_tf(x):
    x = np.array(x, dtype='float32') / 255 # 将数据变到 0 ~ 1 之间
    x = (x - 0.5) / 0.5 # 标准化,这个技巧之后会讲到
    x = x.reshape((-1,)) # 拉平
    x = torch.from_numpy(x)
    return x



from torchvision.datasets import MNIST # 导入 pytorch 内置的 mnist 数据
train_set = MNIST('./data', train=True, transform=data_tf, download=True) # 载入数据集,申明定义的数据变换
test_set = MNIST('./data', train=False, transform=data_tf, download=True)

 

 

其中,  data_tf  并不是必须要有的,比如:

from torchvision.datasets import MNIST # 导入 pytorch 内置的 mnist 数据
train_set = MNIST('./data', train=True, download=True) # 载入数据集,申明定义的数据变换
test_set = MNIST('./data', train=False, download=True)

这里面的MNIST类是框架自带的,可以自动下载MNIST数据库,   ./data  是指将下载的数据集存放在当前目录下的哪个目录下,    train 这个属性 True时 则在 ./data文件夹下面在建立一个 train的文件夹然后把下载的数据存放在其中,  当train属性是False的时候则把下载的数据放在 test文件夹下面。   

划线部分是老版本的PyTorch的处理方式,  最近试了一下最新版本  PyTorch 1.0   ,   train为True的时候是把数据放在  ./data/processed  文件夹下面, 命名为training.pt  ,  为False 的时候则放在  ./data/processed  文件夹下面, 命名为test.pt  。

 

PyTorch   数据集类  和   数据加载类     的一些尝试

 

PyTorch   数据集类  和   数据加载类     的一些尝试

 

 

 

 

这时候就出现了一个问题, 如果你使用的数据集不是框架自带的那么如何使用数据类呢,这个时候就要使用  pytorch 中的  Dataset 类了。

from torch.utils.data import Dataset

我们需要重写   Dataset类, 需要实现的方法为  __len__   和   __getitem__    这两个内置方法,  这里可以看出其思想就是要重写的类需要支持按照索引查找的方法。

 

 

 

 

这里我们还是举个例子:

PyTorch   数据集类  和   数据加载类     的一些尝试

 

 

PyTorch   数据集类  和   数据加载类     的一些尝试

 

PyTorch   数据集类  和   数据加载类     的一些尝试

 

PyTorch   数据集类  和   数据加载类     的一些尝试

从这个例子可以看出  mydataset就是我们自定义的 myDataset 类生成的自定义数据类对象。我们可以在myDataset类中自定义一些方法来对需要的数据进行处理。

为说明该问题另附加一个例子:

from torch.utils.data import Dataset


#需要在pytorch中使用的数据
data=[[1.1, 1.2, 1.3], [2.1, 2.2, 2.3], [3.1, 3.2, 3.3], [4.1, 4.2, 4.3], [5.1, 5.2, 5.3]]


class myDataset(Dataset):
    def __init__(self, indata):
        self.data=indata
    def __len__(self):
        return len(self.data)
    def __getitem__(self, idx):
        return self.data[idx]


mydataset=myDataset(data)

 

 

那么又来了一个问题,我们不重写 Dataset类的话可不可以呢, 经过尝试发现还真可以,如下:

 PyTorch   数据集类  和   数据加载类     的一些尝试

 

 

 

又如:

PyTorch   数据集类  和   数据加载类     的一些尝试

 

PyTorch   数据集类  和   数据加载类     的一些尝试

 

PyTorch   数据集类  和   数据加载类     的一些尝试

 

PyTorch   数据集类  和   数据加载类     的一些尝试

由这个例子可以看出数据类对象可以不重写Dataset类, 只要具备  __len__      __getitem__    方法就可以。而且从这个例子我们可以看出  DataLoader  是一个迭代器, 如果shuffle 设置为 True 那么在每次迭代之前都会重新排序。

同时由上面两个例子可以看出  DataLoader类会把传入的数据集合中的数据转化为  torch.tensor 类型, 当然是采用默认的  DataLoader类中转化函数 transform的情况下。

这也就是说  DataLoader 默认的转化函数 transform操作为    传入的[ [x, x, x], [y, y, y] ] 输出的是 [ tensor([x, x, x]),  tensor([y, y, y]) ] ,

传入的是  tensor([ [x, x, x], [y, y, y] ]) 输出的是 tensor([ tensor([x, x, x]),  tensor([y, y, y]) ] ),   (这个例子是在   batch_size=2 的情况)。

 

 

 

综上,可知  其实   Dataset类, 和 DataLoader类其实在pytorch 计算过程中都不是一定要有的,  其中Dataset类是起一个规范作用,意义在于要人们对不同的类型数据做一些初步的调整,使其支持按照索引读取,以使其可以在 DataLoader中使用。

DataLoader 是一个迭代器, 可以方便的通过设置 batch_size 来实现 batch过程,transform则是对数据的一些处理。

 

 

 

 

---------------------------------------------------------------------------------------------------

 

上述内容更正:

 

import torch
import numpy as np
from torch.utils.data import Dataset
from torch.utils.data import DataLoader


#需要在pytorch中使用的数据
data=[[1.1, 1.2, 1.3], [2.1, 2.2, 2.3], [3.1, 3.2, 3.3], [4.1, 4.2, 4.3], [5.1, 5.2, 5.3]]

class myDataset(Dataset):
    def __init__(self, indata):
        self.data=indata
    def __len__(self):
        return len(self.data)
    def __getitem__(self, idx):
        return self.data[idx]


mydataset=myDataset(data)
train_data=DataLoader(mydataset, batch_size=3, shuffle=True)

print("上文的错误操作:")

for i in train_data:
    print(i)
    print('-'*30)
print('again')
for i in train_data:
    print(i)
    print('-'*30)


#########################################


data=np.array(data)
data=torch.from_numpy(data)


mydataset=myDataset(data)
train_data=DataLoader(mydataset, batch_size=3, shuffle=True)


print("修正后的正确操作:")

for i in train_data:
    print(i)
    print('-'*30)
print('again')
for i in train_data:
    print(i)
    print('-'*30)

 

 

 

(base) devil@devilmaycry:/tmp$ python w.py 
上文的错误操作:
[tensor([3.1000, 4.1000, 5.1000], dtype=torch.float64), tensor([3.2000, 4.2000, 5.2000], dtype=torch.float64), tensor([3.3000, 4.3000, 5.3000], dtype=torch.float64)]
------------------------------
[tensor([1.1000, 2.1000], dtype=torch.float64), tensor([1.2000, 2.2000], dtype=torch.float64), tensor([1.3000, 2.3000], dtype=torch.float64)]
------------------------------
again
[tensor([3.1000, 5.1000, 1.1000], dtype=torch.float64), tensor([3.2000, 5.2000, 1.2000], dtype=torch.float64), tensor([3.3000, 5.3000, 1.3000], dtype=torch.float64)]
------------------------------
[tensor([2.1000, 4.1000], dtype=torch.float64), tensor([2.2000, 4.2000], dtype=torch.float64), tensor([2.3000, 4.3000], dtype=torch.float64)]


------------------------------

修正后的正确操作: tensor([[
2.1000, 2.2000, 2.3000], [1.1000, 1.2000, 1.3000], [3.1000, 3.2000, 3.3000]], dtype=torch.float64) ------------------------------ tensor([[4.1000, 4.2000, 4.3000], [5.1000, 5.2000, 5.3000]], dtype=torch.float64) ------------------------------ again tensor([[5.1000, 5.2000, 5.3000], [4.1000, 4.2000, 4.3000], [3.1000, 3.2000, 3.3000]], dtype=torch.float64) ------------------------------ tensor([[2.1000, 2.2000, 2.3000], [1.1000, 1.2000, 1.3000]], dtype=torch.float64) ------------------------------

 

可以看出  传入到   Dataset  中的对象必须是  torch  类型的 tensor  类型, 如果传入的是list则会得出错误结果。

 

 

 

-----------------------------------------------------------------------------------------------------

 

 

补充:

之所以发现上面的这个错误,是因为发现了下面的代码:

import numpy as np
from torchvision.datasets import mnist # 导入 pytorch 内置的 mnist 数据
from torch.utils.data import DataLoader
#from torch.utils.data import Dataset


def data_tf(x):
    x = np.array(x, dtype='float32') / 255
    x = (x - 0.5) / 0.5 # 数据预处理,标准化
    x = x.reshape((-1,)) # 拉平
    x = torch.from_numpy(x)
    return x


#Dataset
# 重新载入数据集,申明定义的数据变换
train_set = mnist.MNIST('./data', train=True, transform=data_tf, download=True)
test_set = mnist.MNIST('./data', train=False, transform=data_tf, download=True)


train_data = DataLoader(train_set, batch_size=64, shuffle=True)
test_data = DataLoader(test_set, batch_size=128, shuffle=False)

 

从上面的   data_tf  函数中我们发现,  Dataset对象返回的是   torch 的  tensor 对象。

 


推荐阅读
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 逻辑回归_训练二元分类器#训练一个二元分类器fromsklearn.linear_modelimportLogisticRegressionfromsklearnimport ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
author-avatar
拍友2502906483
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有