我有一个网络,它获取 2 个输入图像,这两个图像属于 9 个类别中的多个类别。我在 Caffe 文档中看到的所有示例都直接从 prototxt 加载输入图像,但我通过 C++ 代码输入信息。
我的输入层如下所示
input: "data"
input_shape{dim:20 dim:6 dim:100 dim:100}
input: "class_label"
input_shape{dim:20 dim:9}
损失层如下所示
layer {
name: "classes"
type: "InnerProduct"
bottom: "ip2"
top: "classes"
param { lr_mult: 1 }
param { lr_mult: 2 }
inner_product_param {
num_output: 9
weight_filler { type: "xavier" }
bias_filler { type: "constant" }
}
}
layer {
name: "class_loss"
type: "SigmoidCrossEntropyLoss"
bottom: "classes"
bottom: "class_label"
top: "class_loss"
}
我的假设是输入应该是一个像这样的流 [0 0 1 0 1 0 1 0 0],其中 1 表示图像属于该类,0 表示不属于该类,这是真的吗?
我的第二个问题是,我应该从 SigmoidCrossEntropyLoss 层的输出中得到什么(例如 SoftmaxWithLoss 输出概率)?
最佳答案
您是对的:您案例中的标签应该是二进制 9 vector 。
损失层的输出是标量损失值。当您训练网络时,您应该预计该值会减少。对于预测(测试时间),您应该用简单的 sigmoid 层替换 sigmoid 损失层。某个 sigmoid 层的输出是一个 9 vector ,每个条目代表相应类存在的概率。
deploy.prototxt
中的输出层应如下所示:layer { type: "Sigmoid" name: "class_prob" bottom: "classes" top: "class_prob" }
关于c++ - Caffe SigmoidCrossEntropyLoss层多标签分类c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40377874/