卷積神經網絡各個層級結構,如下圖:
上圖中CNN要做的事情是:給定一張圖片,是車是馬還是飛機未知,現在需要模型判斷這張圖片里具體是一個什麼東西
最左邊是
- 數據輸入層,對數據做一些處理,比如去均值(把輸入數據各個維度都中心化為0,避免數據過多偏差,影響訓練效果)、歸一化(把所有的數據都歸一到同樣的範圍)、PCA/白化等等。CNN只對訓練集做「去均值」這一步
中間是
- CONV:卷積層(Convolutional Layer),線性乘積求和
- RELU:激勵層,ReLU是激活函數的一種
- POOL:池化層(Pooling Layer),簡言之,即取區域平均值或最大(最小)值
最右邊是
- FC:全連接層(Fully-Connected Layer)
卷積計算過程
對圖像(不同的數據窗口數據)和濾波矩陣(一組固定的權重:因為每個神經元的多個權重固定,所以又可以看做一個恆定的濾波器filter)做內積( 逐個元素相乘再求和 )的操作就是所謂的 『卷積』 操作,也是卷積神經網絡的名字來源
舉個具體的例子。比如下圖中,圖中左邊部分是原始輸入數據,圖中中間部分是濾波器filter,圖中右邊是輸出的新的二維數據,右上角是具體的計算過程
在下圖對應的計算過程中,左邊是圖像輸入,中間部分就是濾波器filter(帶著一組固定權重的神經元),不同的濾波器filter會得到不同的輸出數據,比如顏色深淺、輪廓等。如果想提取圖像的不同特徵,則可以用不同的濾波器
在CNN中,濾波器filter(帶著一組固定權重的神經元)對局部輸入數據進行卷積計算。每計算完一個數據窗口內的局部數據後,數據窗口不斷平移滑動,直到計算完所有數據。這個過程中,有這麼幾個參數:
- 深度depth:即神經元個數,決定輸出的depth厚度。同時代表濾波器個數
- 步長stride:決定滑動多少步可以到邊緣
- 填充值zero-padding:在外圍邊緣補充若干圈0,方便從初始位置以步長為單位可以剛好滑倒末尾位置,通俗地講就是為了總長能被步長整除
CS231n課程中有一張卷積動圖
從圖中可以看到:
- 有兩個神經元,即兩個濾波器,depth=2
- 數據窗口每次移動2個步長,取3*3的局部數據,即stride=2
- zero-padding=1
然後分別以兩個濾波器filter為軸滑動數組進行卷積計算,得到兩組不同的結果
- 左邊是輸入(7*7*3中,7*7代表圖像的長寬,3代表RGB三個顏色通道)
- 中間部分是兩個不同的濾波器Filter w0、Filter w1
- 最右邊則是兩個不同的輸出
隨著左邊數據窗口的平移滑動,濾波器Filter w0 / Filter w1對不同的局部數據進行卷積計算
值得一提的是:左邊數據在變化,每次濾波器都是針對某一局部的數據窗口進行卷積,這就是所謂的CNN中的 局部感知 機制。打個比方,濾波器就像一雙眼睛,人類視角有限,一眼望去,只能看到這世界的局部。如果一眼就看到全世界,你會累死,而且一下子接受全世界所有信息,你大腦接收不過來
與此同時,數據窗口滑動,導致輸入在變化,但中間濾波器Filter w0的權重(即每個神經元連接數據窗口的權重)是固定不變的,這個權重不變即所謂的CNN中的 參數(權重)共享 機制
最後提一點,從圖上我們可以看到,每個filter下面都有一個bias,因此要在原來的內積計算結束後,再加上這個bias,得到最終的對應位置值