我正在尝试为我正在研究的项目从Faster R-CNN构建RPN的实现。我一直在使用某些代码形式here,并尝试遵循paper。为了限制此问题的范围,我将仅着眼于RPN分类部分的缺失。
在本文中,他们使用对数丢失。在我的实现中,我使用二进制交叉熵。尝试使用最小大小为256的小批量数据来平衡正负值,从而使此功能最小化。
在培训期间,我注意到损失的减少非常迅速。我调查并意识到它正在迅速学习猜测图像的角落。图像批号永远不会包含在迷你批处理中。因此,通过最大化拐角的概率,它可以规避损失函数。进一步阅读后,我意识到我不明白为什么此损失函数起作用。
我已经建立了神经网络和一系列将(224, 224, 3)
图像映射到(14, 14, 9, 2)
的函数(注意:image_height / stride = 14
,anchor_sizes * anchor_shapes = 9
)。最后一维中的成对点分别对应于有效性(是否是我的样本的一部分?)和奇偶校验(正锚或负锚)。
我的损失函数如下:
loss = lambda_rpn_class * K.sum(y_true[...,0] *
K.binary_crossentropy(y_true[...,1], y_pred[:,:,:,:,0]))
/ K.sum(epsilon + y_true[...,0])
y_true.shape = (?, 14, 14, 9, 2)
和y_pred.shape = (?, 14, 14, 9, 1)
所在的位置。我正在尝试通过关闭无效样品的损失来模拟迷你批次。
您能帮我理解为什么本文中的损失函数在理论上起作用吗?我的方法与本文相符时是否存在逻辑问题?还是可以假设还有其他情况?