本专题主要是解决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