在caffe中使用hdf5的数据
caffe默認(rèn)使用的數(shù)據(jù)格式為lmdb文件格式,它提供了把圖片轉(zhuǎn)為lmdb文件格式的小程序,但是呢,我的數(shù)據(jù)為一維的數(shù)據(jù),我也要分類啊,那我怎么辦?肯定有辦法可以轉(zhuǎn)為lmdb文件格式的,我也看了一些源代碼,好像是把我們的數(shù)據(jù)變?yōu)镈atum的格式(這是一個用google protocol buffer搞的一個數(shù)據(jù)結(jié)構(gòu)類),然后再把它存為lmdb文件。在Datum里面,label為Int類型,要是我們label為符點(diǎn)數(shù),我還怎么用??(不過看到Datum里面有個float_data的東西,怎么用啊,不懂)。好吧,費(fèi)了一勁想把轉(zhuǎn)換Mnist的程序?yàn)槲矣?#xff0c;是有點(diǎn)成功,不過太麻煩,好像不怎么好使。?? 最后,用hdf5格式的數(shù)據(jù)吧。好在網(wǎng)絡(luò)有好多資料哦,牛逼的人好多的哦,我實(shí)在是很膜拜他們。下面說說怎么轉(zhuǎn)。我用的是matlab轉(zhuǎn),網(wǎng)絡(luò)也有好多用python程序的。
?
以轉(zhuǎn)Mnist 為例,我們以后可以照著寫出自己的來。
%讀入訓(xùn)練數(shù)據(jù),下面的函數(shù)loadMNISTImages是一個自己的函數(shù),如果你想要的話,可以去gitbub上下載(看 %參考文獻(xiàn)里有, 讀完以后,這時(shí),images為一個28*28* 50000的3D數(shù)組; images = loadMNISTImages('train-images-idx3-ubyte'); %讀完后,labels為一個50000* 1的數(shù)組; labels = loadMNISTLabels('train-labels-idx1-ubyte'); % reshape images to 4- D: [rows,col,channel,numbers]trainData=reshape(images,[28 28 1 size(images,2)]); % permute to [cols,rows,channel,numbers]trainData=permute(trainData,[2 1 3 4]); % permute lables to [labels, number of labels ]trainLabels=permute(labels,[2,1]); % create database %注意,這是的/data與/label表示文件里的dataset.當(dāng)我們定義.proto文件的網(wǎng)絡(luò)時(shí),一定要注意:top:分別也要為data和label. h5create('train.hdf5','/data',size(trainData),'Datatype','double');h5create('train.hdf5','/label',size(trainLabels),'Datatype','double');h5write('train.hdf5','/data',trainData);h5write('train.hdf5','/label',trainLabels); % same for test data?
生成文件以后,可以通過h5disp(’文件名‘)看看里面的東西。下面是我自己生成的文件里的內(nèi)容,不是上面生成的哦;
>> h5disp('train.hdf5') HDF5 train.hdf5 Group '/' Dataset 'data' Size: 256x1x1x200MaxSize: 256x1x1x200Datatype: H5T_IEEE_F64LE (double)ChunkSize: []Filters: noneFillValue: 0.000000Dataset 'label' Size: 1x200MaxSize: 1x200Datatype: H5T_IEEE_F64LE (double)ChunkSize: []Filters: noneFillValue: 0.000000?
再往下,就是.proto文件里的data的定義了,下面是我的定義自己的:
2 layer {3 name: "mnist"4 type: "HDF5Data"5 top: "data" //一定要和上面的dataset的名字一樣哦;6 top: "label"7 include {8 phase: TRAIN9 }13 hdf5_data_param {14 source: "mydata/train_list.txt" //是個坑哦,下面下面解釋;15 batch_size: 20017 }?
注意:
第一,再生成HDF5文件時(shí),一定要注意數(shù)組的維度關(guān)系,很敏感的,如,把1*50000寫為了50000*1肯定會出錯的。在caffe中,數(shù)據(jù)都是以4維出現(xiàn)的。(我記得python與matlab里的維度是正反的,python與C語言中都是rowmajor, matlab中是 column-major, 相應(yīng)的就是, matlab是一組維度中,左邊的數(shù)字變化最快,,而python中為右邊。好像是這樣的)
第二,生成的HDF5的dataset的名稱一定要與你后面定義的.proto文件里的data層的top:后面的名稱(即輸出的名稱)一樣啊,要不出錯,找不到數(shù)據(jù)的)。
第三,在定義.proto文件里的data層時(shí)注意,hdf5_data_param的source不要直接寫我們生成的HDF5文件的路徑,而是寫一個.txt文件的,并在.txt文件里寫入你生成的HDF5文件的路經(jīng),一個HDF5文件路徑占一行,一定要這樣哦。原因是因?yàn)?#xff0c;我們可以要讀入多個HDF5文件,所以要這樣寫哦。
第四,生成的HDF5文件一般都很大,如果是圖片的話,可以很多的,HDF5Data layer不能按照batch來從磁盤上讀取數(shù)據(jù),只能一次性把所有數(shù)據(jù)從h5文件中讀到內(nèi)存中,如果出錯了,很可以你的內(nèi)存不夠了哦;
第五,HDF5Data layer不支持預(yù)處理功能。
?
一開始吧, 我老是想一個總是,當(dāng)讀取HDF5文件時(shí),它是怎么知道包含有多少個數(shù)據(jù)的,現(xiàn)在想想,HDF5文件肯定寫入了相關(guān)的數(shù)據(jù)結(jié)構(gòu)相關(guān)的內(nèi)容啊,看看上面的h5disp()的輸出,我們就知道啦。
其實(shí)上面這個問題,我一開始是在想使用lmdb文件時(shí),它把數(shù)據(jù)寫入的Datum中,在Datum文件中,放數(shù)據(jù)的為bytes格式,我再想,它怎么知道一個數(shù)據(jù)占多少個byte的呢??Datum里也沒有這個選項(xiàng)。現(xiàn)在還是不明白,如果這個問題明白了,我就可以把數(shù)據(jù)轉(zhuǎn)為lmdb文件了,但是我始終沒有找到由datum變?yōu)閿?shù)據(jù)的源代碼呢??
如果好心人看到了,請幫我解答一下子哦;
?
?
?
?
參考:
https://github.com/mravendi/caffe-mnist-hdf5
http://blog.csdn.net/langb2014/article/details/53065153
http://blog.csdn.net/u010417185/article/details/53047096
?
轉(zhuǎn)載于:https://www.cnblogs.com/yinheyi/p/6083855.html
總結(jié)
以上是生活随笔為你收集整理的在caffe中使用hdf5的数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssh日志审计_linux查看ssh用户
- 下一篇: 《21天学通C语言(第7版)》一2.6