2017-08-28 125 views
0

我有一個非常大的數據集,將它轉換爲單個CaDB的LMDB文件並不是一個好主意。因此,我試圖將它分成小部分並指定一個包含相應LMDB文件路徑的TXT文件。 這裏是我的數據層的一個例子:如何將幾個LMDB文件提供給Caffe中的數據層

layer { 
name: "data" 
type: "Data" 
top: "data" 
top: "label" 
include { 
phase: TRAIN 
} 
data_param { 
source: "path/to/lmdb.txt" 
batch_size: 256 
backend: LMDB 
    } 
} 

這是我lmdb.txt文件:

/path/to/train1lmdb 
/path/to/train2lmdb 
/path/to/train3lmdb 

但是,我得到了以下錯誤:

I0828 10:30:40.639502 26950 layer_factory.hpp:77] Creating layer data 
F0828 10:30:40.639549 26950 db_lmdb.hpp:15] Check failed: mdb_status == 0 
(20 vs. 0) Not a directory 
*** Check failure stack trace: *** 
@  0x7f678e4a3daa (unknown) 
@  0x7f678e4a3ce4 (unknown) 
@  0x7f678e4a36e6 (unknown) 
@  0x7f678e4a6687 (unknown) 
@  0x7f678ebee5e1 caffe::db::LMDB::Open() 
@  0x7f678eb2b7d4 caffe::DataLayer<>::DataLayer() 
@  0x7f678eb2b982 caffe::Creator_DataLayer<>() 
@  0x7f678ec1a1a9 caffe::Net<>::Init() 
@  0x7f678ec1c382 caffe::Net<>::Net() 
@  0x7f678ec2e200 caffe::Solver<>::InitTrainNet() 
@  0x7f678ec2f153 caffe::Solver<>::Init() 
@  0x7f678ec2f42f caffe::Solver<>::Solver() 
@  0x7f678eabcc71 caffe::Creator_SGDSolver<>() 
@   0x40f18e caffe::SolverRegistry<>::CreateSolver() 
@   0x40827d train() 
@   0x405bec main 
@  0x7f678ccfaf45 (unknown) 
@   0x4064f3 (unknown) 
@    (nil) (unknown) 
Aborted (core dumped) 

那麼,如何我可以使它工作嗎?這種方法是否可行?提前致謝。

回答

2

問題:
你感到困惑"Data"層和"HDF5Data"層:
隨着"Data"層只能指定一個 lmdb /性LevelDB數據集,你source:條目應該指向你所使用的唯一數據庫。
在另一方面,"HDF5Data"層可以有多個二進制文件hdf5source:參數指向一個文本文件列出了所有的二進制文件,您要使用。

解決方案
0(以下PrzemekD的評論)添加不同"Data"層每個lmdb你有(較小batch_size),然後使用"Concat"層‘合併’不同的輸入到一個單一的minibatch 。
1.您可能已經猜到,一種解決方案是將數據轉換爲hdf5二進制格式並使用"HDF5Data"圖層。
2.或者,你也可以自己編寫"Python"輸入層,這個層應該能夠讀取所有的lmdb文件(使用python lmdb接口)並將數據批量傳送到你的網絡。

+1

解決方案3如何:有多個數據層,每個數據層從單個LMDB加載,然後concat? –

+0

@PrzemekD''Concat「'在批處理大小維度。這是個好主意! – Shai

+0

由於我的數據集太大而導致一次加載多個LMDB,是否會導致內存不足問題? @PrzemekD –

相關問題