具有用于语义分割损失计算的损失层的caffe softmax
caffe softmax with loss layer for semantic segmentation loss calculation
softmax_loss_layer.hpp
文件中的 caffe 文档似乎是针对分类任务而不是语义分割。但是,我已经看到这一层被用于后者。
- 在对每个像素进行分类(语义分割)的情况下,输入 blob 和输出 blob 的尺寸是多少?
- 更重要的是,计算损失的方程式如何应用于这些斑点?例如,matrices/blobs 的排列形式和最终输出的 "loss value" 是什么形式,其方程式是什么?
谢谢。
编辑:
我参考了这个页面来理解损失方程的概念,只是不知道它是如何应用于斑点、哪个轴等的:http://cs231n.github.io/linear-classify/
这里是caffe的文档:
首先,输入 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)));
打破那条线(用于语义分割):
std::max
只是为了确保没有像 nan
这样的无效输入
prob_data
是softmax的输出,正如caffe教程中解释的那样,softmax损失层可以分解为softmax层,然后是多项逻辑损失
i * dim
指定批次中的第 N
个图像,其中批次形状如下 NxKxHxW
其中 K 是 类 的数量
label_value * inner_num_
指定第K张图片,因为在这个阶段,你的每一张类都有自己的"image"概率,可以说
- 最后,
j
是每个像素的索引
基本上,您希望每个像素的 prob_data[i * dim + label_value * inner_num_ + j]
尽可能接近 1。这意味着它的负对数将接近于 0。这里 log
是以 e
为底的。然后你对该损失进行随机梯度下降。
softmax_loss_layer.hpp
文件中的 caffe 文档似乎是针对分类任务而不是语义分割。但是,我已经看到这一层被用于后者。
- 在对每个像素进行分类(语义分割)的情况下,输入 blob 和输出 blob 的尺寸是多少?
- 更重要的是,计算损失的方程式如何应用于这些斑点?例如,matrices/blobs 的排列形式和最终输出的 "loss value" 是什么形式,其方程式是什么?
谢谢。
编辑: 我参考了这个页面来理解损失方程的概念,只是不知道它是如何应用于斑点、哪个轴等的:http://cs231n.github.io/linear-classify/
这里是caffe的文档:
首先,输入 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)));
打破那条线(用于语义分割):
std::max
只是为了确保没有像nan
这样的无效输入
prob_data
是softmax的输出,正如caffe教程中解释的那样,softmax损失层可以分解为softmax层,然后是多项逻辑损失i * dim
指定批次中的第N
个图像,其中批次形状如下NxKxHxW
其中 K 是 类 的数量
label_value * inner_num_
指定第K张图片,因为在这个阶段,你的每一张类都有自己的"image"概率,可以说- 最后,
j
是每个像素的索引
基本上,您希望每个像素的 prob_data[i * dim + label_value * inner_num_ + j]
尽可能接近 1。这意味着它的负对数将接近于 0。这里 log
是以 e
为底的。然后你对该损失进行随机梯度下降。