首先,输入blob应该是表单数据 NxKxHxW 和标签 Nx1XHxW 其中标签blob中的每个值都是一个整数 [0-K] 。我认为在caffe文档中有一个错误,它不考虑语义分割的情况,我不知道是什么 K = CHW 手段。输出blob的形状 1x1x1x1 这是损失。
NxKxHxW
Nx1XHxW
[0-K]
K = CHW
1x1x1x1
其次,损失函数如下,来自 softmax_loss_layer.cpp :
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
i * dim
N
label_value * inner_num_
j
基本上,你想要的 prob_data[i * dim + label_value * inner_num_ + j] 每个像素尽可能接近1。这意味着它的负对数将接近于0.然后你会对该损失进行随机梯度下降。
prob_data[i * dim + label_value * inner_num_ + j]