hdf5类型文件
HDF---Hierarchical Data Format的简称,
hdf5是一种高级的适合大数据存储及层次逻辑数据的存储文件类型,而list及dict是数据类型.
层次结构数据,满足层次存储及索引包括:
- group------------------像字典
- dataset-------------像numpy数组
安装后使用报错:通过pip install h5py==2.8.0rc1更新
对于数据集需要:
先创建h5文件,再去读h5文件
将dataset放在group里利用group进行层次嵌套.
f = filename.file得到文件的根目录
f.create_group("...../group_name")
f.create_dataset("...../dataset_name")
打开文件的模式,决定是不是可以写,读等
-
r---只读...
-
w----文件不存在就新建,存在就清空,
-
a---文件已存在就在基础上写或读,否则新建,
直接遍历一级目录名:正常迭代打印就好
层级树状递归完全遍历:visit
内部的属性赋值.attr["temp"] = 25 cellius对于创建的group或dataset对象可以用.name打印绝对路径: /foo/grp1
一般:
- HDF5格式文件保存的是 : Model weights(字典,没有顺序)
- JSON 和 YAML 格式文件保存的是: Model structure(顺序靠json描述)
- h5格式:可以同时保存weights和structure
底层存储方式
hdf5默认存储是连续的,c类型的内存.chunked格式变成分块存储可以变成不连续,但是每个块内的数据是连续的.
利用numpy数据初始化
#还可以直接用np数组给dataset初始化,此时data就涵盖了shape和dtype,即shape = data.shape,....
arr = np.arange(100)
dset = f.create_dataset("/mydataset1",data = arr)#i4:32位的integer[-2^31,2^31]
数据处理上的用途
利用python的文件操作及数组等方式将训练数据及测试数据集标签,按数据划分方法,将文件名写入到python数组,最终将这些处理好的数组写入hdf5格式文件给dataset初始化.
示例
import h5py
import numpy as np
coco = h5py.File("D:/annot_coco.h5","r")#coco.name == / 根节点
# print(coco)
# print(coco["bndbox"])
#只是遍历直接相连的一级节点
for name in coco:
# 本身就是字符串
print(coco[name])
print(coco[name][:2])
# def printname(name):
# print(name)
#
#
#
# #遍历整个coco下的节点
# coco.visit(printname)
#dataset.attrs
#dataset对象可以有自己的属性, 但所有属性数据的长度加起来不能超过64K, 包括属性名字.
dset.attrs['length'] = 100
dset.attrs['name'] = 'This is a dataset'
for attr in dset.attrs:
print attr, ":", dset.attrs[attr]
length : 100
name : This is a dataset
注意:
imgname_array = coco["imgname"][:]#不一样的,这是标准用法,还是要先取到全部,再去索引,否则结果维度不一样
# imgname_ = coco["imgname"][:1]#轴不会减少
# print(imgname_array.shape)
# print(imgname_)#[1,16]
# print(type(imgname_dataset))
# print(type(imgname_array))
img = imgname_array[0]
写字符串到h5文件
test_h5 = h5py.File("D:/test.h5","w")
imgname = np.fromstring('000000262145.jpg',dtype=np.uint8).astype('float64')#str_imgname------>float64
test_h5 .create_dataset('imgname', data=imgname)#变成f8之后就可以直接往h5中写了
test_h5.close()
"""
最后得出来的矩阵长度是字符串的长度。---1个字符串的长度就是对应编码的h5向量的长度
如果想将多个字符串拼成一个大的numpy矩阵,写到h5文件中,必须先将字符串转换成相同长度。
通常的做法是在字符串后面补上\x00。
"""
从h5数据读出字符串格式
test_h5 = h5py.File("D:/test.h5","r")
img = test_h5['imgname'][:]
img = img.astype(np.uint8).tostring().decode('ascii')
print(img)
test_h5.close()