在深度学习中,通常会使用巨量的数据或图片来训练网络。对于如此大的数据集,如果对于每张图片都单独从硬盘读取、预处理、之后再送入网络进行训练、验证或是测试,这样效率可是太低了。如果将这些图片都放入一个文件中再进行处理,这样效率会更高。有多种数据模型和库可完成这种操作,如HDF5和TFRecord。

1 hdf5格式使用方法

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[:])

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐