在深度學習中,通常會使用巨量的數據或圖片來訓練網絡。對於如此大的數據集,如果對於每張圖片都單獨從硬盤讀取、預處理、之後再送入網絡進行訓練、驗證或是測試,這樣效率可是太低了。如果將這些圖片都放入一個文件中再進行處理,這樣效率會更高。有多種數據模型和庫可完成這種操作,如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[:])