softmax_loss_layer.hpp
文件上的caffe文档似乎是针对分类任务而非语义分段的。但是,我已经看到该层用于后者。
谢谢。
编辑: 我已参考此页面来了解损耗方程的概念,只是不知道如何将其应用于斑点,哪个轴等:http://cs231n.github.io/linear-classify/
答案 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)));
打破这一行(用于语义细分)
std::max
只是为了确保没有像nan
这样的无效输入prob_data
是softmax的输出,如caffe教程中所述,softmax损失层可以分解为softmax层,然后是多项式逻辑损失i * dim
在批次中指定第N
张图像,其中批次形状类似于NxKxHxW
,其中K是类数label_value * inner_num_
指定了第K个图像,因为在这个阶段,每个班级都有自己的概率“图像”,可以这么说j
是每个像素的索引基本上,您希望每个像素的prob_data[i * dim + label_value * inner_num_ + j]
尽可能接近1。这意味着该值的负对数将接近0。然后您对该损失进行随机梯度下降。