caffe的網路層結構(1)
1、concat層
該層有兩個相同作用的引數:
message ConcatParameter { //指定拼接的維度,預設為1即以channel通道進行拼接;支援負索引,即-1表示最後一個維度 optional int32 axis = 2 [default = 1]; // 以後會被棄用,作用同axis一樣,但不能指定為負數 optional uint32 concat_dim = 1 [default = 1]; }
caffe中資料通常為4個維度,即
- 選擇axis=0,表示在num維度上進行拼接,可表示為:(k1+k2)*C*H*W;
- 選擇axis=1,表示在channel維度上進行拼接,可表示為:N*(k1+k2)*H*W。(對應於上面給出的4個維度)
layer { name: "data_all" type: "Concat" bottom: "data_classfier" bottom: "data_boundingbox" bottom: "data_facialpoints" top:"data_all" concat_param { axis: 0 } }
除了拼接維度外的其它維度都必須相等。比如上面,輸入影象均為 24×24×324×24×3,用於分類的有150張圖片,用於boundingbox迴歸的有50張,用於關鍵點回歸的也有50張,則最後拼接的結果就是 (150+50+50)×3×24×24
2、Slice層
與concat對應的是Slice層,來實現對資料集的拆分:
message SliceParameter { // 下面兩個指定沿哪個維度進行拆分,預設拆分channels通道optional int32 axis = 3 [default = 1]; optional uint32 slice_dim = 1 [default = 1]; // 指定拆分點 repeated uint32 slice_point = 2; }
此處將如上合併的資料集進行拆分:
layer { name: "data_each" type: "Slice" bottom: "data_all" top: "data_classfier" top: "data_boundingbox" top: "data_facialpoints" slice_param { axis: 0 slice_point: 150 slice_point: 200 } }
其中slice_point的個數必須等於top的個數減一。輸入的data_all維度為 250×3×24×24,拆分後的3個輸出的維度依次為 150×3×24×24, 50×3×24×24, 50×3×24×24