Caffe:了解 blob 的预期 lmdb 数据结构

Caffe: Understanding expected lmdb datastructure for blobs

我正在尝试了解数据在 Caffe 中的解释方式。 为此,我查看了 Minst Tutorial 查看输入数据定义:

layers {
  name: "mnist"
  type: DATA
  data_param {
    source: "mnist_train_lmdb"
    backend: LMDB
    batch_size: 64
    scale: 0.00390625
  }
  top: "data"
  top: "label"
}

我现在查看了 mnist_train_lmdb 并获取了其中一个条目(以十六进制显示):

0801101C181C229006
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000054B99F973C2400000000000000000000000000000000
000000000000DEFEFEFEFEF1C6C6C6C6C6C6C6C6AA34000000000000
00000000000043724872A3E3FEE1FEFEFEFAE5FEFE8C000000000000
000000000000000000000011420E4343433B15ECFE6A000000000000
00000000000000000000000000000000000053FDD112000000000000
000000000000000000000000000000000016E9FF5300000000000000
000000000000000000000000000000000081FEEE2C00000000000000
000000000000000000000000000000003BF9FE3E0000000000000000
0000000000000000000000000000000085FEBB050000000000000000
00000000000000000000000000000009CDF83A000000000000000000
0000000000000000000000000000007EFEB600000000000000000000
00000000000000000000000000004BFBF03900000000000000000000
0000000000000000000000000013DDFEA60000000000000000000000
00000000000000000000000003CBFEDB230000000000000000000000
00000000000000000000000026FEFE4D000000000000000000000000
00000000000000000000001FE0FE7301000000000000000000000000
000000000000000000000085FEFE3400000000000000000000000000
000000000000000000003DF2FEFE3400000000000000000000000000
0000000000000000000079FEFEDB2800000000000000000000000000
0000000000000000000079FECF120000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
2807

(我在此处添加了换行符以便能够看到数字“7”。)

现在我的问题是,在哪里描述了这种格式? 或者换句话说,在哪里定义前 36 个字节是某种 header 而后 8 个bytes有一些标签对应吗?

我将如何构建自己的数据? Blob Tutorial nor Layers Definition 都没有透露太多关于所需格式的信息。 我的意图不是使用图像数据,而是时间序列

谢谢!

我意识到协议缓冲区必须在这里发挥作用。因此,我尝试针对 caffe.proto.

中定义的某些类型对其进行反序列化

Datum 似乎是最合适的:

{Caffe.Datum}
    Channels: 1
    Data: {byte[784]}
    Encoded: false
    FloatData: Count = 0
    Height: 28
    Label: 7
    Width: 28

所以答案很简单:它是 'Datum' 类型实例的序列化表示,定义为 caffe.proto

顺便说一句。因为英语不是我的母语,所以我必须首先意识到 "Datum" 是 "data"

的单数形式

关于使用您自己的数据,其结构如下:

The conventional blob dimensions for data are number N x channel K x height H x width W. Blob memory is row-major in layout so the last / rightmost dimension changes fastest. For example, the value at index (n, k, h, w) is physically located at index ((n * K + k) * H + h) * W + w.

参考Blobs, Layers, and Nets: anatomy of a Caffe model

我可以试着回答你的第二个问题。由于 Caffe 仅采用一系列选定格式的数据,如 lmdb、hdf5 等,因此最好将数据转换(或生成 - 在合成数据的情况下)为这些格式。以下链接可以帮助您。如果您在 Python 中遇到 import hdf5 的问题,那么您可以参考 页面。

Creating an LMDB file in Python

Writing an HDF5 file in Python

HDF5 more examples