CS231n 卷積神經(jīng)網(wǎng)絡(luò): 架構(gòu), 卷積/池化層(上)

卷積神經(jīng)網(wǎng)絡(luò): 架構(gòu), 卷積/池化層(上)

卷積神經(jīng)網(wǎng)絡(luò)(CNNs/ConvNets)

卷積神經(jīng)網(wǎng)絡(luò)與普通的神經(jīng)網(wǎng)絡(luò)非常類似:它們都是由神經(jīng)元組成并擁有可以訓(xùn)練的權(quán)值和偏差。整個(gè)網(wǎng)絡(luò)仍然表示一個(gè)可導(dǎo)的評(píng)分函數(shù):從原始的圖片像素開始到各類型的得分結(jié)束。在最后的輸出層它們也都有損失函數(shù)(比如SVM或Softmax),并且普通神經(jīng)網(wǎng)絡(luò)上的技巧同樣能在CNNs中應(yīng)用。

那么什么改變了呢?CNNs假設(shè)輸入都是圖片,這樣允許我們?cè)诩軜?gòu)上能對(duì)特定的屬性編碼,這些變化能夠?qū)崿F(xiàn)和大量減少網(wǎng)絡(luò)中的參數(shù)使前向函數(shù)更有效率。

1.架構(gòu)概覽

回憶之前課程所講的常規(guī)神經(jīng)網(wǎng)絡(luò),網(wǎng)絡(luò)接收一個(gè)向量輸入,然后通過(guò)多個(gè)隱層對(duì)其進(jìn)行變換。每個(gè)隱層由一組神經(jīng)元組成,其中的每個(gè)神經(jīng)元都與前一層的所有神經(jīng)元進(jìn)行全連接,它們的功能都是獨(dú)立的且不共享任何連接。最后一個(gè)被全連接的層叫做輸出層,在分類應(yīng)用中它表現(xiàn)為各類型得分。

常規(guī)的神經(jīng)網(wǎng)絡(luò)不能適應(yīng)完全的圖片數(shù)據(jù)。在CIFAR-10中,圖片的大小只有32x32x3(32像素寬,32像素高,3個(gè)顏色通道),所以常規(guī)神經(jīng)網(wǎng)絡(luò)中在首個(gè)隱層中的一個(gè)全連接神經(jīng)元應(yīng)該有32323=3072個(gè)權(quán)值。這個(gè)數(shù)量看上去可以管理,但是很明顯全連接結(jié)構(gòu)不能適應(yīng)更大的圖片。例如一個(gè)更大分辨率的圖片(200x200x3)會(huì)使神經(jīng)元擁有2002003=120000個(gè)權(quán)值。進(jìn)一步說(shuō),我們顯然需要一些這樣的神經(jīng)元,所以參數(shù)數(shù)量會(huì)快速的上升。很明顯這種情況下全連接是沒用的,而且巨量的參數(shù)會(huì)快速導(dǎo)致過(guò)擬合。

三維神經(jīng)元排列。CNNs改變了輸入是由圖片組成的事實(shí)并使用了一種更明智的架構(gòu)。CNNs層中的神經(jīng)元按3個(gè)維度排列而成:寬度,高度,深度。(注意這里的深度不是網(wǎng)絡(luò)層數(shù))。我們很快會(huì)看到在一個(gè)CNNs層中的神經(jīng)元只連接上一層的一小塊區(qū)域而不是全連接。進(jìn)一步說(shuō),分類CIFAR-10的輸出層的緯度為1x1x10,因?yàn)樵贑NNs架構(gòu)的最后我們將完全的圖片縮減成了一個(gè)各類型得分的向量。

image

普通的三層神經(jīng)網(wǎng)絡(luò)。

image

一個(gè)CNNs將它的神經(jīng)元排列成三維結(jié)構(gòu),每一層將3D數(shù)據(jù)塊轉(zhuǎn)換為3D輸出塊。在這幅圖中,寬和高是圖片的分辨率而深度是圖片的顏色通道數(shù)(紅綠藍(lán))

一個(gè)CNNs由多個(gè)層組成,每個(gè)層擁有一個(gè)簡(jiǎn)單的API:將輸入3D塊用可導(dǎo)的函數(shù)轉(zhuǎn)換為輸出3D塊,函數(shù)中可能有參數(shù)也可能沒有。

2.CNNs中的各種層

如上鎖描述,一個(gè)簡(jiǎn)單的CNNs是由一連串層組成,每個(gè)層通過(guò)一個(gè)可導(dǎo)函數(shù)將一個(gè)塊轉(zhuǎn)換為另一個(gè)塊。我們用三個(gè)主要類型的層來(lái)構(gòu)建CNNs:卷積層(Convolutional Layer),池化層(Pooling Layer)和 全連接層(Fully-Connected Layer)。我們將會(huì)堆疊這些層來(lái)形成一個(gè)完整的CNNs架構(gòu)。

樣例架構(gòu)概覽。我們將會(huì)在下面涉及更多細(xì)節(jié),但是一個(gè)簡(jiǎn)單的分類CIFAR-10的CNNs應(yīng)該有這種架構(gòu)[輸入層-卷積層-RELU層-池化層-全連接層],具體如下:

  • 輸入層(INPUT)[32x32x3]將會(huì)持有原始的圖片像素(32像素寬,32像素高,3個(gè)顏色通道RGB)
  • 卷積層(CONV)將會(huì)計(jì)算輸入中的局部區(qū)域的輸出,每一個(gè)層計(jì)算它的權(quán)值和它連接的局部區(qū)域的點(diǎn)積。結(jié)果可能是一個(gè)大小為[32x32x12]的塊,如果我們選擇用12個(gè)濾波器。
  • ReLU層(RELU)將應(yīng)用激活函數(shù)處理輸入,比如max(0,x),輸出大小不變?yōu)閇32x32x12]。
  • 池化層(POOL)將對(duì)空間維度(寬和高)做下采樣操作,結(jié)果大小可能是[16x16x12]。
  • 全連接層(FC)將會(huì)計(jì)算出各類型得分,結(jié)果的塊大小為[1x1x10]。像它的名字一樣,這一層的所有神經(jīng)元都會(huì)和上一層的所有神經(jīng)元相連。

在這種方式下,CNNs通過(guò)一層又一層操作將原始圖片像素值轉(zhuǎn)換為最終的類型得分。注意一些層是有參數(shù)的而另一些是沒有參數(shù)的。具體來(lái)說(shuō),卷積層和全連接層的變換操作不僅是激活輸入塊,還包括其它參數(shù)(神經(jīng)元的權(quán)重和偏差),而ReLU層和池化層只進(jìn)行固定的操作。卷積層和全連接層中的參數(shù)通過(guò)梯度下降進(jìn)行訓(xùn)練使得CNNs算出的類型得分和訓(xùn)練集中圖片的真實(shí)類型標(biāo)簽一致。

概括:

  • 一個(gè)CNNs架構(gòu)的最簡(jiǎn)單的例子是將圖像塊通過(guò)一連串層轉(zhuǎn)換為輸出塊(比如類型得分向量)
  • 其中有一些不同類型的層(例如CONV/FC/RELU/POOL是最常見的,大寫表示層)
  • 每一層接受一個(gè)3D塊輸入然后通過(guò)一個(gè)可導(dǎo)函數(shù)轉(zhuǎn)換為一個(gè)3D塊輸出
  • 每一層有或沒有參數(shù)(例如CONV/FC有,RELU/POOL沒有)
  • 每一層有或沒有附加的超參數(shù)(例如CONV/FC/POOL有,RELU沒有)
image

這是一個(gè)CNNs架構(gòu)的例子,最左邊的初始?jí)K存儲(chǔ)原始圖片像素,最右邊的輸出塊存儲(chǔ)類型得分,它只顯示了得分最高的5種類型。接下來(lái)我們將描述各個(gè)獨(dú)立的層和各層中的細(xì)節(jié)。

2.1 卷積層(CONV)

卷積層是CNNs的核心構(gòu)建模塊,它承擔(dān)了絕大多數(shù)計(jì)算任務(wù)。

不涉及大腦分析的簡(jiǎn)介 讓我們首先不從分析大腦神經(jīng)元的角度來(lái)討論CONV,它的參數(shù)由一組可學(xué)習(xí)的濾波器組成。每一個(gè)濾波器在空間維度上很?。ū容斎雺K的空間維度?。?,但是延伸到輸入塊的全部深度。例如一個(gè)作用于第一層的大小為5x5x3的濾波器(5像素寬,5像素高,3個(gè)顏色通道)。在向前的方向上,我們用每個(gè)濾波器在輸入塊的空間維度上滑動(dòng)(從左到右,從上到下)并計(jì)算濾波器和當(dāng)前位置的點(diǎn)積。直觀的,網(wǎng)絡(luò)將會(huì)學(xué)習(xí)這些濾波器,它們會(huì)在“看到”(做點(diǎn)積)某些圖片上的特征時(shí)激活,這些特征開始可能是一些局部特征,最后將會(huì)是一些整體特征。每一個(gè)濾波器會(huì)生成一個(gè)2維的激活圖,我們?cè)谏疃染S度上堆疊這些激活圖形成輸出塊。

從大腦的角度分析 如果你是一個(gè)大腦神經(jīng)元分析的發(fā)燒友,3D輸出塊的每一個(gè)點(diǎn)可以解釋為一個(gè)只看輸入中一塊小區(qū)域的神經(jīng)元的輸出,而空間上所有的神經(jīng)元都共享參數(shù)。(因?yàn)檫@些結(jié)果都來(lái)自于一個(gè)相同的濾波器)我們現(xiàn)在討論神經(jīng)元連接,它們空間上的排列和它們共享參數(shù)的細(xì)節(jié)。

局部連接 當(dāng)處理類似圖片的高維度輸入時(shí),全連接是不可行的。取而代之的是只連接輸入塊的一個(gè)局部區(qū)域。這個(gè)連接的空間大小是一個(gè)叫做接受域(receptive field)的超參數(shù)(和濾波器大小相同),而連接的深度總是和輸入塊的深度相同。

image

上圖中,紅色為一個(gè)大小為32x32x3的CIFAR-10圖片的輸入塊,藍(lán)色部分為一個(gè)卷積層的樣例塊。卷積層的每一個(gè)神經(jīng)元只連接輸入塊空間上(寬和高)的一個(gè)局部區(qū)域,但是連接整個(gè)深度。換句話說(shuō),每個(gè)神經(jīng)元就是一個(gè)濾波器和輸入塊上某一局部區(qū)域的點(diǎn)積結(jié)果。

image

普通神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元結(jié)構(gòu)沒變:依舊是計(jì)算權(quán)值和輸入的乘積,然后跟隨一個(gè)非線性單元,只是它們的鏈接被約束在一個(gè)局部區(qū)域。

空間排列 我們已經(jīng)解釋過(guò)CONV層中神經(jīng)元和輸入塊之間的鏈接,但是還沒有討論輸出塊中有多少個(gè)神經(jīng)元以及它們?nèi)绾闻帕?。三個(gè)超參數(shù)控制輸出塊的大?。?strong>深度(depth),步長(zhǎng)(stride)和0填充(zero-padding)。

  1. 首先,輸出塊的深度是一個(gè)超參數(shù),它取決于我們想要用多少個(gè)濾波器,每一個(gè)濾波器學(xué)習(xí)去看輸入中的不同東西。
  2. 其次,我們必須設(shè)定步長(zhǎng)用于滑動(dòng)濾波器。步長(zhǎng)為多少每次就滑動(dòng)多少個(gè)像素,所以步長(zhǎng)越大輸出塊越小。
  3. 我們馬上會(huì)看到,有時(shí)候?yàn)榱朔奖阄覀冃枰谳斎雺K周圍填充0值,這個(gè)0填充的數(shù)量是一個(gè)超參數(shù)。0填充的好處是讓我們能夠控制輸出塊的大小。(最常見的是使輸出塊和輸入塊有相同的寬和高)

我們可以用一個(gè)函數(shù)計(jì)算輸出塊的空間大小,假設(shè)輸入塊大小為(W),CONV層接受域大小為(F),步長(zhǎng)為(S),在邊界上0填充的數(shù)量為(P),公式為(W - F + 2P)/S + 1

image

圖中是一個(gè)空間維度(寬)上的排列,一個(gè)神經(jīng)元的接受域F=3,輸入塊寬度為W=5,0填充數(shù)量為P=1。左邊的圖是步長(zhǎng)S=1的情況,輸出塊寬度為(5-3+2)/1+1=5。右邊的圖是步長(zhǎng)S=2的情況,輸出塊寬度為(5-3+2)/2+1=3。值得注意的是步長(zhǎng)S=3不能使用,因?yàn)?5-3+2)=4不能被3整除。這些黃色神經(jīng)元的權(quán)值為[1,0,-1],偏差為[0,0,0],它們的參數(shù)是共享的。

0填充的使用 在步長(zhǎng)S=1時(shí)設(shè)置0填充P = (F - 1)/2可以使輸出塊和輸入塊在空間上大小一致。

步長(zhǎng)的限制 設(shè)置步長(zhǎng)一定要使(W - F + 2P)/S能夠整除。

共享參數(shù) CONV的輸出塊在一個(gè)深度中共享權(quán)值(濾波器),權(quán)值大小就是接受域大小,輸出塊的深度就是濾波器的數(shù)目。

image

上圖中為96個(gè)大小為[11x11x3]的濾波器,輸出塊同一深度上的所有神經(jīng)元共享它們中的一個(gè)。

注意有時(shí)候參數(shù)共享的假設(shè)可能沒有意義。一個(gè)實(shí)際的例子是在人臉識(shí)別中,人臉在圖片中央,而眼部特征、鼻子特征等都在不同的區(qū)域。這種情況下每個(gè)濾波器沒有必要在整個(gè)輸入塊上滑動(dòng),此時(shí)CONV層變?yōu)?strong>局部連接層(Locally-Connected Layer)。

Numpy例子 假設(shè)輸入塊X大小為X.shape:(11,11,4),0填充P=0,濾波器F=5,步長(zhǎng)S=2,這時(shí)輸出塊的空間大小為(11-5)/2+1=4,寬和高都為4。下面是輸出塊(V)的部分結(jié)果:

  • V[0,0,0] = np.sum(X[:5,:5,:] * W0) + b0
  • V[1,0,0] = np.sum(X[2:7,:5,:] * W0) + b0
  • V[2,0,0] = np.sum(X[4:9,:5,:] * W0) + b0
  • V[3,0,0] = np.sum(X[6:11,:5,:] * W0) + b0

W0為第一個(gè)濾波器的權(quán)值,大小為W0.shape: (5,5,4),第二個(gè)濾波器的部分結(jié)果為:

  • V[0,0,1] = np.sum(X[:5,:5,:] * W1) + b1
  • V[1,0,1] = np.sum(X[2:7,:5,:] * W1) + b1
  • V[2,0,1] = np.sum(X[4:9,:5,:] * W1) + b1
  • V[3,0,1] = np.sum(X[6:11,:5,:] * W1) + b1

有多少個(gè)濾波器,輸出塊V的第三維深度就有多大。

概要 概括一下CONV層的概念:

  • 輸入塊大小W_1 \times H_1 \times D_1
  • 需要4個(gè)超參數(shù):
    • 濾波器數(shù)量K
    • 濾波器大小F
    • 步長(zhǎng)S
    • 0填充數(shù)量P
  • 輸出塊大小為W_2 \times H_2 \times D_2
    • W_2 = (W_1 - F + 2P)/S + 1
    • H_2 = (H_1 - F + 2P)/S + 1
    • D_2 = K
  • 每個(gè)濾波器有F \cdot F \cdot D_1個(gè)權(quán)值,CONV層總共有(F \cdot F \cdot D_1) \cdot K個(gè)權(quán)值和K個(gè)偏差。
  • 輸出塊在第d層深度上的切片(大小為W_2 \times H_2)是第d個(gè)濾波器以S的步長(zhǎng)和偏差d在輸入塊上做卷積的結(jié)果。

一般的超參數(shù)設(shè)置為F=3,S=1,P=1。

image

上圖是一個(gè)用兩個(gè)濾波器做卷積的例子。

用矩陣乘法實(shí)現(xiàn) 注意卷積操作本質(zhì)上是將濾波器和輸入的局部區(qū)域做點(diǎn)積,通常的實(shí)現(xiàn)方式如下:

  1. 將輸入的局部區(qū)域拉伸成一列,我們稱為im2col操作。例如假設(shè)輸入大小為[227x227x3]且將被大小為[11x11x3]的濾波器以步長(zhǎng)4進(jìn)行卷積。我們將輸入中的每個(gè)將要做點(diǎn)積的[11x11x3]塊拉伸為一個(gè)11113=363的列,迭代這一操作得到長(zhǎng)寬都為(227-11)/4+1=55的輸出塊X_row,大小為[3025x363]。注意每個(gè)大小為363的列中的數(shù)據(jù)有重疊。
  2. 將每個(gè)大小為[11x11x3]的濾波器也拉伸成一列,假如有96個(gè)濾波器,那么得到輸出W_col大小為[363x96]。
  3. 然后將X_rowW_col做矩陣乘法np.dot(X_row, W_col),得到輸出大小為[3025x96]。
  4. 最后將輸出變形為[55x55x96]。

這種方法有個(gè)缺點(diǎn)是會(huì)使用很多內(nèi)存,因?yàn)?code>X_row中會(huì)有很多重復(fù)元素。盡管如此,它帶來(lái)的好處是矩陣乘法有很多十分高效的實(shí)現(xiàn)(比如 BLAS API)。 而且im2col的這種思想在接下來(lái)的池化層也會(huì)用到。

反向傳播 卷積操作的反向傳播也是一個(gè)卷積(但是濾波器在空間上翻轉(zhuǎn)了),這個(gè)結(jié)論可以簡(jiǎn)單的從1維的情況推導(dǎo)出(這里不展開)。

1x1卷積 1x1卷積的概念來(lái)自于網(wǎng)絡(luò)中的網(wǎng)絡(luò),在CNNs中因?yàn)闉V波器會(huì)延伸到輸入塊的整個(gè)深度,所以1x1卷積是有意義的。

擴(kuò)張卷積 最近的一項(xiàng)關(guān)于擴(kuò)張卷積的研究在CONV層引入了一個(gè)超參數(shù)擴(kuò)張數(shù)(dilation)。如下圖所示擴(kuò)張卷積就是在濾波器的數(shù)據(jù)點(diǎn)之間插入空白,這樣能夠提高濾波器的感受野。(和池化作用類似還不丟失信息)

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容