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

标签 caffe softmax cross-entropy

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

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

谢谢。

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

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

最佳答案

首先,输入 blob 的格式应为 data 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指定N批处理中的第一个图像,其中批处理形状如下 NxKxHxW其中 K 是类别数
  4. label_value * inner_num_指定第 K 个图像,因为在这个阶段,每个类都有自己的概率“图像”,可以这么说
  5. 最后,j是每个像素的索引

基本上,你想要prob_data[i * dim + label_value * inner_num_ + j]每个像素都尽可能接近 1。这意味着其负对数将接近 0。此处 log是基地e 。然后对该损失进行随机梯度下降。

关于带损失层的caffe softmax用于语义分割损失计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51660884/

相关文章:

machine-learning - 在测试阶段计算数据 block 的平均值

machine-learning - softmax 和 log-softmax 有什么区别?

tensorflow - 为什么将reduce_mean应用于sparse_softmax_cross_entropy_with_logits的输出?

c++ - Caffe SigmoidCrossEntropyLoss层多标签分类c++

neural-network - 在caffe上使用VGG进行微调

python - 数值稳定的softmax

python - Tensorflow softmax 回归总是预测 1

python - 如何使用 sparse_softmax_cross_entropy_with_logits 在 tensorflow 中实现加权交叉熵损失

machine-learning - 什么是交叉熵?

c++ - 将输入层 reshape 为单 channel 和 multimap 像