param_need_backward, layer_need_backward_ и blob_need_backward_ в Caffe - PullRequest
0 голосов
/ 30 августа 2018

В моих сетях есть слои D->C1,R1,C11,R11->P1->C2,R2->loss. D для данных, C для Conv, R для Relu и P для пула.

Я установил C1, C2 с lr_mult = 0 и decay_mult = 0.

Те слои, которые я не хочу обратно распространять.

Когда я смотрю на param_need_backward, layer_need_backward_ and blob_need_backward_ массивы в Net Init (Net :: Init (const NetParameter & in_param)

param_need_backward для C1 и C2 неверно.

Но layer_need_backward_ and blob_need_backward_ для C2 истинны, а layer_need_backward_ and blob_need_backward_ для C1 ложны.

То, что он делает, это слой C2, который все еще выполняет обратное распространение, но не обновляет его весовые коэффициенты. Но для C1 обратное распространение вообще пропускает этот слой C1.

Правильно ли мое понимание?

Массив

params_lr_ имеет все значения lr_mult. Где используются эти значения?

EDIT:

Согласно Conv_layer.cpp

if (this->param_propagate_down_[0] || propagate_down[i]) {
      for (int n = 0; n < this->num_; ++n) {
        // gradient w.r.t. weight. Note that we will accumulate diffs.
        if (this->param_propagate_down_[0]) {
          this->weight_cpu_gemm(bottom_data + n * this->bottom_dim_,
              top_diff + n * this->top_dim_, weight_diff);
        }
        // gradient w.r.t. bottom data, if necessary.
        if (propagate_down[i]) {
          this->backward_cpu_gemm(top_diff + n * this->top_dim_, weight,
              bottom_diff + n * this->bottom_dim_);
        }
      }
    }

param_propagate_down_ [0] является flase, если lr_mult = 0 и веса не обновляются.

Но пропагат_down [i] имеет значение true, поэтому слой все еще распространяется вниз.

...