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()