15

我想我们也许可以对一些执行多类别分类的方法进行 Caffeinated 描述。

多类别分类我的意思是:输入数据包含多个模型输出类别的表示和/或简单地在多个模型输出类别下可分类。

例如,包含猫和狗的图像将(理想情况下)为猫和狗预测类别输出 ~1,为所有其他类别输出 ~0。

  1. 根据这篇论文这个陈旧封闭的 PR这个开放的 PR,似乎 caffe 完全可以接受标签。这个对吗?

  2. 构建这样的网络是否需要使用多个神经元(内积 -> relu -> 内积)和 softmax 层,如本文第 13 页所示;还是 Caffe 的 ip & softmax 目前支持多个标签维度?

  3. 当我将标签传递给网络时,哪个示例可以说明正确的方法(如果不是两者)?:

    例如 猫吃苹果注意:Python 语法,但我使用的是 c++ 源代码。

    列 0 - 类在输入中;第 1 列 - 类不在输入中

    [[1,0],  # Apple
     [0,1],  # Baseball
     [1,0],  # Cat
     [0,1]]  # Dog
    

    或者

    第 0 列 - 类在输入中

    [[1],  # Apple
     [0],  # Baseball
     [1],  # Cat
     [0]]  # Dog
    

如果有任何不清楚的地方,请告诉我,我将生成我试图提出的问题的图片示例。

4

2 回答 2

9

好问题。我相信这里没有单一的“规范”答案,您可能会找到几种不同的方法来解决这个问题。我会尽力展示一种可能的方式。它与您提出的问题略有不同,因此我将重新说明问题并提出解决方案。

问题:给定一个输入图像和一组C类,为每个类指示它是否在图像中被描绘。

输入:在训练时,输入是成对的图像和一个C-dim二进制向量,指示每个类别的C类别是否存在于图像中。

输出:给定图像,输出一个C-dim 二进制向量(与您的问题中建议的第二种形式相同)。

让 caffe 完成这项工作:为了完成这项工作,我们需要使用不同的损失来修改网络的顶层。
但首先,让我们了解使用 caffe 的常用方式,然后研究所需的更改。
现在的情况是:图像被输入网络,经过 conv/pooling/... 层,最后经过"InnerProduct"带有C输出的层。这些C预测进入一个"Softmax"抑制除最主要类别之外的所有类别的层。一旦单个类被突出显示"SoftmaxWithLoss",图层就会检查突出显示的预测类是否与地面实况类匹配。

您需要什么:现有方法的问题是"Softmax"基本上选择单个类的层。我建议您其替换为将每个"Sigmoid"输出映射到指示图像中是否存在此特定类的层。对于训练,您应该使用而不是层。C"SigmoidCrossEntropyLoss""SoftmaxWithloss"

于 2015-10-15T07:38:56.010 回答
0

因为一张图片可以有多个标签。最直观的方法是将此问题视为 C 独立二进制分类问题,其中 C 是不同类别的总数。所以很容易理解@Shai 所说的

添加一个“Sigmoid”层,将每个 C 输出映射到图像中是否存在这个特定类的指示符,并且应该使用“SigmoidCrossEntropyLoss”而不是“SoftmaxWithloss”层。损失是这些 C SigmoidCrossEntropyLoss 的总和。

于 2016-01-25T13:18:06.297 回答