caffe中怎麼固定前面的網路引數,訓練後面層的引數
阿新 • • 發佈:2019-01-01
1、會更新,finetune的過程相當於繼續訓練,跟直接訓練的區別是初始化的時候:
a. 直接訓練是按照網路定義指定的方式初始化(如高斯隨機初始化)
b. finetune是用你已經有的引數檔案來初始化(就是之前訓練好的caffemodel)
2、嗯,這個問題有兩種情況:比如有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://zhidao.baidu.com/question/363059557656952932.html