【问题标题】:How to feed several LMDB files to the data layer in Caffe如何将多个 LMDB 文件提供给 Caffe 中的数据层
【发布时间】:2023-03-12 09:55:01
【问题描述】:

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

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)

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

【问题讨论】:

    标签: neural-network deep-learning caffe


    【解决方案1】:

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

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

    【讨论】:

    • 方案3怎么样:有多个数据层,每个从一个LMDB加载,然后concat?
    • @PrzemekD "Concat" 在批量大小维度中。这是个好主意!
    • 如果我的数据集太大,一次加载多个LMDB会导致内存不足的问题吗? @PrzemekD
    • @Y.C.Sun caffe 不会将所有 lmdb 加载到内存中。它只能逐批读取。
    • 感谢您的帮助!@Shai
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2017-08-26
    • 2016-10-30
    • 2020-04-16
    • 2015-08-26
    • 2016-07-22
    相关资源
    最近更新 更多