卷積層詳述

原文鏈接:https://blog.csdn.net/tjlakewalker/article/details/83275322

本系列文章爲深度學習筆記,方便自己回看。

卷積計算概述

對於圖像識別來說,卷積神經網絡的效果要好於全連接神經網絡。我在首次接觸卷積時,隱約記得在大一高數課程中曾經提及,但具體已經無法名狀。何謂卷積,知乎的這個回答,"如何通俗易懂地解釋卷積" ,解釋得很詳細,摘出部分如下,以方便閱讀。

"從數學上看,卷積是一種運算。我們稱(f*g)(n)爲f,g的卷積,其連續的定義爲

(f\ast g)(n) = \int_{-\infty }^{\infty }f(\tau )g(n-\tau )d\tau

其離散的定義爲

(f\ast g)(n) = \sum_{\tau =-\infty }^{\infty }f(\tau )g(n-\tau )"

我對於以上定義的理解爲,存在兩個函數f(x)和g(x), 其卷積運算(f * g)(n)是指,對f(x)g(y)這樣的乘積進行求和(連續爲積分,離散爲求和),其中x與y需要滿足條件:只能落在二維座標系形如y=n-x的直線上,這是一條斜率-1,與y軸、x軸交點均爲n的直線。更加形象具體的解釋,上面知乎相關的問答有很多不錯的解釋。

在卷積神經網絡中,卷積運算是對兩個矩陣進行的。如下圖,左側爲輸入矩陣M,中間爲過濾器F(也叫卷積核),F以一定步長在M上進行移動,進行點積運算,得到右側的輸出矩陣O。這個就是卷積神經網絡中卷積層最基礎的運算。在實際的操作中,還存在一些額外的操作,下面會詳細敘述。

該圖出自:Convolutional Neural Networks - Basics

輸入層

在使用卷積神經網絡進行圖像識別時,輸入爲進行過轉換的圖片數據,一張寬爲w,高爲h,深度爲d的圖片,表示爲h*w*d。這裏,深度爲圖像存儲每個像素所用的位數,比如彩色圖像,其一個像素有RGB三個分量,其深度爲3。

從數學的角度來看,h*w*d的圖片即爲d個h*w的矩陣。例如6x16x3的圖片,其對應3個6x16的矩陣。在大部分運用中,輸入圖片的大小h和w,一般是相等的。

過濾器(卷積核)

在卷積運算時,會給定一個大小爲F*F的方陣,稱爲過濾器,又叫做卷積核,該矩陣的大小又稱爲感受野。過濾器的深度d和輸入層的深度d維持一致,因此可以得到大小爲F*F*d的過濾器,從數學的角度出發,其爲d個F*F的矩陣。在實際的操作中,不同的模型會確定不同數量的過濾器,其個數記爲K,每一個K包含d個F*F的矩陣,並且計算生成一個輸出矩陣。

一定大小的輸入和一定大小的過濾器,再加上一些額外參數,會生成確定大小的輸出矩陣。以下先介紹這些參數。

1)Padding。在進行卷積運算時,輸入矩陣的邊緣會比矩陣內部的元素計算次數少,且輸出矩陣的大小會在卷積運算中相比較於輸入變小。因此,可在輸入矩陣的四周補零,稱爲padding,其大小爲P。比如當P=1時,原5*5的矩陣如下,藍色框中爲原矩陣,周圍使用0作爲padding。

2)進行卷積運算時,過濾器在輸入矩陣上移動,進行點積運算。移動的步長stride,記爲S。當S=2時,過濾器每次移動2個單元。如下圖,紅色框爲第一步計算,藍色框爲S=2時的第二步運算。

有了以上兩個參數P和S,再加上參數W(輸入矩陣的大小),過濾器的大小F,輸出矩陣的大小爲

(W-F+2P)/S + 1

對於5x5的輸入矩陣,過濾器大小F=3,P=1,S=1,其輸出矩陣的大小爲(5-3+2)/1+1=5。可見,在步長S爲1,且進行了P=1的padding後,其輸出矩陣的大小和輸入一致。

現在考慮當輸入有多個深度時的情況。當輸入爲5x5x3,P=1,並且有K個過濾器時,每一個過濾器都爲3x3x3。這裏,我們把輸入的3個7x7矩陣(5x5進行padding後得到7x7)命名爲M1,M2,M3,第k個過濾器(0<k<K)的3個3x3矩陣命名爲F1,F2,F3,輸出的第k個矩陣(0<k<K)命名爲Ok。卷積運算中,輸入矩陣M1和過濾器F1,M2與F2,M3與F3進行卷積運算。卷積運算詳細過程如下

1. 在M1中,從最左上角,取感受野大小F*F的子矩陣,與F1進行點積運算,即對應位置元素相乘,再求和得到結果O11.

2. M2和F2進行同樣的運算,得到結果O22;M3和F3得到O33.

3. O11+O22+O33相加,再加上偏移量b0,得到輸出矩陣Ok左上角的第一個元素.

4. 按照步長S,從M1,M2,M3中獲取另外一個感受野大小的區域,對應F1,F2,F3進行步驟1~3的計算,最終得到完整的輸出矩陣Ok

5. 更換過濾器k+1,重複1~4的運算,得到K個輸出矩陣。

總結以上過程,輸出矩陣的每一個元素,是由對應過濾器不同深度的矩陣,作用於相應深度輸入矩陣的不同位置,進行點積運算,再加上偏移量bias所得。

在斯坦福的卷積神經網絡課程有,有一個很典型的例子如下。此處分析兩個步驟,完整的例子見以下鏈接。

http://cs231n.github.io/convolutional-networks/

在這個例子中,輸入矩陣爲5*5*3,即W=5,填充P爲1,過濾器有K=2個,每個過濾器的大小爲3*3*3,即F=3,同時設定計算步長S=2。這樣可得到輸出中單個矩陣的大小爲(5-3+2*1)/2+1=3,由於K=2,所以輸出的3*3矩陣有2個。下面爲具體的計算過程

1. 首先從輸入矩陣的最左邊開始取得3*3的感受野,每一個深度的輸入矩陣對應每一個深度的過濾器,進行點積運算,然後加上偏移Bias,得到第一個輸出矩陣的第一個元素。詳細過程爲

輸入矩陣1:r1 = 0*0+0*1+0*1+0*(-1)+1*0+0*0+0*1+0*0+1*0=0

輸入矩陣2:r2 = 0*0+0*0+0*0+0*1+0*0+0*1+0*0+2*0+0*0 = 0

輸入矩陣3:r3 = 0*(-1)+0*(-1)+0*0+0*0+0*0+2*(-1)+0*(-1)+0*0+2*0 = -2

輸出矩陣元素(綠框中元素)O11 = r1+r2+r3+b0 = -1

2) 然後將感受野在3個輸入矩陣上同時移動2個步長,如藍框所示,重複1)中描述的運算,得到O12=-1,計算過程此處不再贅述。

3)將感受野在輸入矩陣中依次移動,當完成第一個輸出矩陣的計算後,使用第二個過濾器再重複一次,得到第二個輸出矩陣。卷積計算完成。

在上面的計算中,每一個深度上的輸入矩陣,其每一個步長的計算都是用同一個過濾器矩陣,這個現象被稱爲參數共享(parameter sharing)。其實這是一種簡化,在未簡化的情況下,同一深度矩陣上每一個步長的卷積計算,都需要使用不同的過濾器,這樣會造成神經網絡中參數過多,所以在實際操作中,會採取如上所述的參數共享策略,減少參數個數。

到此,卷積神經網絡卷積層的計算理論部分已經說完。下面一篇文章將從開發的角度,詳細分析下,在實際的計算中,具體的數據結構和計算方法。

參考文獻:

1. Convolutional Neural Networks (CNNs / ConvNets) 

2. Convolutional Neural Networks - Basics

3. 如何通俗易懂地解釋卷積

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章