卷积神经网络——池化层学习——最大池化
池化層(Pooling layers)
除了卷積層,卷積網絡也經常使用池化層來縮減模型的大小,提高計算速度,同時提高所提取特征的魯棒性,我們來看一下。
先舉一個池化層的例子,然后我們再討論池化層的必要性。
假如輸入是一個4×4矩陣,用到的池化類型是最大池化(max pooling)。
執行最大池化的樹池是一個2×2矩陣。
執行過程非常簡單,把4×4的輸入拆分成不同的區域,我把這個區域用不同顏色來標記。
對于2×2的輸出,輸出的每個元素都是其對應顏色區域中的最大元素值。
左上區域的最大值是9,右上區域的最大元素值是2,左下區域的最大值是6,右下區域的最大值是3。
為了計算出右側這4個元素值,我們需要對輸入矩陣的2×2區域做最大值運算。
這就像是應用了一個規模為2的過濾器,因為我們選用的是2×2區域,步幅是2,這些就是最大池化的超參數。
因為我們使用的過濾器為2×2,最后輸出是9。
然后向右移動2個步幅,計算出最大值2。
然后是第二行,向下移動2步得到最大值6。
最后向右移動3步,得到最大值3。
這是一個2×2矩陣,即f=2,步幅是2,即s=2。
這是對最大池化功能的直觀理解,你可以把這個4×4區域看作是某些特征的集合,也就是神經網絡中某一層的非激活值集合。
數字大意味著可能探測到了某些特定的特征,左上象限具有的特征可能是一個垂直邊緣,一只眼睛,或是大家害怕遇到的CAP特征。
顯然左上象限中存在這個特征,這個特征可能是一只貓眼探測器。
然而,右上象限并不存在這個特征。
最大化操作的功能就是只要在任何一個象限內提取到某個特征,它都會保留在最大化的池化輸出里。
所以最大化運算的實際作用就是,如果在過濾器中提取到某個特征,那么保留其最大值。
如果沒有提取到這個特征,可能在右上象限中不存在這個特征,那么其中的最大值也還是很小,這就是最大池化的直觀理解。
必須承認,人們使用最大池化的主要原因是此方法在很多實驗中效果都很好。
盡管剛剛描述的直觀理解經常被引用,不知大家是否完全理解它的真正原因,不知大家是否理解最大池化效率很高的真正原因。
其中一個有意思的特點就是,它有一組超參數,但并沒有參數需要學習。
實際上,梯度下降沒有什么可學的,一旦確定了f和s,它就是一個固定運算,梯度下降無需改變任何值。
我們來看一個有若干個超級參數的示例,輸入是一個5×5的矩陣。
我們采用最大池化法,它的過濾器參數為3×3,即f=3,步幅為1,s=1,輸出矩陣是3×3。
之前講的計算卷積層輸出大小的公式同樣適用于最大池化,
即(n+2p-f)/s+1,這個公式也可以計算最大池化的輸出大小。
此例是計算3×3輸出的每個元素,我們看左上角這些元素,注意這是一個3×3區域,因為有3個過濾器,取最大值9。
然后移動一個元素,因為步幅是1,藍色區域的最大值是9。
繼續向右移動,藍色區域的最大值是5。
然后移到下一行,因為步幅是1,我們只向下移動一個格,所以該區域的最大值是9。
這個區域也是9。
這兩個區域的最大值都是5。
最后這三個區域的最大值分別為8,6和9。
超參數f=3,s=1,最終輸出如圖所示。
以上就是一個二維輸入的最大池化的演示,如果輸入是三維的,那么輸出也是三維的。
例如,輸入是5×5×2,那么輸出是3×3×2。
計算最大池化的方法就是分別對每個通道執行剛剛的計算過程。
如上圖所示,第一個通道依然保持不變。
對于第二個通道,我剛才畫在下面的,在這個層做同樣的計算,得到第二個通道的輸出。
一般來說,如果輸入是5×5×n_c,輸出就是3×3×n_c,n_c個通道中每個通道都單獨執行最大池化計算,以上就是最大池化算法。
func MaxPooling(data [][]float64, pool_size int, step int)([][]float64){result := [][]float64{}for i := 0; i < len(data) - pool_size + 1; i += step{temp := []float64{}for j := 0; j < len(data[0]) - pool_size + 1; j += step{var max_num float64 = 0for cur_i := i; cur_i < i + pool_size; cur_i++{for cur_j :=j; cur_j < j + pool_size; cur_j++{max_num = math.Max(max_num, data[cur_i][cur_j])}}temp = append(temp, max_num)}result = append(result, temp)}return result }總結
以上是生活随笔為你收集整理的卷积神经网络——池化层学习——最大池化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么Go没有三元运算符
- 下一篇: Linux把应用放在桌面上