【caffe】caffe層解讀系列——slice和concat實現MultiTask

轉載地址:http://blog.csdn.net/shuzfan/article/details/54565776


最近一段時間MultiTask網絡比較流行,比如做人臉檢測的時候,一個網絡完成(人臉和非人臉)二分類任務的同時也要進行boudingbox迴歸或者人臉關鍵點回歸。

以人臉檢測MTCNN爲例,一個網絡包含三個任務。訓練的時候,一個batch中的圖片,一部分用於二分類、一部分用於boundingbox 迴歸,一部分用於關鍵點回歸。這種較複雜的樣本組合完全可以通過slice和concat層來快速實現。

———————— Concat —————————

concat層實現輸入數據的拼接。
該層有兩個相同作用的參數:

message ConcatParameter {
  //指定拼接的維度,默認爲1即以channel通道進行拼接;支持負索引,即-1表示最後一個維度
  optional int32 axis = 2 [default = 1];

  // 以後會被棄用,作用同axis一樣,但不能指定爲負數
  optional uint32 concat_dim = 1 [default = 1];
}

    caffe中數據通常爲4個維度,即 num×channels×height×width,因此默認值1表示channels通道進行拼接。

    使用方法如下

    layer {
      name: "data_all"
      type: "Concat"
      bottom: "data_classfier"
      bottom: "data_boundingbox"
      bottom: "data_facialpoints"
      top: "data_all"
      concat_param {
        axis: 0
      }
    }

      除了拼接維度外的其它維度都必須相等。比如上面,輸入圖像均爲 24×24×3

      ————————— Slice —————————

      既然有合併,那麼相應的也有拆分。slice層共有三個參數:

      message SliceParameter {
        // 下面兩個指定沿哪個維度進行拆分,默認拆分channels通道
        optional int32 axis = 3 [default = 1];
        optional uint32 slice_dim = 1 [default = 1];
      
        // 指定拆分點
        repeated uint32 slice_point = 2;
      }

        現在我們就要把之前concat合併的數據按照原樣拆分:

        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

          ————————— MultiTask —————————

          下面直接給一張網絡結構圖,大家就應該知道怎麼實現多數據MultiTask了。

          這裏寫圖片描述

          發表評論
          所有評論
          還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
          相關文章