В моих сетях есть слои 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, поэтому слой все еще распространяется вниз.