在caffe中固定某些網路引數,只訓練某些層
阿新 • • 發佈:2018-12-29
實現的關鍵變數是: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
}
比如有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/