【问题标题】:caffe softmax with loss layer for semantic segmentation loss calculationcaffe softmax with loss layer 用于语义分割损失计算
【发布时间】:2019-01-10 15:41:56
【问题描述】:

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

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

谢谢。

编辑: 我参考了这个页面来理解损失方程的概念,只是不知道它是如何应用于 blob、哪个轴等的:http://cs231n.github.io/linear-classify/

这是来自 caffe 的文档:

【问题讨论】:

    标签: caffe softmax cross-entropy


    【解决方案1】:

    首先,输入 blob 的格式应为数据 NxKxHxW 和标签 Nx1XHxW,其中标签 blob 中的每个值都是来自 [0-K] 的整数。我认为 caffe 文档中有一个错误,它没有考虑语义分割的情况,我不确定K = CHW 是什么意思。输出 blob 的形状为 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 指定批次中的 Nth 图像,其中批次形状类似于 NxKxHxW 其中 K 是类数
    4. label_value * inner_num_ 指定第 K 个图像,因为在这个阶段,你的每个类都有自己的概率“图像”,可以这么说
    5. 最后j是每个像素的索引

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

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2018-11-04
      • 2020-02-17
      • 2021-07-30
      • 2020-02-29
      • 2017-12-07
      • 2017-06-26
      • 2016-07-16
      • 2017-07-24
      相关资源
      最近更新 更多