带有损失层的caffe softmax用于语义分割损失计算

时间:2018-08-02 19:28:19

标签: caffe softmax cross-entropy

softmax_loss_layer.hpp文件上的caffe文档似乎是针对分类任务而非语义分段的。但是,我已经看到该层用于后者。

  1. 在对每个像素进行分类(语义分割)的情况下,输入blob和输出blob的尺寸是多少?
  2. 更重要的是,用于计算损耗的公式如何应用于这些斑点?例如,矩阵/斑点以什么形式排列,最终输出的“损失值”是什么,方程式是什么?

谢谢。

编辑: 我已参考此页面来了解损耗方程的概念,只是不知道如何将其应用于斑点,哪个轴等:http://cs231n.github.io/linear-classify/

这是caffe的文档:caffe softmax with loss description

1 个答案:

答案 0 :(得分:2)

首先,输入Blob的格式应为数据NxKxHxW和标签Nx1XHxW,其中标签Blob中的每个值都是[0-K]中的整数。我认为caffe文档中存在一个错误,其中没有考虑语义分割的情况,而且我不确定K = CHW是什么意思。输出斑点的形状为1x1x1x1,即损耗。

第二,损失函数如下,来自softmax_loss_layer.cpp

loss -= log(std::max(prob_data[i * dim + label_value * inner_num_ + j], Dtype(FLT_MIN)));

打破这一行(用于语义细分)

  1. std::max只是为了确保没有像nan这样的无效输入
  2. prob_data是softmax的输出,如caffe教程中所述,softmax损失层可以分解为softmax层,然后是多项式逻辑损失
  3. i * dim在批次中指定第N张图像,其中批次形状类似于NxKxHxW,其中K是类数
  4. label_value * inner_num_指定了第K个图像,因为在这个阶段,每个班级都有自己的概率“图像”,可以这么说
  5. 最后,j是每个像素的索引

基本上,您希望每个像素的prob_data[i * dim + label_value * inner_num_ + j]尽可能接近1。这意味着该值的负对数将接近0。然后您对该损失进行随机梯度下降。