1. 程式人生 > >Caffe層系列:Pooling Layer

Caffe層系列:Pooling Layer

Pooling Layer 的作用是將bottom進行下采樣,一般特點是:一個輸入一個輸出

首先我們先看一下 PoolingParameter

message PoolingParameter {
	  enum PoolMethod {   //下采樣方式
	    MAX = 0;   //最大值
	    AVE = 1;  //平均
	    STOCHASTIC = 2;  //隨機
	  }
	  optional PoolMethod pool = 1 [default = MAX]; // The pooling method  預設最大值方式
	  // Pad, kernel size, and stride are all given as a single value for equal
	  // dimensions in height and width or as Y, X pairs.
	  optional uint32 pad = 4 [default = 0]; // The padding size (equal in Y, X)  //填充大小,同時控制x,y填充,預設0
	  optional uint32 pad_h = 9 [default = 0]; // The padding height  //高度方向填充大小 ,預設0
	  optional uint32 pad_w = 10 [default = 0]; // The padding width //寬度方向填充大小,預設0
	  optional uint32 kernel_size = 2; // The kernel size (square)  //核大小  同時控制高度 、寬度方向
	  optional uint32 kernel_h = 5; // The kernel height     //高度方向 核大小
	  optional uint32 kernel_w = 6; // The kernel width    //寬度方向 核大小
	  optional uint32 stride = 3 [default = 1]; // The stride (equal in Y, X)  //步幅大小 同時控制高度、寬度方向
	  optional uint32 stride_h = 7; // The stride height  //高度方向 步幅大小
	  optional uint32 stride_w = 8; // The stride width   //寬度方向 步幅大小
	  enum Engine {    //引擎方式,說白就是呼叫 哪裡實現的該函式  
	    DEFAULT = 0;   //預設 也會指向caffe engine  (個人沒有驗證)
	    CAFFE = 1;     //caffe
	    CUDNN = 2;     //cudnn
	  }
	  optional Engine engine = 11 [default = DEFAULT];
	  // If global_pooling then it will pool over the size of the bottom by doing
	  // kernel_h = bottom->height and kernel_w = bottom->width
	  optional bool global_pooling = 12 [default = false];  //全域性取樣 預設false,在某些分類網路中 常常用到,如mobilenet
}

Pooling layer 在prototxt裡面的書寫:

layer {
	  name: "pool1"   //該層的名稱
	  type: "Pooling"  //該層的型別
	  bottom: "norm1"  //該層的輸入資料blob
	  top: "pool1"   //該層的輸出資料blob
	
	  // 該層的相關引數設定
	  pooling_param {
	    pool: MAX  //pooling型別,預設值為MAX,也可以設定為AVE,STOCHASTIC
	    kernel_size: 3  //pooling核大小,為必設引數
	    stride: 2  //pooling核步長,預設值為1(即重疊),但通常設定為2;
	  }
}

例如MobileNet中的全域性Pooling

layer {
	  name: "pool6"
	  type: "Pooling"
	  bottom: "conv6/sep"   #N*1024*7*7
	  top: "pool6"          #N*1024*1*1
	  pooling_param {
	    pool: AVE
	    global_pooling: true
	  }
}