以 HDF5 格式準備任意資料

除了影象分類資料集 ,Caffe 還有任意輸入的 HDF5Data 層。該層要求將所有培訓/驗證資料儲存在 hdf5格式檔案中。
此示例顯示如何使用 python h5py 模組構造此類 hdf5 檔案以及如何設定 caffe HDF5Data 層以讀取該檔案。

構建 hdf5 二進位制檔案

假設你有一個文字檔案'train.txt',每行包含一個影象檔名和一個浮點數作為迴歸目標。

import h5py, os
import caffe
import numpy as np

SIZE = 224 # fixed size to all images
with open( 'train.txt', 'r' ) as T :
    lines = T.readlines()
# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
X = np.zeros( (len(lines), 3, SIZE, SIZE), dtype='f4' ) 
y = np.zeros( (1,len(lines)), dtype='f4' )
for i,l in enumerate(lines):
    sp = l.split(' ')
    img = caffe.io.load_image( sp[0] )
    img = caffe.io.resize( img, (SIZE, SIZE, 3) ) # resize to fixed size
    # you may apply other input transformations here...
    # Note that the transformation should take img from size-by-size-by-3 and transpose it to 3-by-size-by-size
    X[i] = img
    y[i] = float(sp[1])
with h5py.File('train.h5','w') as H:
    H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
    H.create_dataset( 'y', data=y ) # note the name y given to the dataset!
with open('train_h5_list.txt','w') as L:
    L.write( 'train.h5' ) # list all h5 files you are going to use

配置 HDF5Data

一旦你擁有所有 h5 檔案和列出它們的相應測試檔案,你就可以為你的 train_val.prototxt 新增一個 HDF5 輸入層:

 layer {
   type: "HDF5Data"
   top: "X" # same name as given in create_dataset!
   top: "y"
   hdf5_data_param {
     source: "train_h5_list.txt" # do not give the h5 files directly, but the list.
     batch_size: 32
   }
   include { phase:TRAIN }
 }

你可以在此處此處找到更多資訊。

如上所示,我們將 CaF 列入 HDF5 檔案列表。這是因為在當前版本中,單個 HDF5 資料檔案的大小限制為 2GB。因此,如果訓練資料超過 2GB,我們需要將其拆分為單獨的檔案。

如果單個 HDF5 資料檔案超過 2GB,我們會收到類似的錯誤訊息

Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX

如果資料總量小於 2GB,我們是否應將資料拆分為單獨的檔案?

根據 Caffe 的原始碼中的一條評論,單個檔案會更好,

如果 shuffle == true,則對 HDF5 檔案的排序進行混洗,並且對任何給定 HDF5 檔案中的資料排序進行混洗,但不交錯不同檔案之間的資料。