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 }}不知道這樣說你能不能理解...
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 }}不知道這樣說你能不能理解...