我想我们可能能够编译一些执行多类别分类的方法的含咖啡因的描述。
通过多类别分类,我的意思是:输入数据包含多个模型输出类别的表示和/或简单地在多个模型输出类别下可分类。
例如。对于猫和狗预测类别,包含猫和狗的图像将(理想地)输出~1并且对于所有其他类别输出~0。
[[1,0], # Apple
[0,1], # Baseball
[1,0], # Cat
[0,1]] # Dog
要么
第0列 - 类在输入中
[[1], # Apple
[0], # Baseball
[1], # Cat
[0]] # Dog
如果有什么不清楚,请告诉我,我将生成我想问的问题的图片示例。
好问题。我相信这里没有单一的“规范”答案,你可能会找到几种不同的方法来解决这个问题。我会尽力展示一种可能的方式。它与您提出的问题略有不同,因此我将重新陈述问题并提出解决方案。
问题:给定输入图像和一组C
类,指示每个类是否在图像中描绘。
输入:在训练时间内,输入是图像对和C
-dim二进制向量,指示C
类的每个类(如果它存在于图像中)。
输出:给定图像,输出C
-dim二进制向量(与问题中建议的第二种形式相同)。
让caffe完成工作:为了完成这项工作,我们需要使用不同的损失来修改网络的顶层。
但首先,让我们了解使用caffe的常用方法,然后查看所需的更改。
现在的方式是:图像被送入网络,经过转换/汇集/ ...层,最后通过"InnerProduct"
层输出C
。这些C
预测进入一个"Softmax"
层,抑制除了最主要的类之外的所有。一旦突出显示单个类,"SoftmaxWithLoss"
层将检查突出显示的预测类是否与地面实况类匹配。
你需要什么:现有方法的问题是"Softmax"
层基本上选择一个类。我建议你用一个"Sigmoid"
层替换它,它将每个C
输出映射到一个指示器,指示图像中是否存在这个特定的类。对于训练,你应该使用"SigmoidCrossEntropyLoss"
而不是"SoftmaxWithloss"
层。
由于一个图像可以有多个标签。最直观的方法是将此问题视为C independt二进制分类问题,其中C是不同类的总数。所以很容易理解@Shai have said是什么:
添加一个“Sigmoid”层,将每个C输出映射到一个指示器,指示该特定类是否存在于图像中,并应使用“SigmoidCrossEntropyLoss”而不是“SoftmaxWithloss”层。损失是这些C SigmoidCrossEntropyLoss的总和。