1. 程式人生 > >在caffe中固定某些網路引數,只訓練某些層

在caffe中固定某些網路引數,只訓練某些層

實現的關鍵變數是:propagate_down 含義:表示當前層的梯度是否向前傳播
比如有4個全連線層A->B->C->D
    a. 你希望C層的引數不會改變,C前面的AB層的引數也不會改變,這種情況也就是D層的梯度不往前反向傳播到D層的輸入blob(也就是C層的輸出blob 沒有得到梯度),你可以通過設定D層的propagate_down為false來做到。
         propagate_down的數量與輸入blob的數量相同,假如你某個層有2個輸入blob,那麼你應該在該layer的Param裡面寫上兩行:

         propagate_down : 0    # 第1個輸入blob不會得到反向傳播的梯度
         propagate_down : 0    # 第2個輸入blob不會得到反向傳播的梯度
         這樣的話,你這個layer的梯度就不會反向傳播啦,前面的所有layer的引數也就不會改變了
    b. 你希望C層的引數不會改變,但是C前面的AB層的引數會改變,這種情況,只是固定了C層的引數,C層得到的梯度依然會反向傳播給前面的B層。只需要將對應的引數blob的學習率調整為0:

在layer裡面加上param { lr_mult: 0 }就可以了,比如全連線層裡面:
layer {
    type: "InnerProduct"
    param { # 對應第1個引數blob的配置,也就是全連線層的引數矩陣的配置
         lr_mult: 0 # 學習率為0,其他引數可以看caffe.proto裡面的ParamSpec這個型別
    }
    param { # 對應第2個引數blob的配置,也就是全連線層的偏置項的配置

        lr_mult: 0 # 學習率為0
    }

}

https://blog.csdn.net/leibaojiangjun1/article/details/53635482/