我正在查看Caffe的SigmoidCrossEntropyLoss层和文档的代码,有些困惑。文档将损失函数列为逻辑损失(我可以在此处复制它,但是没有LaTeX,公式会很难读。请查看文档链接,在页面顶部)。
然而,代码本身(
这是因为已经对输入应用了Sigmoid函数吗?然而,即便如此,"
然而,代码本身(
Forward_cpu(...)
)显示了不同的公式。Dtype loss = 0;
for (int i = 0; i < count; ++i) {
loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) -
log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0)));
}
top[0]->mutable_cpu_data()[0] = loss / num;
这是因为已经对输入应用了Sigmoid函数吗?然而,即便如此,"
(input_data[i] >= 0)
"这段代码也让我感到困惑。这些代码似乎代替了文档中的损失公式中的p_hat,后者应该是通过Sigmoid函数压缩的预测值。那么为什么它们只采用二进制阈值呢?更令人困惑的是,这个损失函数预测[0,1]输出,所以除非它100%确定不是,否则"(input_data[i] >= 0)
"将会是1
。请问有人能解释一下这个问题吗?
top[0]
是什么以及为什么要使用top[0]->mutable_cpu_data()[0]
吗?谢谢。 - John