1. 程式人生 > >caffe HDF5Data 層使用及資料生成

caffe HDF5Data 層使用及資料生成

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

參考文章:http://blog.csdn.NET/shuzfan/article/details/52503683

http://www.cnblogs.com/yinheyi/p/6083855.html

有些時候,我們的輸入不是標準的影象,而是其它一些格式,比如:頻譜圖、特徵向量等等,這種情況下LMDB、Leveldb以及ImageData layer等就不好使了,這時候我們就需要一個新的輸入介面——HDF5Data.

(1) 在Matlab中生成HDF5檔案

這裡直接以例子的形式說明如何生成:

1、手寫體的資料集

[html]  view plain  copy
  1. %讀完後,labels為一個50000*1的陣列;  
  2. labels = loadMNISTLabels('trainlabelsidx1ubyte');  
  3. % reshape images to 4D:  
  4. [rows,col,channel,numbers]  
  5. trainData=reshape(images,[28 28 1 size(images,2)]);  
  6. % permute to [cols,rows,channel,numbers]  
  7. trainData=permute(trainData,[2 1 3 4]);  
  8. % permute lables to [labels, number of labels ]  
  9. trainLabels=permute(labels,[2,1]);  
  10. % create database  
  11. %注意,這是的/data與/label表示檔案裡的dataset.當我們定義.proto檔案的網路時,一定要注意:top:分別也要為data和label.  
  12. h5create('train.hdf5','/data',size(trainData),'Datatype','double');  
  13. h5create('train.hdf5','/label',size(trainLabels),'Datatype','double');  
  14. h5write('train.hdf5','/data',trainData);  
  15. h5write('train.hdf5','/label',trainLabels);  
  16. % same for test data  
生成檔案以後,可以通過h5disp(’檔名‘)看看裡面的東西。下面是我自己生成的檔案裡的內容,不是上面生成的
哦; [html]  view plain  copy
  1. >> h5disp('train.hdf5')  
  2. HDF5 train.hdf5  
  3. Group '/'  
  4. Dataset 'data'  
  5. Size: 256x1x1x200  
  6. MaxSize: 256x1x1x200  
  7. Datatype: H5T_IEEE_F64LE (double)  
  8. ChunkSize: []  
  9. Filters: none  
  10. FillValue: 0.000000  
  11. Dataset 'label'  
  12. Size: 1x200  
  13. MaxSize: 1x200  
  14. Datatype: H5T_IEEE_F64LE (double)  
  15. ChunkSize: []  
  16. Filters: none  
  17. FillValue: 0.000000  


檢視proto檔案中的內容

[html]  view plain  copy
  1. layer {  
  2.    name: "mnist"  
  3.    type: "HDF5Data"  
  4.    top: "data"   
  5.    top: "label"  
  6.    include {  
  7.    phase: TRAIN  
  8.  }  
  9.    hdf5_data_param {  
  10.      source: "mydata/train_list.txt"   
  11.    batch_size: 200  
 }

注意:
第一,再生成HDF5檔案時,一定要注意陣列的維度關係,很敏感的,如,把1*50000寫為了50000*1肯定會出錯
的。在caffe中,資料都是以4維出現的。(我記得Python與matlab裡的維度是正反的,python與C語言中都是
rowmajor, matlab中是 columnmajor,
相應的就是, matlab是一組維度中,左邊的數字變化最快,,而
python中為右邊。好像是這樣的)
第二,生成的HDF5的dataset的名稱一定要與你後面定義的.proto檔案裡的data層的top:後面的名稱(即輸出的
名稱)一樣啊,要不出錯,找不到資料的)。
第三,在定義.proto檔案裡的data層時注意,hdf5_data_param的source不要直接寫我們生成的HDF5檔案的路
徑,而是寫一個.txt檔案的,並在.txt檔案裡寫入你生成的HDF5檔案的路經,一個HDF5檔案路徑佔一行,一定要
這樣哦。原因是因為,我們可以要讀入多個HDF5檔案,所以要這樣寫哦。
第四,生成的HDF5檔案一般都很大,如果是圖片的話,可以很多的,HDF5Data layer不能按照batch來從磁碟上
讀取資料,只能一次性把所有資料從h5檔案中讀到記憶體中,如果出錯了,很可以你的記憶體不夠了哦;
第五,HDF5Data layer不支援預處理功能。



2 問題:輸入data是512*1的向量,共1000個樣本,label是標量。

程式碼如下:

% 建立HDF5檔案,包含data和label兩個變數,資料型別是caffe支援的float型資料h5create('train.h5','/data',[1 1 512 1000],'Datatype','single');h5create('train.h5','/label',[1 1 1 1000],'Datatype','single');%reshape: width x height x channels x num,注意MATLAB讀資料是列優先,是和C++裡面相反的。所以寫資料的時候也要倒著寫。train_data  = reshape(train_data,[1 1 512 1000]);train_label = reshape(train_label,[1 1 1 1000]);h5write('train.h5' ,'/data' , single(train_data));h5write('train.h5' ,'/label', single(train_label));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

關於HDF5在MATLAB裡面的的其它用法,比如從指定位置開始寫等等,請參照MATLAB文件。

(2) caffe中HDF5層的用法

注意:由於單個HDF5檔案大小有限制,MATLAB下好像最大隻能生成5G大小的檔案,因此當我們的訓練資料較多的時候,往往需要將資料分別寫入多個H5檔案中。

下面直接給出caffe中HDF5Data-layer的使用示例:

layer name: "data"  type: "HDF5Data"  top: "data"  top: "label"  include {    phase: TRAIN  hdf5_data_param source: "train.txt"  batch_size: 128  shuffle: true  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

由於可能存在多個H5檔案,所以HDF5Data的輸入是從一個TXT檔案讀取的列表,train.txt內容示例如下:

train1.h5train2.h5...
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

還需要注意,shuffle是對H5檔案進行亂序,而每個H5檔案內部的順序不動。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述