卷積神經網路詳解 卷積層邏輯篇

2021-08-29 16:13:06 字數 3277 閱讀 3333

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

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

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

其離散的定義為

我對於以上定義的理解為,存在兩個函式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,輸出矩陣的大小為

對於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個過濾器(01. 在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所得。

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

在這個例子中,輸入矩陣為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. 如何通俗易懂地解釋卷積

卷積神經網路 卷積層

1 2 該部落格主要是對網上知識點的學習和整理,方便日後複習。侵刪。卷積神經網路 cnn 一般由輸入層 卷積層 啟用函式 池化層 全連線層組成,即input 輸入層 conv 卷積層 relu 啟用函式 pool 池化層 fc 全連線層 當我們給定乙個 x 的圖案,計算機怎麼識別這個圖案就是 x 呢...

卷積神經網路 卷積神經網路啟用層

在生物意義上的神經元中,只有前面的樹突傳遞的訊號的加權和值大於某乙個特定的閾值的時候,後面的神經元才會被啟用。簡單的說啟用函式的意義在於判定每個神經元的輸出 放在人臉識別卷積神經網路中來思考,卷積層的啟用函式的意義在於這一塊區域的特徵強度如果沒有達到一定的標準,就輸出0,表明這種特徵提取方式 卷積核...

卷積神經網路 定義卷積層

import torch in channels,out channels 5,10 in 決定卷積核的channel out 決定卷積核的個數 width,hight 100,100kernel size 3 卷積核的邊長 卷積核一般為奇數邊長正方形 batch size 1input torch...