我认为我们可能能够编译一些执行多类别分类的方法的含咖啡因的描述。
通过多类别分类,我的意思是:输入数据包含多个模型输出类别的表示和/或只是在多个模型输出类别下可分类。
E.g。包含猫和猫的图像对于猫和猫来说,狗会输出(理想情况下)〜1狗预测类别,所有其他类别为~0。
基于this paper,this stale and closed PR和this open PR,似乎caffe完全有能力接受标签。这是对的吗?
构建这样的网络是否需要使用多个神经元(内积 - > relu - >内积)和softmax层,如page 13 of this paper;还是Caffe的ip& softmax目前支持多个标签尺寸?
当我将标签传递给网络时,哪个例子会说明正确的方法(如果不是两者)?:
E.g。猫吃苹果注意: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
如果有任何不清楚的地方,请告诉我,我会生成我试图提出的问题的图片示例。
答案 0 :(得分:9)
好问题。我相信没有单一的"规范"回答这里,您可能会找到几种不同的方法来解决这个问题。我会尽力展示一种可能的方式。它与您提出的问题略有不同,因此我将重新陈述问题并提出解决方案。
问题:给定输入图像和一组C
类,如果图像中描绘了,则为每个类指示。
输入:在培训时间内,输入是图像对和C
- dim 二进制向量,表示C
的每个类如果它存在于图像中,则为类。
输出给定图像,输出C
- 暗淡的二进制向量(与问题中建议的第二种形式相同)。
让caffe完成工作:为了完成这项工作,我们需要使用不同的损失来修改网络的顶层。
但首先,让我们了解使用caffe的常用方法,然后查看所需的更改
现在的方式:图像被送入网络,经过conv / pooling / ...层,最后通过"InnerProduct"
层输出C
。这些C
预测进入"Softmax"
层,禁止除了最主要的类之外的所有类。一旦突出显示单个类"SoftmaxWithLoss"
,图层将检查突出显示的预测类是否与基础真值类匹配。
您需要什么:现有方法的问题是基本上选择单个类的"Softmax"
层。我建议您使用"Sigmoid"
图层替换,将{em> C
输出的每个映射到图像中是否存在此特定类的指示符。对于培训,您应使用"SigmoidCrossEntropyLoss"
代替"SoftmaxWithloss"
图层。
答案 1 :(得分:0)
因为一个图像可以有多个标签。最直观的方法是将此问题视为C independt二进制分类问题,其中C是不同类的总数。因此很容易理解@Shai have said:
添加" Sigmoid"将每个C输出映射到一个指示器,该指示器是否在图像中存在该特定类,并且应该使用" SigmoidCrossEntropyLoss"而不是" SoftmaxWithloss"层。 损失是这些C SigmoidCrossEntropyLoss的总和。