H5py包是HDF5二進制數據格式的python接口,可以用於存儲大量的數據並使用Numpy進行處理。成千上萬的數據集可以存儲在單一的文件中。
h5py的官方文檔:http://docs.h5py.org/en/latest/quick.html
現在我手頭有德國交通牌數據集的h5文件,裏面存有圖片和相應的label,需要讀取h5文件來讀取該數據集。圖像內容是X_test,圖像標籤是Y_test。以此舉例:
讀取文件:
import h5py
f = h5py.File('gtsrb_datasets.h5', 'r') #文件擴展名是.hdf5也是一樣的
h5文件就像一個python字典,我們可以查看它的key:
>>> list(f.keys())
[u'X_test',u'Y_test']
查看數據集的形狀和數據類型:
>>> xset=f['X_test']
>>> xset.shape
(12630,32,32,3)
>>> xset.dtype
dtype('uint8')
>>> yset=f['Y_test']
>>> yset.shape
(12630,43)
>>> yset.dtype
dtype('uint8')
我的數據集裏有12630張圖像,每張圖像是32*32*3的小圖,德國交通牌數據集有43個類別,每張圖片的標籤是一個one-hot向量。現在我要將數據讀取出來:
def load_hdf5(data_filename, keys=None):
''' assume all datasets are numpy arrays '''
dataset = {}
with h5py.File(data_filename) as hf:
if keys is None:
for name in hf:
dataset[name] = np.array(hf.get(name))
else:
for name in keys:
dataset[name] = np.array(hf.get(name))
return dataset
dataset = load_hdf5('./gtsrb_dataset.h5', keys=['X_test', 'Y_test'])
X_test = np.array(dataset['X_test'], dtype='float32')
Y_test = np.array(dataset['Y_test'], dtype='float32')
print('X_test shape %s' % str(X_test.shape))
print('Y_test shape %s' % str(Y_test.shape))
現在所有的圖都讀到了X_test裏,所有的標籤都讀到了Y_test裏,讓我們隨便看一個吧:
可視化部分GTSRB數據集:
classes=[]
num_classes=10 #其實是有43個類別,但因爲圖太小了,全展示出來很擠所以我只展示10個
for i in range(0,num_classes):
classes.append(i) #這裏其實可以將類別的英文標籤等等粘上去
samples_per_class=10
Y_test=np.argmax(Y_test,axis=1) #將one-hot編碼轉換爲數字
for y,cls in enumerate(classes):
# onehot_y=keras.utils.to_categorical(y,num_classes)
idxs=np.flatnonzero((Y_test)==y) #尋找Y_test中標籤爲y的元素所在的索引
idxs=np.random.choice(idxs,samples_per_class,replace=False) #隨機選擇samples個樣本
for j,idx in enumerate(idxs):
plt_idx=j*num_classes+y+1
plt.subplot(samples_per_class,num_classes,plt_idx)
plt.imshow(X_test[idx].astype('uint8'))
plt.axis('off')
if j==0:
plt.title(cls)
plt.show()
=======================================================================