看到很多的對CNN的改造的文章中都是對pool做東西,最近看到一個隨機池化,就好奇的去看了一下
可以參看這篇文章 Stochastic Pooling for Regularization of Deep Convolutional Neural Networks
在caffe中是支持最大池化,均值池化,隨機池化的
在使用中常見的是mean-pooling和max-pooling,下面就簡單介紹一下stochastic pooling
stochastic pooling方法非常簡單,只需對feature map中的元素按照其概率值大小隨機選擇,即元素值大的被選中的概率也大。而不像max-pooling那樣,永遠只取那個最大值元素。
假設feature map中的pooling區域元素值如下:
3*3大小的,元素值和sum=0+1.1+2.5+0.9+2.0+1.0+0+1.5+1.0=10
方格中的元素同時除以sum後得到的矩陣元素爲:
每個元素值表示對應位置處值的概率,現在只需要按照該概率來隨機選一個,方法是:將其看作是9個變量的多項式分佈,然後對該多項式分佈採樣即可,theano中有直接的multinomial()來函數完成。當然也可以自己用01均勻分佈來採樣,將單位長度1按照那9個概率值分成9個區間(概率越大,覆蓋的區域越長,每個區間對應一個位置),然隨機生成一個數後看它落在哪個區間。
比如如果隨機採樣後的矩陣爲:
則這時候的poolng值爲1.5
使用stochastic pooling時(即test過程),其推理過程也很簡單,對矩陣區域求加權平均即可。比如對上面的例子求值過程爲爲:
0*0+1.1*0.11+2.5*0.25+0.9*0.09+2.0*0.2+1.0*0.1+0*0+1.5*0.15+1.0*0.1=1.625 說明此時對小矩形pooling後的結果爲1.625.
在反向傳播求導時,只需保留前向傳播已經記錄被選中節點的位置的值,其它值都爲0,這和max-pooling的反向傳播非常類似。
下面是原文中給出的一個整體的計算的圖
在計算時的時候train計算主要是進行隨機採樣的方式進行計算,在test時主要是使用概率進行計算的選取哪一個,是均值池化和最大池化的一箇中間
區域吧。
Stochastic pooling優點:
方法簡單;
泛化能力更強;
可用於卷積層(文章中是與Dropout和DropConnect對比的,說是Dropout和DropConnect不太適合於卷積層. 不過個人感覺這沒什麼可比性,因爲它們在網絡中所處理的結構不同)。