池化層參數說明
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1"
top: "pool1"
pooling_param {
pool: MAX #池化方法,默認爲MAX。目前可用的方法有MAX, AVE
kernel_size: 3 #池化的核大小
stride: 2 #池化的步長,默認爲1。一般我們設置爲2,即不重疊。
}
}
caffe池化層對應的參數說明文件,如下:
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)
optional uint32 pad_h = 9 [default = 0]; // The padding height
optional uint32 pad_w = 10 [default = 0]; // The padding width
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 = 1;
CUDNN = 2;
}
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];
}
池化層詳解
池化圖解
Max pooling 與 Average pooling
Global Average pooling
池化層意義
因爲卷積層每次作用在一個窗口,它對位置很敏感。池化層能夠很好的緩解這個問題。它跟卷積類似每次看一個小窗口,然後選出窗口裏面最大的元素,或者平均元素作爲輸出。這樣做爲後續操作減少了運算量,同時能有效避免數據過擬合的現象。pooling
的操作如果採用global
的方式進行,也就是對輸入數據的一整個面進行pool
操作,這種設計方法可以在某種情況下代替全連接層,減少參數的存儲和計算量。例如SqueezeNet
最後一層,ResNet-50
倒數第二層j均採用了global
的ave-pooling
。
max-pool的問題
現在的最大池化層大約去掉了 75% 的激活函數。
空間信息損失:當去掉 75% 的激活函數時,關於其來源的信息就會丟失。
最大池化層無法使用來自多層激活函數的信息。
反向傳播只會提升最大池化的激活函數,即使其他激活函數的值可能出現錯誤。
sort_pool2d
sort_pool2d
的提出旨在儘量多的解決max-pooling上面提到的問題,具體實現方式如下:
設池化之前的層的輸出爲張量 T,大小爲 [B, H, W, C]。定義一個超參數 pool_range
,它可以是 [1,2,3,4] 中的任意一個。pool_range
指定激活函數(按照排列順序保存)的數量。假設要被池化的張量 T 有 4 個激活函數,我首先按照 [a1, a2, a3, a4] 的順序排列它們,其中 a1 ≥ a2 ≥ a3 ≥ a4。接着保留其中的第一個 pool_range
,我稱之爲激活向量。
將 pool_range
的權重向量定義爲 [w{1},…. w{pool_range}]。這裏需要注意的是,如果這些權重中的任何一個是負值,則激活向量按強度排序且採用加權平均的假設將不成立。因此,沒有直接使用權重,而是在權重向量上取一個 softmax
,並將結果乘以激活向量。
其實sort_pool2d
是max-pooling
的一個擴展,假設pool_range=1
對應的便是max-pooling
。具體代碼參考:
sort_pool2d 代碼:https://github.com/singlasahil14/sortpool2d/blob/master/sortpool2d_test.py
sort_pool2d 實現:https://github.com/singlasahil14/sortpool2d/blob/master/sort_pool2d.py
參考
花式池化
https://antkillerfarm.github.io/dl/2017/08/28/Deep_Learning_13.html
新型池化層sort_pool2d實現更快更好的收斂:表現優於最大池化層
http://mp.weixin.qq.com/s/XzOri12hwyOCdI1TgGQV3w