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"
层。
我正在尝试使用 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"
层。