caffe里sigmoidCrossEntropyLoss层计算

caffe里sigmoidCrossEntropyLoss层计算forward的时候计算loss并不是按照严格的entropyloss计算的,代码有注释说是为了“stablevversion of loss computation”,这里计算loss有点看不懂,有人知道其中的原理吗?
已邀请:
代码中的写法主要是为了数值计算上的稳定,公式的推导如下:
sigmoid_cross-entropy_loss.jpg

 

刘昕_ICT

赞同来自:

很不直观,我改成了这样:
/*const int num = bottom[0]->num();
  // Stable version of loss computation from input data
  const Dtype* input_data = bottom[0]->cpu_data();
  const Dtype* target = bottom[1]->cpu_data();
  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;*/
  const Dtype* sigmoid_output_data = sigmoid_output_->cpu_data();
  const Dtype* target = bottom[1]->cpu_data();
  Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();
  caffe_sub(count, sigmoid_output_data, target, bottom_diff);
  Dtype loss = caffe_cpu_asum(count, bottom_diff);
  top[0]->mutable_cpu_data()[0] = loss / count;
 
相当于平均L1范误差,从此生活变的更美了。

disheng

赞同来自:

forward中计算损失的代码是
loss -= input_data * (target - (input_data >= 0)) -
        log(1 + exp(input_data - 2 * input_data * (input_data >= 0)))
实际上,当input_data>=0 和input_data<0时,两个表达式在数学上是等价的,之所以这么写是为了让e的指数为负数,以防止溢出。
计算损失的表达式只要用cross entropy公式带入就能够推导出来,需要注意的是input_data是计算sigmoid函数之前的变量,即loss = target*ln(s(input_data))+(1-target)*ln(1-s(input_data)),其中s表示sigmoid函数,ln表示自然对数。

要回复问题请先登录注册