pytorch数据预处理——1. HDF5文件(.h5)

本专题主要是解决Pytorch框架下项目的数据预处理工作
Table of Contents:
     1. HDF5文件简介
     2. Python中的_, __, __xx__区别
     3. Dataset类
     4. DataLoader类

1. HDF5简介

1.1 定义

  • 层次性数据格式第五版(Hierarchical Data Format Version 5, HDF5)是一种存储相同类型数值大数组的机制,适用于可被层次性组织且数据集需要被元数据标记的数据模型。简单地说,就是HDF5可以采用树形结构(像文件夹那样)层次性地组织数据。
  • python中常用的库为 h5py(import h5py)

1.2 存储对象

HDF5支持两种类型的数据对象:Dataset,Group

Dataset(array-like):可类比numpy的数组。Dataset 是数据元素的均质集合,具有不变的数据类型和(超)矩形形状。与NumPy阵列不同,它们支持多种透明存储功能,例如压缩,错误检测和分块I / O。Dataset 在h5py中由瘦代理类表示,该代理类支持常规的NumPy操作(如切片)以及各种描述性属性:shape,size,dtype。h5py支持大多数NumPy dtype,并使用与Numpy相同的字符代码(例如’f’,‘i8’)和dtype机制。

Group(folder-like):可以类比为字典,有键(key)和值(value)。组是组织HDF5文件的容器机制。从Python的角度来看,它们的操作有点像字典。在这种情况下,==“键”是组成员的名称,“值”是成员本身(组和数据集)对象。==组对象还包含使HDF5有用的大多数机制。File对象充当HDF5根组的双重职责,并充当您进入文件的入口点。文件中所有对象的名称均为文本字符串(str)。这些将在传递给HDF5 C库之前,使用HDF5批准的UTF-8编码进行编码。 还可以使用字节字符串检索对象,这些字符串将原样传递给HDF5。

注:其实大部分存储格式都是类似的,要么存储纯数据(Datasets),要么存储名称加数据(Groups)。

1.3 HDF5 数据可视化工具 HDFView

在这里插入图片描述

显然,我们要查看的是后三个维度,于是点击 “show Data with Option” 选择后三个维度,即dim2、dim3、dim4。
在这里插入图片描述
注:支持全平台,可查看数据的细节。

2. HDF5数据保存与读取

2.1 H5文件保存与读取

import h5py  
import numpy as np

# construct fake data
imgData = np.zeros((2, 3))

# sava
f = h5py.File('HDF5_FILE.h5','w')   # construct h5 file
f['data'] = imgData                 
f['labels'] = range(6)           
f.close()  

# read
f = h5py.File('HDF5_FILE.h5','r')  
print("---keys---", f.keys())                           
print("---key values---", f['labels'][:])  # slice for reading       
f.close()

在这里插入图片描述

请思考一下只写入数据,不指定键,那么调用 f.keys() 会出现什么结果?

2.2 文件对象 f 的属性和方法

  • 属性:f.name, f.filename, f.mode.
  • 方法:
    • f.keys():存储在文件对象的键
    • f.values():存储在对应键下的数据(即Numpy 数组),取出的是 h5py.Dataset类的实例,这是一个代理对象,它会代理你的请求读写磁盘上的 HDF5 数据,对一个 Dataset 对象进行切片操作会返回一个 Numpy 数组
    • f.items():获取附加到该对象的所有属性的(名称,值)元组,比如(mode r).
    • f.create_dataset():创建Datasets
    • f.create_group():创建Groups

3. Datasets与Groups

3.1 f.create_dataset

import h5py

f = h5py.File("dataset.hdf5","w")
# name, shape, dtype(default np.float32)
d1 = f.create_dataset("dataset1", (20,), 'i')

d1[...] = np.arange(20)

print(d1[:])

f.close()

注:直接赋值数据,不必指定键;也可以在定义中给定data。

a = np.array([[1,2], [3, 4]])
d1 = f.create_dataset("dataset1", (2,2), 'i', data=a)

3.2 f.create_group

import h5py
import numpy as np
f = h5py.File("group.hdf5","w")

# construct group bar1,bar2,dataset dset in h5 file
g1 = f.create_group("bar1")
g2 = f.create_group("bar2")
d = f.create_dataset("dset",data=np.arange(10))

# construct group car1 and dataset dset1 in group bar1
c1 = g1.create_group("car1")
d1 = g1.create_dataset("dset1",data=np.arange(10))

#construct group car2 and dataset dset2 in group bar2
c2=g2.create_group("car2")
d2=g2.create_dataset("dset2",data=np.arange(10))

# root 
print(".......under root......")
for key in f.keys():
    print(f[key].name)

# group bar1
print(".......under bar1......")
for key in g1.keys():
    print(g1[key].name)


# group bar2
print("......under bar2.......")
for key in g2.keys():
    print(g2[key].name)

# car1, car2
print(".....under car1 and car2........")
print(c1.keys())
print(c2.keys())

在这里插入图片描述

可视化这个树形结构:
在这里插入图片描述

Reference:http://docs.h5py.org/en/latest/index.html

PyTorch中,数据预处理通常涉及以下几个步骤: 1. 加载数据集:使用PyTorch的数据加载器(如`torchvision.datasets`)加载数据集。可以是常见的图像数据集(如MNIST、CIFAR10)或自定义数据集。 2. 转换数据:使用`torchvision.transforms`模块中的转换函数对数据进行预处理。常见的转换包括缩放、裁剪、旋转、归一化等。可以根据需求组合多个转换操作。 3. 创建数据加载器:将转换后的数据集传递给`torch.utils.data.DataLoader`来创建一个数据加载器。数据加载器可以指定批处理大小、并发加载等参数。 下面是一个简单的示例,演示如何使用PyTorch进行数据预处理: ```python import torch import torchvision import torchvision.transforms as transforms # 1. 加载数据集 train_dataset = torchvision.datasets.MNIST(root='./data', train=True, download=True) # 2. 转换数据 transform = transforms.Compose([ transforms.ToTensor(), # 将图像转换为Tensor transforms.Normalize((0.5,), (0.5,)) # 归一化到[-1, 1]范围 ]) train_dataset = train_dataset.transform(transform) # 3. 创建数据加载器 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) ``` 在这个示例中,我们加载了MNIST数据集,并将图像转换为Tensor,并进行了归一化处理。然后使用`DataLoader`创建了一个批处理大小为64的数据加载器,同时打乱了数据的顺序。 这只是一个简单的例子,根据具体需求,你可能需要进行更复杂的数据预处理操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值