【问题标题】:Caffe SigmoidCrossEntropyLoss Layer Multilabel classification c++Caffe SigmoidCrossEntropyLoss 层多标签分类 c++
【发布时间】:2017-03-15 15:26:05
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:
    1. 您是对的:您的情况下的标签应该是二进制 9 向量。

    2. 损失层的输出是一个标量损失值。当你训练你的网络时,你应该期望这个值会降低。对于预测(测试时间),您应该用简单的 sigmoid 层替换 sigmoid 损失层。某个 sigmoid 层的输出是一个 9 向量,每个条目代表相应类存在的概率。
      deploy.prototxt 中的输出层应如下所示:

      layer {
        type: "Sigmoid"
        name: "class_prob"
        bottom: "classes"
        top: "class_prob"
      }
      

    【讨论】:

    • 太棒了,这真的很有帮助,您能否发布一个示例,说明在这种情况下 prototxt 文件的外观,然后您的答案会更完整,我可以标记它。
    • 是否也可以获得EuclideanLoss层的概率分布? @Shai @Poka Yoke
    • @thigi 通过欧几里得损失学习的回归值的概率是什么意思??
    • 对于分类,您有所有类的概率分布。假设您有 9 个班级,每个班级都有概率。但是,对于 EuclideanLoss,您不必只获得该值的概率。这就是我问的原因。看看这个:classification vs regression。如果你不明白我的意思,这里会更详细地描述这个问题。 @Shai
    猜你喜欢
    • 2019-03-25
    • 2017-03-07
    • 2016-01-18
    • 2017-04-22
    • 2019-04-02
    • 2017-12-28
    • 2019-01-06
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多