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 中的  Dataset 类了。

from torch.utils.data import Dataset

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

这里我们还是举个例子:

从这个例子可以看出  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类的话可不可以呢, 经过尝试发现还真可以,如下:

又如:

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

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

原文地址:https://www.cnblogs.com/devilmaycry812839668/p/10122148.html

时间: 2024-11-10 13:56:58

PyTorch 数据集类 和 数据加载类 的一些尝试的相关文章

arcgis python 使用光标和内存中的要素类将数据加载到要素集

使用光标和内存中的要素类将数据加载到要素集 import arcpy arcpy.env.overwriteOutput = True arcpy.ImportToolbox("http://flame7/arcgis/services;BufferByVal", "servertools") # List of coordinates coordinates = [[-117.196717216, 34.046944853], [-117.186226483, 3

java动态加载类和静态加载类笔记

JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class office { public static void main(String args[]) { if("word".equals(args[0]) { word w=new word(); word.run(); } if("excel".equals(args[0]) {

PyTorch 训练前对数据加载、预处理

参考:pytorch torchvision transform官方文档 Pytorch学习--编程实战:猫和狗二分类 深度学习框架PyTorch一书的学习-第五章-常用工具模块 # coding:utf8 import os from PIL import Image from torch.utils import data import numpy as np from torchvision import transforms as T class DogCat(data.Dataset)

Unity3d通用工具类之数据配置加载类

今天,我们来讲讲游戏中的数据配置加载. 什么是游戏数据加载呢?一般来说游戏中会有场景地图. 按照国际惯例,先贴一张游戏场景的地图: 在这张地图上,我们可以看到有很多正六边形,正六边形上有树木.岩石等. 哎!那么问题也就来了.大家会思考这张地图怎么啦.关游戏数据配置有什么关系?我们做好场景直接loding进来不就行了? 这也就是问题所在,如果你是直接loding进场景有很多问题: 1.场景是死的.只能是这个做好的场景.如果你想删除一些正六边形,想改变一些树木的位置,如何完成.有人会想,那我再做一个

final,类的自动加载,命名空间

final是干什么的一般是为了防止父类的一个方法被重写如果父类中的方法被声明为 final,则子类无法覆盖该方法.如果一个类被声明为 final,则不能被继承. Note: 属性不能被定义为 final,只有类和方法才能被定义为 final. 类的自动加载类的自动加载是指,在外面的页面中,并不需要去"引入"类文件,但是程序会在需要的时候动态加载需要的类文件. spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(in

[javaSE] 反射-动态加载类

Class.forName(“类的全称”) ①不仅表示了类的类类型,还代表了动态加载类 ②请大家区分编译,运行 ③编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 Ⅰ所有的new对象都是静态加载类 在编译的时刻就要去检测该类是否存在,如果不存在,编译失败. //对于这种情况,静态加载不适用,因为我们需要根据输入来确定加载哪个类 package com.tsh.reflect; class ReflectLoadDemo { public static void main(String[]

Java-反射之动态加载类

在Java当中,加载类分为动态加载和静态加载,其中,在编译时刻加载类叫做静态加载类,在运行时刻加载类叫做动态加载类. 产生Class对象的方式中,有一个是Class.forName("类的全称"),这个不仅仅表示类的类类型,而且还表示了动态加载类. 1 package com.example.demo; 2 3 public class Demo { 4 public static void main(String[] args) { 5 if (args[0].equals(&quo

Java 编程下使用 Class.forName() 加载类【转】

在一些应用中,无法事先知道使用者将加载什么类,而必须让使用者指定类名称以加载类,可以使用 Class 的静态 forName() 方法实现动态加载类.下面的范例让你可以指定类名称来获得类的相关信息. package cn.sunzn.demo; public class ClassDemo { public static void main(String[] args) { try { Class c = Class.forName(args[0]); System.out.println("类

Java的类类型和类的动态加载

有如下简化代码: 准备知识: Student judy = new Student; Class s1 = Student.class; Class s2 = judy.getClass(); Class s3 = null; s3 = Class.forName("com.Student"); 这里s1, s2, s3都是类类型 new创建对象是静态加载类,在编译时刻就需要加载所有的可能用到的类. 动态加载类的例子: 1 // OfficeAble.java2 interface O