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

时间:2017-08-28 02:54:28

标签: 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
  }
}

这是我的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)

那么,我怎样才能让它发挥作用?这种方法可行吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

问题:
您感到困惑的是"Data"图层和"HDF5Data"图层:
使用"Data"图层,您只能指定一个 lmdb / leveldb数据集,而您的source:条目应指向您正在使用的唯一数据库。
另一方面,使用"HDF5Data"图层,您可以拥有多个二进制hdf5文件,source:参数指向文本文件列出了您将要使用的所有二进制文件。

<强>解决方案
0.(关注PrzemekD的评论)为您拥有的每个lmdb添加不同的 "Data"图层(使用较小的batch_size),然后使用"Concat"将不同的输入“合并”到一个小批量的层 1.正如您已经猜到的,一种解决方案是将您的数据转换为hdf5二进制格式并使用"HDF5Data"图层。
2.或者,您可以编写自己的"Python"输入图层,此图层应该能够从所有lmdb文件中读取(使用python lmdb接口)并将数据一批一批地提供给您的网络。