将数据转换为leveldb用于caffe

7
我有许多2D数据矩阵在Matlab中(不包含图像数据,但可能包含单精度数据)。
请问有人知道如何将2D Matlab矩阵转换为leveldb格式,以便用于训练自定义神经网络时使用caffe?
我已经完成了关于如何在图像上训练(使用imagenet架构)和mnist(数字识别数据集)的教程。然而,在后一个示例中,他们没有展示如何创建相应的数据库。在教程中,数据库已经被提供了。

你知道 https://github.com/kyamagu/matlab-leveldb 吗? - fuesika
还没有。你自己试了吗?我刚刚尝试使用它加载了一个leveldb数据库。加载似乎很顺利,但是数据库似乎是空的。(我无法显示任何键,而且matlab变量只有100个字节,而实际数据库则为2GB)。我的数据库包含文件"data.mdb"和"lock.mdb"。也许caffe使用了一些修改过的leveldb版本? - mcExchange
1
为什么不使用HDF5_DATA层呢?它更加灵活... - Shai
@Shai:你能解释一下/举个例子吗? - mcExchange
1个回答

6
我仍然不知道如何创建一个适用于caffe的2D数据矩阵的leveldb数据库,但我最终解决了我的问题:
我最终使用了Shai的建议将数据转换为HDF5格式。在Matlab中读写HDF5数据库非常容易。您只需要使用已经实现在Matlab中的函数hdf5info()h5read()h5create()h5write()即可。
示例:
- 在caffe的prototxt文件中更改数据类型为"hdf5layer",如下所示:
name: "LeNet"
layer {
  name: "mnist"
  type: "HDF5Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  hdf5_data_param {
    source: "/path/to/your/database/myMnist_train.txt"
    batch_size: 64
  }
}

使用Matlab创建HDF5数据库: - Caffe:您的输入训练数据必须是一个4-D矩阵,其中最后两个维度等于Matlab中2D输入数据矩阵的大小。 - 示例:取一个大小为54x24(#行x列)的2D矩阵(图像或单精度数据) - -> 转置它,并将其堆叠成一个24x54x1xN矩阵,其中N是2D矩阵(训练样本)的数量。 - 标签在Matlab中是一个1xN行向量。 - 现在创建您的hdf5数据库:
h5create(['train.h5'],'/data',[24 54 1 length(trainLabels)]);
h5create(['train.h5'],'/label',[1 length(trainLabels)]);
h5write(['train.h5'],'/data',trainData);
h5write(['train.h5'],'/label',trainLabels);
  • 正如你所看到的,Caffe 期望使用具有“data”和“label”变量的 hdf5 数据库
  • 读取数据库:
    使用 hdf5info(filename) 来获取 hdf5 数据库中的数据集名称。 然后使用 data = h5read(filename,dataset) 读取数据集

太好了!顺便提一下,你需要准备 /path/to/your/database/myMnist_train.txt 文件,并将 h5 文件名写入其中,例如:train.h5。 - Shai
你需要在存储矩阵之前减去平均矩阵吗? - mad
这是您的数据,所以您应该知道您希望如何转换它;)。一般来说,均值减法和标准差除法通常能够改善数值优化。 - mcExchange
这是一个不错的选择,但不是正确答案,因为 HDF5 数据层 并不是 完全功能。我将尝试自己找出答案,但如果你有任何见解,那就太好了。否则,我希望问题能够更新到你实际想要的内容(任何格式的 Caffe),这样我就可以要求最初提出的更具体的答案。: \ 否则,这非常有用。谢谢。 - Poik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接