caffe NetState 參數中 level stages解釋

level stages這兩個參數網上沒有太多解釋,但實際上這兩個參數可以一定程度增加網絡的靈活程度,只需要設置幾個數字即可便捷的在網絡初始化階段進行網絡各層的刪減和增加。並且可以便捷的進行網絡層次設置,便於多網絡級聯等操作。

NetState描述網絡的State,在caffe.proto裏的定義如下:

message NetState {
  optional Phase phase = 1 [default = TEST];
  optional int32 level = 2 [default = 0];
  repeated string stage = 3;
}
Phase是個枚舉類型的變量,取值爲{TRAIN, TEST},這個好理解,表示的是網絡的兩個階段(訓練和測試);Level是個整型變量,stage是個字符串變量。
 
NetStateRule描述的是一種規則,在層的定義裏設置,用來決定Layer是否被加進網絡,在caffe.proto裏的定義如下:
message NetStateRule {
  optional Phase phase = 1;
  optional int32 min_level = 2;
  optional int32 max_level = 3;
  repeated string stage = 4;
  repeated string not_stage = 5;
}
net.cpp文件裏的StateMeetsRule函數用來判斷NetState是否符合NetStateRule的規則,滿足規則的纔會被包含在當前網絡中,符合的條件如下:
NetState的phase與NetStateRule的phase一致,一般是Train或Test。
NetState的level(數字)在NetStateRule的[min_level, max_level]區間裏。

NetState的stage(字符)包含NetStateRule所列出的所有stage並且不包含任何一個not_stage。即要包含的放在stage裏,要在當前網絡下去除的放在not_stage裏。

個人感覺,這一設置非常適合於搭建級聯網絡,或者多網絡協同工作等情況。通過設置level,對應不同級聯階段,到了哪個階段包含哪些層就一目瞭然了,不用來回刪加,也不用寫多個文件。stage類似,又增加了一維靈活性。


網絡在初始化的時候會調用函數net.cpp裏的FilterNet函數,根據網絡的NetState以及層的NetStateRule搭建符合規則的網絡。NetState可以在網絡的定義文件(NetParameter)或者在Solver文件(SolverParameter)中定義,具體的可以參考caffe.proto,SolverParameter裏的優先級高於NetParameter。NetStateRule則需要在層的定義(LayerParameter)中設置,LayerParameter提供include和exclude兩種規則,include的優先級高於exclude,有include的時候只看include,符合inlude才被加入;沒有include的時候看exclude,符合exclude的層會被踢出網絡,未設置規則的層則默認加進網絡。
使用NetStateRule的好處就是可以靈活的搭建網絡,可以只寫一個網絡定義文件,用不同的NetState產生所需要的網絡,比如常用的那個train和test的網絡就可以寫在一起。 加上level和stage,用法就更靈活,這裏可以發揮想象力了,舉個例子,如下定義的網絡經過初始化以後'innerprod'層就被踢出去了
state: { level: 2 } 
name: 'example' 
layer { 
  name: 'data' 
  type: 'Data' 
  top: 'data' 
  top: 'label' 
} 
layer { 
  name: 'innerprod' 
  type: 'InnerProduct' 
  bottom: 'data' 
  top: 'innerprod' 
  include: { min_level: 3 } 
} 
layer { 
  name: 'loss' 
  type: 'SoftmaxWithLoss' 
  bottom: 'innerprod' 
  bottom: 'label' 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章