类似于1000 x 1像素图像的数据来自设备。图像中的某个位置可能是1个,2个或更多个对象。
我将建立一个神经网络来检测物体。我想做1,000个输出。每个输出将指示该输出中是否存在对象。 告诉我要使用哪个损失函数。
在我看来,“分类交叉熵”不合适,因为例如:在训练数据中,我将指示对象位于10和90像素处。而且神经网络将预测对象分别为11和89像素。这不是很大的损失。但是对于网络而言,损失将与预测500和900像素的物体一样。
哪种损失函数适合这种情况? 我正在使用Keras
答案 0 :(得分:1)
在对象检测中,我们主要有两个任务-定位和分类。因此,对于两个任务,我们有两个损失-一个是本地化,另一个是分类损失。它是使用IoU(联合的交集)计算的。 更多详细信息here.
答案 1 :(得分:0)
您可以使用二进制交叉熵损失,并将最接近的n-bin设置为地面真实值作为标签。
例如,您有10个像素,地面真实标签为3,并且选择了3个邻居。
在典型的分类交叉熵中,您将使用一键编码矢量将标签设置为以下。
[0 0 1 0 0 0 0 0 0 0]
在我建议的解决方案中,您将使用此
[0 1 1 1 0 0 0 0 0 0]
也可以是这种情况,基本上是采用高斯而不是平面标签。
[0 0.5 1 0.5 0 0 0 0 0 0]
对象检测架构在本质上也与我描述的方式相同。除了使用量化方案之外
[0 1 0 0 0 0 0 0 0](实际像素)
[--1----0--](分为2组,每组5个。您的网络现在只有两个输出。将其视为合并阶段,因为实际像素属于组1。此子网使用二元交叉熵)。
[1 0](第一分类网络输出)
[-1 0](第二阶段可以看作是增量网络,它从第一阶段获取分类的bin值并输出校正值,因为第一个bin锚定在索引2上,因此您需要预测- 1,将其移至索引1。使用平滑的l1损失对该网络进行训练。
现在立即出现问题,如果第1组中有两个对象怎么办?这是一个不幸的问题,在对象检测体系结构中也存在。解决此问题的方法是定义稍微移位和缩放的bin(或锚)位置。这样,您最多可以检测N个对象的一个像素,其中N是在该像素处定义的锚点数。
答案 2 :(得分:0)
如Siddharth所述,您将使用两个损失函数,因为您有回归问题和分类问题。有关更多详细信息,请参见https://www.youtube.com/watch?v=GSwYGkTfOKk。特别要注意这张幻灯片:
也就是说,第一个任务只是对对象是否存在进行分类(逻辑回归损失),而第二个任务找到边界框(平方误差损失)。