Caffe 错误 - 数据转换器检查失败:datum_channels > 0(0 与 0)



如果有人知道此错误消息中三个数字中的每一个的确切含义,那么我肯定会喜欢描述,这样我就可以避免对data_transformer.cpp代码进行审核。

是的,我理解错误的粗略笔触......LMDB条目和读取条目的Caffe数据层之间的不匹配。 但是为了修复错误,我需要了解错误消息中第一个零的含义。 第二个零,第三个。

上下文

  • Caffe 数据层正在从 LMDB 源读取
  • LMDB 条目包含自定义的非图像数据,包括 (c x h x w( 1 x 1024 x 300 浮点值
I0816 20:28:34.749409 103 layer_factory.hpp:77] Creating layer data
I0816 20:28:34.768201 103 db_lmdb.cpp:35] Opened lmdb ../data/emails/inbox
I0816 20:28:34.768442 103 net.cpp:84] Creating Layer data
I0816 20:28:34.768995 103 net.cpp:380] data -> data
I0816 20:28:34.769502 103 net.cpp:380] data -> label
F0816 20:28:34.770326 103 data_transformer.cpp:465] Check failed: datum_channels > 0 (0 vs. 0)

更新

我求助于Caffe正在读取的LMDB记录的字节级清理,以了解此错误的原因。 下面是一个示例记录:

键 = 字符串值"00000000_">

记录包括序列化标头和行主形式的数据。为方便起见,所有值均采用十进制形式:

页眉

字节 0 = 8 字节 1 = 1(
  1. 类型为 int32 的字段 1 = 1(
  2. 字节 2 = 16 字节 3 = 128 字节 4 = 8(类型为 int32 的字段 2 = 1024(
  3. 字节 5 = 24 字节 6 = 172 字节 7 = 2(类型为 int32 的字段 3 = 300(
  4. 字节 8 = 40 字节 9 = 0(类型为 int32 的字段 5 = 0(
  5. 字节 10 = 56 字节 11 = 0(布尔类型的字段 7 = 0(

数据(第一行 300 个浮点值中的前三个浮点值(

    字节
  1. 12 = 53 字节 13 = 64 字节 14 = 164 字节 15 = 95 字节 16 = 190
  2. 字节 17 = 53 字节 18 = 176 字节 19 = 254 字节 20 = 143 字节 21 = 190
  3. 字节 22 = 53 字节 23 = 24 字节 24 = 96 字节 25 = 191 字节 26 = 62

Field = 53 表示随后四个字节中的固定长度、32 位浮点值。 这些值是非 VarInt 的,并且采用(或应该是(小端序形式。

除非我忽略了一些完全基本的东西,否则为什么 Caffe 会在这个数据流中看到零通道?

data_transformer.cpp中的这一行会引发您的错误:

CHECK_GT(datum_channels, 0);

Caffe 检查从 LMDB 读取的Datum是否有效。失败的检查正在验证datum_channels严格大于零。
您的错误意味着您有一个"空"基准:一个通道为零的条目。

我建议您检查一下 lmdb 并验证所有条目是否有效。

LMDB环境不能有多个数据库,否则Caffe将不知道该怎么做,尝试读取第一个数据库的信息,并在信息不是预期的caffe.proto格式时抛出上述错误。

由于遗留原因,我的 LMDB 环境设置为具有命名数据库,这意味着还存在一个包含数据库名称的单独数据库。 因此,即使一个具有感兴趣数据的数据库驻留在指定的文件路径中,实际上也有两个数据库。 Caffe 正在读取第一个非 Caffe 数据数据库。

底线:没有命名的 LMDB 数据库!

最新更新