Caffe 将 python 层中的标签数据处理为 int

Caffe process label data in python layer as int

我正在尝试使用 python 图层制作标签数据。也就是说,我有一个 Caffe 数据的 LMDB 数据库,其中标签由 6 个使用位掩码的标签组成,我需要提取其中一个来学习它。

但是当传递给 MyPythonLayer.forward 方法时,标签字段似乎具有 np.float32 类型并且被四舍五入,以便转换回 int 时具有与原始值不同的值。自然地,它使得使用位掩码提取其中的一部分变得无用。 有什么方法可以强制 Caffe 将标签数据作为 int 传递给 MyPythonLayer.forward?

MyNet.prototxt:

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 1
  }
  data_param {
    source: "SUMTH.../train_lmdb"
    batch_size: 3400
    backend: LMDB
  }
}
...
layer {
  name: 'convert_compose_label_py'
  type: 'Python'
  bottom: 'label'
  top: 'extracted_label'
  python_param {
    module: 'convert_compose_label'
    layer: 'ComposeLabelToSingleLabel'
    param_str: '1'
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "extracted_label"
  top: "loss"
}

模块convert_compose_label.py:

class ComposeLabelToSingleLabel(caffe.Layer):
  ...
  def forward(self, bottom, top):
    batch_size = bottom[0].data.shape[0]
    out_file1 = open(self.log_file1, 'a')
    for i in range(batch_size):
        out_file1.write("%d\n" % bottom[0].data[i]) # result differs from label values in LMDB at 1-2 lowest digits
        single_label = (compose_label.astype(np.int32) >> self.shift) & self.kLabelMask # if not use astype(np.int32) it produces error that >> can not be used with np.float32. 
        top[0].data[i]=single_label # Obviously result is incorrect when self.shift==0
        ...

没有

为什么?

Caffe 将 Datum 中的标签存储为 int,但是当它读取 Datum 并将其“分解”为 "data""label" blobs 值被转换为 float32 因为 Blob 数据类型是(默认)float32.

如果你需要多标签输入到caffe,你可以使用"HDF5Data"层(这样更灵活),或者使用"Python"层。