caffe源码分析:layer.hpp分析

文件路径:caffe-master_github/include/caffe/

Backward函数:

template <typename Dtype>
inline void Layer::Backward(const vector*>& top,
    const vector<bool>& propagate_down,
    const vector*>& bottom) {
  switch (Caffe::mode()) {
  case Caffe::CPU:
/*根据blob top 的error 梯度(diff)计算bottom 的 error 梯度。 propagate_down 是长度 和bottom 相同的vector ,用于控制是否需要对对应的bottom 元素传播梯度。具体layer具体定义。*/
    Backward_cpu(top, propagate_down, bottom);
    break;
  case Caffe::GPU:
    Backward_gpu(top, propagate_down, bottom);
    break;
  default:
    LOG(FATAL) << "Unknown caffe mode.";
  }
}

SetLossWeights函数:

 inline void SetLossWeights(const vector*>& top) {
    const int num_loss_weights = layer_param_.loss_weight_size();
    if (num_loss_weights) {
      CHECK_EQ(top.size(), num_loss_weights) << "loss_weight must be "
          "unspecified or specified once per top blob.";
      for (int top_id = 0; top_id < top.size(); ++top_id) {
        const Dtype loss_weight = layer_param_.loss_weight(top_id);
        if (loss_weight == Dtype(0)) { continue; }
        this->set_loss(top_id, loss_weight);
        const int count = top[top_id]->count();
        Dtype* loss_multiplier = top[top_id]->mutable_cpu_diff();
        caffe_set(count, loss_weight, loss_multiplier); //将loss_multiplier设为loss_weight
      }
    }
  }

loss_weight分析:
loss_weight一般只对带有loss的层有意义。一个网络可以有多个loss层,而且每个loss层可以计算多个loss(每个loss放在单独的top blob中,这种情况在caffe中没出现过,caffe的loss层一般只有一个loss,放在top[0]对应的blob里)。整个网络的损失就是这些loss的和,loss_weight指的就是求和过程中每个loss的权重,可以在定义layer的时候加上loss_weight这个参数来指定,设置的时候该层loss_weight的个数需要与top的个数相同,否则就不设置。默认情况下,普通层没有loss_weight, loss层的loss_weight为1。
对于caffe中的loss层,计算出的loss放在top[0]指向的blob里,该blob里的diff存放的就是loss对应的loss_weight,传递过程在Layer的SetUp里通过调用SetLossWeights(top)完成

你可能感兴趣的:(CAFFE)