Neural network 如何将多个LMDB文件提供给Caffe中的数据层

Neural network 如何将多个LMDB文件提供给Caffe中的数据层,neural-network,deep-learning,caffe,Neural Network,Deep Learning,Caffe,我有一个非常大的数据集,将其转换为Caffe的单个LMDB文件不是一个好主意。因此,我试图将它分成几个小部分,并指定一个包含相应LMDB文件路径的TXT文件。 以下是我的数据层示例: layer { name: "data" type: "Data" top: "data" top: "label" include { phase: TRAIN } data_param { source: "path/to/lmdb.txt" batch_size: 256 backend: LMDB }

我有一个非常大的数据集,将其转换为Caffe的单个LMDB文件不是一个好主意。因此,我试图将它分成几个小部分,并指定一个包含相应LMDB文件路径的TXT文件。 以下是我的数据层示例:

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)
I0828 10:30:40.639502 26950图层\u工厂.hpp:77]创建图层数据
F0828 10:30:40.639549 26950 db_lmdb.hpp:15]检查失败:mdb_状态==0
(20对0)不是目录
***检查故障堆栈跟踪:***
@0x7f678e4a3daa(未知)
@0x7f678e4a3ce4(未知)
@0x7f678e4a36e6(未知)
@0x7f678e4a6687(未知)
@0x7f678ebee5e1 caffe::db::LMDB::Open()
@0x7f678eb2b7d4 caffe::数据层::数据层()
@0x7f678eb2b982 caffe::创建者_数据层()
@0x7f678ec1a1a9 caffe::Net::Init()
@0x7f678ec1c382 caffe::Net::Net()
@0x7f678ec2e200 caffe::Solver::InitTrainNet()
@0x7f678ec2f153 caffe::解算器::初始化()
@0x7f678ec2f42f caffe::解算器::解算器()
@0x7F678EABC71 caffe::创建者_SGDSolver()
@0x40f18e caffe::SolverRegistry::CreateSolver()
@0x40827d列()
@0x405bec主
@0x7f678ccfaf45(未知)
@0x4064f3(未知)
@(无)(未知)
中止(堆芯转储)

那么,我怎样才能让它工作呢?这种方法可行吗?提前感谢。

问题:
您混淆了
“数据”
层和层:
对于layer,您只能指定一个lmdb/leveldb数据集,并且您的
源:
条目应指向您正在使用的唯一数据库。
另一方面,使用layer,您可以拥有多个二进制文件,并且
source:
参数指向一个文本文件,其中列出了您将要使用的所有二进制文件

解决方案
0(下面的评论)为您拥有的每个lmdb添加不同的层(具有较小的
批量大小
),然后使用层将不同的输入“合并”到单个小批量中。
1.正如您已经猜到的,一种解决方案是将数据转换为hdf5二进制格式并使用图层。

2.或者,您可以编写自己的输入层,该层应该能够读取所有lmdb文件(使用python lmdb接口),并将数据逐批提供给您的网络。

解决方案3如何:有多个数据层,每个数据层从单个lmdb加载,然后在批大小维度中进行concat?@PrzemekD
“concat”
。好主意!由于数据集太大,如果一次加载多个LMDB,是否会导致内存不足问题@PrzemekD@Y.C.Suncaffe不会将所有lmdb加载到内存中。它只能一批一批地读取。谢谢你的帮助@谢