caffe2 : LMDB,LevelDB, 制作LevelDB

Reference :
http://blog.csdn.net/jyl1999xxxx/article/details/53942824
http://wiki.dreamrunner.org/public_html/C-C++/Library-Notes/LMDB.html
http://blog.csdn.net/u014046170/article/details/47445919

1. LMDB介绍:

Caffe使用LMDB来存放训练/测试用的数据集,以及使用网络提取出的feature(为了方便,以下还是统称数据集)。数据集的结构很简单,就是大量的矩阵/向量数据平铺开来。数据之间没有什么关联,数据内没有复杂的对象结构,就是向量和矩阵。既然数据并不复杂,Caffe就选择了LMDB这个简单的数据库来存放数据。

LMDB的全称是Lightning Memory-Mapped Database,闪电般的内存映射数据库。它文件结构简单,一个文件夹,里面一个数据文件,一个锁文件。数据随意复制,随意传输。它的访问简单,不需要运行单独的数据库管理进程,只要在访问数据的代码里引用LMDB库,访问时给文件路径即可。

图像数据集归根究底从图像文件而来。既然有ImageDataLayer可以直接读取图像文件,为什么还要用数据库来放数据集,增加读写的麻烦呢?我认为,Caffe引入数据库存放数据集,是为了减少IO开销。读取大量小文件的开销是非常大的,尤其是在机械硬盘上。LMDB的整个数据库放在一个文件里,避免了文件系统寻址的开销。LMDB使用内存映射的方式访问文件,使得文件内寻址的开销非常小,使用指针运算就能实现。数据库单文件还能减少数据集复制/传输过程的开销。一个几万,几十万文件的数据集,不管是直接复制,还是打包再解包,过程都无比漫长而痛苦。LMDB数据库只有一个文件,你的介质有多块,就能复制多快,不会因为文件多而慢如蜗牛。

2. LMDB 在python中使用:

https://zhuanlan.zhihu.com/p/23485774

3. caffe2 中的 LMDB以及LevelDB

MNIST 数据集是以NCHW 格式储存的, NCHW格式 即 Num_samples x Height x Width x Channels。

MNIST 的tutorial默认使用的是LMDB,我们也可以使用google开发的levelDB来存储data。这两者孰优孰劣暂时不清楚,请指教。

如果想使用LevelDB的话,需要按照如下指示进行代码更改:

#Default code using lmdb
train_model = model_helper.ModelHelper(name="mnist_train", arg_scope=arg_scope)
data, label = AddInput(
    train_model, batch_size=64,
    db=os.path.join(data_folder, 'mnist-train-nchw-lmdb'),
    db_type='lmdb')

#Updated code using leveldb
train_model = model_helper.ModelHelper(name="mnist_train", arg_scope=arg_scope)
data, label = AddInput(
    train_model, batch_size=64,
    db=os.path.join(data_folder, 'mnist-train-nchw-leveldb'),
    db_type='leveldb')

 如果想制作自己的levelDB的话可以进入caffe2的文件目录下的build/caffe2/binaries/binaries/文件夹下运行make_mnist_db:

./make_mnist_db --channel_first --db leveldb --image_file ~/Downloads/train-images-idx3-ubyte --label_file ~/Downloads/train-labels-idx1-ubyte --output_file ~/caffe2/caffe2/python/tutorials/tutorial_data/mnist/mnist-train-nchw-leveldb

 

原文地址:https://www.cnblogs.com/SongHaoran/p/7655043.html