在深度学习中,通常会使用巨量的数据或图片来训练网络。对于如此大的数据集,如果对于每张图片都单独从硬盘读取、预处理、之后再送入网络进行训练、验证或是测试,这样效率可是太低了。如果将这些图片都放入一个文件中再进行处理,这样效率会更高。有多种数据模型和库可完成这种操作,如HDF5和TFRecord。
1.1 hdf5文件介绍
一个HDF5文件是一种存放两类对象的容器:dataset和group. Dataset是类似于数组的数据集,而group是类似文件夹一样的容器,存放dataset和其他group。在使用h5py的时候需要牢记一句话:groups类比词典,dataset类比Numpy中的数组。
HDF5的dataset虽然与Numpy的数组在接口上很相近,但是支持更多对外透明的存储特征,如数据压缩,误差检测,分块传输。
1.2 hdf5数据的创建
由hdf5文件简介可知道,hdf5文件包含两部分,group和dataset。很直观的类比group就是文件夹,dataset就是文件夹里面的数据,而我们要引用文件夹就好比词典用法,我们要引用数据就好比数组用法。
创建group和dataset分别为create_group;create_dataset
假设我们要创建一个名字为subgroup的group,subgroup里面包含一个名为subsub的group和名为data1的数据;在subsub中包含名为data2的数据。示意图如下
import numpy as np
import h5py
"""
create_dataset :create dataset
create_group :create group
"""
data1 = np.arange(50)
data2 = np.arange(100)
# h5py.File(filename,’w’) w表示写入。这句类似 f = h5py.File(‘test.h5’,’w’)
with h5py.File('test.h5','w') as f:
subgroup = f.create_group('subgroup')
subgroup.create_dataset('data1',data=data1)
subsub = subgroup.create_group('subsub')
subsub.create_dataset('data2',data=data2)
1.3 hdf5数据读取
以1.2中保存的test.h5数据作要读取的数据。
1.打开h5文件
import h5py
f = h5py.File('test.h5','r')) # ‘r’ 表示读取
2.查看h5文件里面结构
def printname(name):
print(name)
f.visit(prtname)
输出结构图如下: subgroup subgroup/data1 subgroup/subsub subgroup/subsub/data2 可以看到subgrop下有数据data1 subsub下有数据data2 |
3.取出数据
取数据,例如要取出data1
subgroup = f[‘sobgroup’]
data1 = subgroup[‘data1’]
## 取出data2
subsub = subgroup[‘subsub’]
data2 = subsub[‘data2’]
完整代码如下:
with h5py.File(filename,'r') as f:
def prtname(name):
print(name)
f.visit(prtname)
subgroup = f['subgroup']
subsub = subgroup['subsub']
data1 = subgroup['data1']
data2 = subsub['data2']
# print(dset)
print("data1 name:",data1.name,"data2 name",data2.name)
print("data1 shape:",data1.shape,"data2 shape:",data2.shape)
print("data1 dtype:",data1.dtype,"data2 dtype:",data2.dtype)
print("data1:",data1[:],"data2:",data2[:])