c++ - Caffe SigmoidCrossEntropyLoss层多标签分类c++

标签 c++ neural-network deep-learning caffe conv-neural-network

我有一个网络,它获取 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 输出概率)?

最佳答案

  1. 您是对的:您案例中的标签应该是二进制 9 vector 。

  2. 损失层的输出是标量损失值。当您训练网络时,您应该预计该值会减少。对于预测(测试时间),您应该用简单的 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/

相关文章:

python - 神经网络中权重的更新

neural-network - 深度网络在多输入多输出模型中辅助输出的意义

python - 在 python 中构建自定义 Caffe 层

c++ - 从 txt 文件读取时,我的程序不会移动到下一行

c++ - 在C++中的共享内存中创建循环缓冲区

python - 显示图像时尺寸无效

machine-learning - caffe hdf5 H5LTfind_dataset(file_id, dataset_name_) 找不到HDF5数据集

python - TensorFlow:沿轴的张量的最大值

c++ - 使用 "namespace foo {"而不是在头文件之外明确限定

c++ - 这个模数我做错了什么?