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
}
}