1. 程式人生 > >caffe的網路層結構(1)

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個維度,即 

th">num×channels×height×width,因此預設值1表示channels通道進行拼接。

  • 選擇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