如何将多个 LMDB 文件提供给 Caffe 中的数据层
How to feed several LMDB files to the data layer in 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)
那么,我怎样才能让它发挥作用呢?这种方法可行吗?提前致谢。
问题:
您混淆了 "Data"
层和 "HDF5Data"
层:
对于 "Data"
图层,您只能指定 one lmdb/leveldb 数据集,并且您的 source:
条目应指向您正在使用的唯一数据库。
另一方面,使用 "HDF5Data"
层你可以有 多个 二进制 hdf5
文件,并且 source:
参数指向一个 text 文件列出了您将要使用的所有二进制文件。
解决方案
0.(根据 的评论)为您拥有的每个 lmdb 添加 different "Data"
层(较小的 batch_size
) 然后使用 "Concat"
层将不同的输入 "merge" 到一个小批量中。
1. 正如您已经猜到的那样,一种解决方案是将数据转换为 hdf5 二进制格式并使用 "HDF5Data"
层。
2. 或者,您可以编写自己的 输入层,该层应该能够从所有 lmdb 文件中读取(使用 python 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)
那么,我怎样才能让它发挥作用呢?这种方法可行吗?提前致谢。
问题:
您混淆了 "Data"
层和 "HDF5Data"
层:
对于 "Data"
图层,您只能指定 one lmdb/leveldb 数据集,并且您的 source:
条目应指向您正在使用的唯一数据库。
另一方面,使用 "HDF5Data"
层你可以有 多个 二进制 hdf5
文件,并且 source:
参数指向一个 text 文件列出了您将要使用的所有二进制文件。
解决方案
0.(根据 "Data"
层(较小的 batch_size
) 然后使用 "Concat"
层将不同的输入 "merge" 到一个小批量中。
1. 正如您已经猜到的那样,一种解决方案是将数据转换为 hdf5 二进制格式并使用 "HDF5Data"
层。
2. 或者,您可以编写自己的