Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Caffe的Softmax层如何计算概率值?_C++_Caffe_Softmax - Fatal编程技术网

C++ Caffe的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

有人知道在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”


你得到的结果很奇怪。
“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"
}