C++ Caffe的Softmax层如何计算概率值?
有人知道在Caffe softmax层中发生了什么计算吗 我使用的是一个经过预培训的网络,网络末端有一个softmax层 在测试阶段,对于图像的简单转发,第二个最后一层(“InnerProduct”)的输出如下: -0.20095、0.39989、0.22510、-0.36796、-0.21991、0.43291、-0.22714、-0.22229、-0.08174、0.01931、-0.05791、0.21699、0.00437、-0.02350、0.02924、-0.28733、0.19157、-0.04191、-0.07360、0.30252 最后一层的(“Softmax”)输出为以下值: 0.00000、0.44520、0.01115、0.00000、0.00000、0.89348、0.00000、0.00000、0.00002、0.00015、0.00003、0.00940、0.00011、0.00006、0.00018、0.00000、0.00550、0.00004、0.00002、0.05710 如果我在内积层的输出上应用Softmax(使用外部工具,如matlab),我会得到以下值: 0.0398,0.0726,0.0610,0.0337,0.0391,0.0751,0.0388,0.0390,0.0449,0.0496,0.0460,0.0605,0.0489,0.0476,0.0501,0.0365,0.0590,0.0467,0.0452,0.0659 后者对我来说很有意义,因为概率加起来是1.0(请注意,Caffe的Softmax层值之和大于1.0) 显然,Caffe中的softmax层不是直接的softmax操作 (我不认为这有什么区别,但我只想提一下,我使用的是经过预培训的flickr风格的网络,请参见描述) 编辑: 下面是proto txt中最后两层的定义。请注意,最后一层的类型是“Softmax”C++ Caffe的Softmax层如何计算概率值?,c++,caffe,softmax,C++,Caffe,Softmax,有人知道在Caffe softmax层中发生了什么计算吗 我使用的是一个经过预培训的网络,网络末端有一个softmax层 在测试阶段,对于图像的简单转发,第二个最后一层(“InnerProduct”)的输出如下: -0.20095、0.39989、0.22510、-0.36796、-0.21991、0.43291、-0.22714、-0.22229、-0.08174、0.01931、-0.05791、0.21699、0.00437、-0.02350、0.02924、-0.28733、0.1915
你得到的结果很奇怪。
“Softmax”
层的转发
方法执行的操作如下:
(请注意,执行前两个步骤是为了防止计算溢出)。您可以自己阅读代码:“softmax”不计算概率。它根本不可能,因为您发现它甚至没有强制所有输出的总和是softmax单元测试在您的caffe版本上通过了吗?@Shai Yes所有测试都成功完成了。为了在这里澄清我自己,我并不认为Caffe中存在bug或其他东西。我只想知道Softmax层中发生了什么操作。@Shai我检查了代码,不能说我理解发生了什么。大多数评论都描述了softmax操作(“…减去最大值”、“求幂”、“exp后求和”、“除法”),但也会发生一些缩放。我不认为原因是数值稳定性(不管怎样,算法都是稳定的)。不过,它确实可以防止溢出:在步骤2之后,所有值都是非正值,因此在步骤3之后,所有值都是非正值。感谢您花时间回答并澄清这些步骤。这就是我所做的,我没有得到与Caffe的Softmax层相同的结果。您可以尝试以下简单的MatLab代码:
v=[-0.20095,0.39989,0.22510,-0.36796,-0.21991,0.43291,-0.22714,-0.22229,-0.08174,0.01931,-0.05791,0.21699,0.00437,-0.02350,0.02924,-0.28733,0.19157,-0.04191,0.07360,0.30252];v=v-r_最大值;v_exp=exp(v);v_exp_sum=总和(v_exp);v_softmax=v_exp./v_exp_sum;disp(v_softmax)
我的MatLab代码与你建议的有什么不同吗?@GrimFix这就是为什么我说你的结果是wierd@GrimFix我也有同样的行为。你对此有什么见解吗?我认为这可能与SoftMax的“axis”属性有关(我在Caffe层描述的某个地方读到了这个参数)。
layer {
name: "fc8_flickr"
type: "InnerProduct"
bottom: "fc7"
top: "fc8_flickr"
param {
lr_mult: 10
decay_mult: 1
}
param {
lr_mult: 20
decay_mult: 0
}
inner_product_param {
num_output: 20
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "prob"
type: "Softmax"
bottom: "fc8_flickr"
top: "prob"
}