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.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 风格网络,请参阅说明 here)。

编辑:

这是 proto txt 中最后两层的定义。请注意,最后一层的类型是“Softmax”。

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"
}

最佳答案

你得到的结果很奇怪。
"Softmax"层的forward方法执行的操作是:

(注意前两步是为了防止计算溢出)

关于c++ - Caffe的Softmax层是如何计算概率值的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44022719/

相关文章:

c++ - boost::iostream::filtering_streambuf 的编译错误

python - 获取 pycaffe 图层名称或 blob 类型

python - 禁止在 PyTorch 神经网络的 CrossEntropyLoss 中使用 Softmax

tensorflow - 如何在单次运行中从 Inception-v3 检索 fc 和 softmax 层的输出?

tensorflow - 全卷积网络的每像素 softmax

c++ - C++ 中集合/容器的接口(interface)/父类(super class)

java - C++ 到 Java : searching a collection efficiently

c++ - 使用 libsodium、randombytes 错误为 iOS 构建 zeromq

python - ImportError: ubuntu16.04 中安装的 caffe 中没有名为 cv2 的模块

machine-learning - 修改GoogLeNet中的Deploy.prototxt