1. 程式人生 > >卷積神經網路(Convolutional Neural Networks,CNNS/ConvNets)

卷積神經網路(Convolutional Neural Networks,CNNS/ConvNets)

       卷積神經網路非常類似於普通的神經網路:它們都是由具有可以學習的權重和偏置的神經元組成。每一個神經元接收一些輸入,然後進行點積和可選的非線性運算。而整個網路仍然表示一個可微的得分函式:從原始的影象畫素對映到類得分。在最後一層(全連線層)也有損失函式(例如 SVM / Softmax),而且訓練普通神經網路的已有技巧 / 技術都可以應用。

       然而差別在哪裡呢?卷積網路結構具有特殊的影象輸入,這個顯式的輸入假設使得網路結構具有一些特定的性質。這些性質使得前向函式能夠高效的實現,並且極大的減少網路的引數個數。

結構概覽

       回顧:普通神經網路。神經網路接收一個輸入(向量),然後通過一系列的隱藏層

對輸入進行變換。每一個隱藏層都由神經元的集合組成,每一個神經元與前一層的所有神經元連線,而同一層的神經元之間完全獨立,也不共享任何連線。最後的全連線層稱為“輸出層”,在分類情形下它表示類得分。

       普通神經網路不能適用所有影象。CIFAR-10 資料集中的影象大小隻有 32x32x3 (寬 32,高 32,3 個顏色通道),因此一個普通神經網路的第一個隱藏層的一個全連線神經元的引數個數是 32*32* 3 = 3072。這樣的大小看起來好像很容易處理,但顯然全連線結構不能擴充套件到大影象。例如,一張更可觀的影象,它的大小為 200x200x3,那麼一個神經元的就有 200*200*3 = 120,000 個引數。而且,我們幾乎總是需要很多這樣的神經元,因此引數合在一起會快速的增長。很明顯,這樣的全連線是浪費的,而且大量的引數會很快的導致過擬合。

       神經元的 3D 方體(?,volume)。卷積神經網路充分的利用了輸入是影象這一事實,而且以一種更有意義的方式來限制它們的結構。特別的,不像普通神經網路,卷積網路中的層以 3 維(寬、高、深度,這裡的深度不是指整個網路的深度——網路中所有層的個數,而是指啟用方體的第三個維度)的方式來排列神經元。例如,CIFAR-10 中的影象是維數為 32x32x3(寬、高、深度)的啟用輸入方體。我們馬上就會看到,卷積網路層中的神經元不是以全連線的方式連線到前一層的所有神經元,而是隻與一個小區域性相連。而且,依據卷積網路結構,用於 CIFAR-10 的卷積網路的最後的輸出層的維數是 1x1x10,就把整張影象簡化成一個沿著深度方向的類得分向量。下圖是兩種網路的一個視覺化:

左圖:普通的 3 層神經網路。右圖:卷積網路,同一層的神經元使用三維(寬、高、深度)來視覺化。卷積網路的每一層把神經元的啟用的 3D 的輸入方體變換為 3D 的輸出方體。在這個例子裡,紅色的輸入層儲存影象,所以它的寬度和高度是影象的維數,而深度是 3 (紅、綠、藍通道)。

卷積網路由層組成。每一層都有一個 API:它把 3D 的輸入方體通過一個可微函式(引數可有可無)變成一個 3D 的輸出方體。

組成卷積網路的層

       正如我們在前面說的,一個簡單的卷積網路是層的一個序列,每一個層通過一個可微函式把一個啟用方體變成另一個。我們使用三種主要型別的層:卷積層(Convolutional Layer)池化層(Pooling Layer)全連線層(Fully-Connected Layer)來建立卷積網路結構。我們將這三種類型的層堆疊起來形成整個卷積網路的結構(architecture)

       結構例子:概覽。我們會在以後更詳細的描述卷積網路,但一個用於 CIFAR-10 分類的簡單卷積網路具有結構 [INPUT - CONV - RELU - POOL - FC]。更詳細的:

  • INPUT [32x32x3] 保留影象的原始畫素值,這裡的情形是寬 32,高 32,和具有 R,G,B 三個顏色通道的影象。
  • CONV 層計算與輸入區域性連線的神經元的輸出,每一個神經元計算它們的權重與區域性連線的輸入單元的權重的點積。如果我們使用 12 個過濾器,則得到 [32x32x12] 的單元。
  • RELU 層逐元素的使用啟用函式 max{0, x}。它保持單元的大小 [32x32x12] 不變。
  • POOL 層沿著空間維度(寬、高)進行降取樣運算,得到如 [16x16x12] 的單元。
  • FC(fully-connected)層計算類得分,得到的單元大小為 [1x1x10],其中 10 個數中的每一個對應到一個類得分(CIFAR-10 總共 10 個類別)。顧名思義,與普通神經網路一樣,這個層的每一個神經元都與前一層的所有神經元連線。

       使用這種方法,卷積網路一層一層的把原始影象的原始畫素值變換成最後的類得分。注意到一些層包含引數,而另一些層沒有。特別的,CONV / FC 層進行的變換不僅是輸入方體的啟用的函式,也是神經元的引數(權重和偏置)的函式。另一方面,RELU / POOL 層實現固定的函式。CONV / FC 層的引數通過梯度下降演算法訓練,使得卷積網路計算的類得分和訓練集中的每一張影象的類標號一致。

       綜合來說:

  • 卷積網路結構是把影象方體變成輸出方體(如儲存類得分)的變換的層列表的最簡單的情形
  • 只有幾種不同型別的層而已(例如,當前 CONV / FC / RELU / POOL 最流行)
  • 每一層都接收 3D 的輸入方體,然後通過一個可微函式把它變成 3D 輸出方體
  • 每一層可能有引數,也可能沒有(例如,CONV / FC 層有,而 RELU / POOL 層沒有)
  • 每一層可能有額外的超引數,也可能沒有(例如,CONV / FC / POOL 有,而 RELU 沒有)

這裡寫圖片描述

一個樣例卷機網路的啟用。初始的方體儲存原始影象畫素(左邊),而最後的方體儲存類得分(右邊)。沿著處理路徑的每一個啟用的方體由列來顯示。由於很難視覺化 3D 方體,所以通過行來展示每一個方體的切片。最後一層的方體儲存每一個類的得分,這裡我們僅列出了排名前 5 的得分,及它們的標籤。訪問網站檢視完整的 web-based demo。這裡展示的是小型VGGNet(後面會討論)的結構。

       現在我們來描述特定層的超引數和它們連線的細節。

卷積層

       卷積層(convolutional layer,Conv layer)是卷積網路的核心模組,它對卷積網路的計算效能提升最多。

       直觀概覽。首先來看看沒有腦 / 神經元類比的卷積層的計算。它的引數由可學習的過濾器組成。每一個過濾器都是一個小的沿著寬和高方向的空間區塊,但也可以擴充套件到輸入方體的整個深度。例如,卷積網路的第一層的一個典型的過濾器具有 5x5x3 的大小(也就是寬和高 5 個畫素,而 3 是因為影象有 3 個顏色通道)。在前向傳播階段,我們沿著輸入方體的寬和高滑動(更精確的,卷積)每一個過濾器,在每一個位置計算輸入和過濾器元素之間的點積。這將產生一個 2 維的啟用對映(activation map),它是對過濾器在每一個空間位置的響應。直觀的,網路學習的過濾器會在看到某些型別的可見特徵(例如,網路第一層的某些方向的邊緣,或者某些顏色的斑塊,或網路上層的最終的蜂窩似或輪似的模式)的時候啟用。在每一個 CONV 層我們有過濾器的一個集合,它們每一個都產生一個分離的 2 維啟用對映。沿著深度維數方向把這些啟用對映堆疊起來就產生了輸出方體。

       腦觀點。如果從腦 / 神經元的類比來看,3D 輸出方體的每一個元素都可以解釋成神經元的輸出,這些神經元只依賴輸入的一個小區域,而且它們與左右空間的神經元共享引數(因為它們都使用相同的過濾器)。現在我們來闡述神經元連線的細節,它們的空間排列,以及它們的引數共享方式。

       區域性連線。當我們處理高維輸入(如影象)的時候,把神經元與它前一層的所有神經元連線是不現實的。實際上,我們只把它和前一層的一個小區域相連。這個連線的空間範圍是稱為神經元的感受野(receptive field)的一個超引數,它等價於過濾器的大小。沿著深度軸的連線範圍總是等於輸入方體的深度。需要再次強調的是我們在處理空間維度(寬和高)和深度維度的時候是不對稱的:連線在沿著輸入方體的空間(寬和高)方向是區域性的,而在深度方向則總是等於整個深度。

       例1。假設輸入方體大小為 [32x32x3](例如一張 RGB CIFAR-10 影象)。如果感受野(或過濾器大小)為 5x5,則卷積層的每一個神經元連線到輸入方體的 [5x5x3] 的區域,總共有 5*5*3 = 75 個權重(再加 1 個偏置引數)。注意,沿著深度方向的連線範圍必須是 3,因為它就是輸入方體的深度。

       例2。假設輸入方體的大小是 [16x16x20]。則使用 3x3 大小的感受野,卷積層的每一個神經元與輸入方體有 3*3*20 = 180 個連線。再次注意,連線在空間上是區域性的(如 3x3),但在輸入深度上是整體的。

左圖:一個樣例輸入方體(紅色,例如一張 32x32x3 的 CIFAR-10 影象),和一個樣例第一個卷積層的神經元方體。卷積層的每一個神經元在空間上都連線到輸入方體的一個區域性,但要連線整個深度(例如,所有的顏色通道)。注意,沿著深度有多個神經元(如圖片上有 5 個),每一個都連線到輸入的相同區域(見下文 depth column 的討論)。右圖:與普通神經網路的神經元一樣:它們仍然要計算權重與輸入的點積,然後再進行非線性啟用,只是它們的連線被限制到區域性空間。

       空間排列。我們已經解釋了卷積層的每一個神經元與輸入方體的連線,但我們還沒有討論輸出方體中神經元的個數以及它們的排列方式。有三個超引數控制著輸出方體的大小:深度(depth),步幅(stride)0-填充(zero-padding)。我們分別討論如下:

  1. 首先,輸出方體的深度是一個超引數:它對應到我們使用的過濾器的個數,每一個過濾器學習輸入的不同特徵。例如,第一個卷積層把原始影象作為輸入,則沿著深度維數的不同神經元會在不同方向邊緣或顏色塊出現時啟用。我們把連線到輸入的相同區域的神經元集合稱為 depth column(某些人更傾向於術語 fibre)(原文:We will refer to a set of neuros that are all looking at the same region of the input as a depth column (some people also prefer the term fibre))。
  2. 其次,我們必須指定過濾器滑動的步幅。當步幅為 1 時,過濾器一次移動一個畫素。當步幅為 2(或者,不同尋常的 3 或更大,這些實際很少使用) 時,過濾器一次跳動兩個畫素。這將會產生在空間上更小的輸出方體。
  3. 我們將在後面看到,往輸入方體的邊界填充 0 有時是方便的。這種 0-填充的大小是一個超引數。0-填充的一個非常好的特性是它可以讓我們控制輸出方體的空間大小(大部分情況,如我們將看到的,我們使用它來保持輸出方體與輸入方體相同的空間大小,即具有相同的寬和高)。

  4.        輸出方體的大小可以通過輸入方體的大小(W),卷積層神經元的感受野的大小(F),使用的過濾器的步幅(S),以及邊界 0-填充的量(P)的一個函式來計算。你可以確認一下,計算輸出神經元個數的正確公式是 (W - F + 2 P) / S + 1。例如,對於 7x7 的輸入,步幅為 1 的 3x3 過濾器,以及 0 個填充,我們得到 5x5 的輸出。如果步幅為 2,則得到 3x3 的輸出。讓我們來看一個更圖形化的例子:

這裡寫圖片描述

空間排列的說明。在這個例子中,空間維數只有一個(x-軸),一個神經元的感受野的大小為 F = 3,輸入大小為 W = 5,0-填充個數 P = 1。左圖:步幅 S = 1,從而輸出大小為 (5 - 3 + 2) / 1 + 1 = 5。右圖:步幅 S = 2,輸出大小為 (5 - 3 + 2) / 2 + 1 = 3。注意,步幅 S = 3 不能用,因為它不匹配方體的大小。用方程的術語來說,這可由 (5 - 3 + 2) = 4 不被 3 整除來確定。

這個例子中,神經元的權重是 [1, 0, -1](圖中最右側),偏置是 0。這些權重被所有黃色的神經元共享(見下文引數共享)。

       使用 0-填充。注意到在上面例子的左圖,輸入和輸出的維數都是 5。這之所以成立,是因為感受野是 3 而我們使用了 1 的 0-填充。如果沒有使用 0-填充,則輸出的空間維數只有 3。一般的,如果步幅 S = 1,則設定 0-填充 P = (F - 1) / 2 就能確保輸入方體和輸出方體具有相同的空間維數。使用這種方式的 0-填充非常常見,我們在進一步講卷積結構的時候會討論這樣做的充足理由。

       步幅的限制。再次注意到空間排列超引數是兩兩相互制約的。例如,當輸入大小是 W = 10 時,如果沒有 0-填充 P = 0,並且過濾器的大小 F = 3,則不能使用步幅 S = 2,因為 (W - F + 2 P) / S + 1 = (10 - 3 + 0) / 2 + 1 = 4.5,也就是說,不是一個整數,這意味著神經元不是整齊和對稱的與輸入做卷積。因此,超引數這樣設定是無效的,而且一個卷積庫(ConvNet library)會丟擲一個例外,或者使用 0 的 0-填充,或者截斷輸入,或其它方式來匹配這些超引數。我們將在卷積網路結構那一節看到,合適的設定卷積網路的大小使得所有的維數都匹配確實令人頭痛,而這是 0-填充以及其它一些設計指導會幫我們顯著緩解的。

       現例項子Krizhevsky 等人的結構贏得了 2012 年的 ImageNet 比賽,它接受的影象大小是 [227x227x3]。在第一個卷積層,神經元的感受野大小 F = 11,步幅 S = 4,0-填充 P = 0。因為 (227 - 11) / 4 + 1 = 55,以及卷積層具有深度 K = 96,所以卷積層的輸出方體大小為 [55x55x96]。這個有 55*55*96 個神經元的方體中的每一個神經元都與輸入方體的大小為 [11x11x3] 的區域相連。另外,每一個深度列(depth column)中的 96 個神經元都連線到輸入方體的相同 [11x11x3] 的區域,當然它們的權重不一樣。有趣的是,他們的論文中說輸入影象大小是 224x224,這顯然是不正確的,因為 (224 - 11) / 4 + 1 並不是一個整數。這在卷積網路的歷史中困擾了很多人,而且很少有人知道發生了什麼。我們自己最好的猜測是 Alex 使用了 3 個額外畫素的 0-填充,而他沒有在論文中指出。

       引數共享。卷積層中使用引數共享方式來控制引數個數。使用上面現實的例子,我們已經知道在第一個卷積層中有 55*55*96 = 290,400 個神經元,每一個神經元都有 11*11*3 = 363 個權重和 1 個偏置。加起來,在第一個卷積層就有 290400*363 =105,705,600 個引數。顯然,這個數非常大。

       一個被證明能夠極大的減少引數個數的合理的假設是:如果一個特徵對某個空間位置 (x,y)的計算是有用的,則它對不同位置 (x2,y2)的計算也是有用的。換句話說,如果記一個深度的二維切片為 depth slice (例如,一個大小為 [55x55x96] 的方體有 96 個 depth slice,每一個大小為 [55x55]),我們將限制每一個 depth slice,使得它的所有神經元都使用相同的權重和偏置。使用這種引數共享模式,我們的例子的第一個卷積層只有 96 個權重集(每一個 depth slice 對應一個),因此共有 96*11*11*3 = 34,848 個權重,或者 34,944 個引數(+96 個偏置)。也就是,每一個 depth slice 中的所有 55*55 個神經元都使用相同的引數。在實際的反向傳播過程中,方體中的每一個神經元都會對引數求梯度,但每個 depth slice 中的這些梯度都會加到一起,而且權重也只更新一次。

       注意到,如果一個 depth slice 中的所有神經元都使用相同的權重向量,則卷積層在前向傳播過程時,每個 depth slice 計算神經元的權重與輸入方體的卷積(因此得名:卷積層)。這也是為什麼通常把權重集稱為過濾器(filter)(或核,kernel),它與輸入進行卷積。


這裡寫圖片描述

學到的過濾器的例子(Krizhevsky et al)。96 個過濾器中的每一個都具有大小 [11x11x3],而且都被每一個 depth slice 中的 55*55 個神經元共享。注意到引數共享這個假設是合理的:如果在影象中某個位置檢測到一個水平邊緣是重要的,則由於影象的平移不變結構,直觀的說,在其他位置也是有用的。從而,不需要在卷積層的輸出方體中的 55*55 個位置中的每一個都重新去學習檢測水平邊緣。

       注意,有時引數共享假設可能沒有意義。特別是如果卷積網路的輸入影象具有特定的中心結構這種情況更是如此,在這裡,我們期望,比如,學到影象的一側相對於另一側完全不同的特徵。一個實際例子是,當輸入是居於影象中心的人臉時。你可能期望在不同的空間位置學習到不同的眼睛或頭髮特徵。這種情況通常會放鬆引數共享模式,取而代之的是區域性連線層(Locally-Connected Layer)

       Numpy 例子。為了讓討論變得更精確,我們把相同的想法用程式碼和特定的例子來表達。假設輸入方體是一個 numpy 陣列 X。則:

  • 在位置 (x, y)depth column(或 fibre)是啟用 X[x, y, :]。
  • 在深度 ddepth slice,或等價的,activation map 是啟用 X[:, :, d]。

       卷積層例子。假設輸入方體具有形狀 X.shape: (11, 11, 4)。再假設我們不使用 0-填充(P = 0),過濾器大小 F = 5,步幅 S = 2。則輸出方體的的空間大小是 (11 - 5) / 2 + 1 = 4,即寬和高是 4。輸出方體的啟用對映(稱它為 V)看起來如下(在這個例子中只有其中的一些元素被計算):

  • 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

       記住在 numpy 中, 上面的運算子 * 指陣列中的元素級乘法。同時要注意神經元的權重向量是 W0,而 b0 是偏置。這裡,W0 假設具有形狀 W0.shape: (5, 5, 4),因為過濾器大小是 5 以及輸入方體的深度是 4。而且在每一個點,我們像通常的神經網路一樣計算點積。另外,我們使用相同的權重和偏置(由於引數共享),同時沿著寬度方向的維數以 2 的步長(也就是步幅)增長。要構造輸出方體的第二個啟用對映,我們有:

  • 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
  • V[0, 1, 1] = np.sum(X[:5, 2:7, :] * W1) + b1(沿著 y 方向的例子)
  • V[2, 3, 1] = np.sum(X[4:9, 6:11, :] * W1) + b1(沿著兩個方向的例子)

這裡我們看到,V 的深度維數的下標是 1,因為我們計算的是第二個啟用對映,而且現在使用的引數(W1)也不同。為了簡單起見,卷積層的輸出陣列 V 的其它部分並沒有全部計算。另外,這些啟用對映之後通常都會使用像 ReLU 這樣的啟用函式,雖然這裡並沒有演示。

       總結。總而言之,卷積層:

  • 接收一個大小為 W1×H1×D1 方體
  • 需要 4 個超引數:
    • 濾波器個數 K
    • 濾波器大小 F
    • 步幅 S
    • 0-填充數量 P
  • 產生一個大小為 W2×H2×D2 的方體:
    • W2=(W1F+2P)/S+1
    • H2=(H1F+2P)/S+1 (寬和高對稱的計算)
    • D2=K
  • 使用引數共享,每個濾波器引入 FFD1 個權重,總共 (FFD1)K 個權重和 K 個偏置
  • 輸出方體中,第 d 個 depth slice(具有大小W2×H2)是第 d 個濾波器與輸入方體進行步幅為S的有效卷積(valid convolution),再使用第d個偏置的結果

常用的超引數設定是 F=3,S=1,P=1。然而也有其它常見約定和經驗法則來設定超引數。見下面的卷積網路結構一節。

       卷積演示。下面是一個卷積層的演示動圖。由於 3D 方體很難視覺化,所有方體(輸入方體(藍色),權重方體(紅色),輸出方體(綠色))使用 depth slice 的按行堆疊來進行視覺化。輸入方體大小為 W1=5,H1=5,D1=3,卷積層引數為K=2,F=3,S=2,P=1。也就是說,我們有兩個大小為 3×3 的過濾器,並且步幅為 2。因此,輸出方體的空間大小為 (5 - 3 + 2) / 2 + 1 = 3。另外,因為對輸入方體使用了 P=1 的填充,使得輸入方體的外邊界為 0。下面的視覺化是對輸出啟用(綠色)的重複,顯示每一個元素都是通過高亮輸入(藍色)和過濾器(紅色)的元素相乘,然後相加,再加上偏置得來的。

動圖連結

       作為矩陣乘法實現。注意,卷積運算本質上是過濾器與輸入的區域性區域之間的點積。卷積層的常用實現模式充分利用了這一點,把卷積層的前向傳播格式化為大的矩陣乘法,如下:

  1. 把輸入影象的區域性區域通過通常稱為 im2col 的運算擴充套件成列向量。例如,如果輸入大小為 [227x227x3],它與 11x11x3 的過濾器進行步幅為 4 的卷積,則我們把輸入的 [11x11x3] 的畫素塊展開為大小為 11*11*3 = 363 的列向量。重複這個過程,得到寬和高都是 (227 - 11) / 4 + 1 = 55 個位置,從而 im2col 的輸出矩陣 X_col 大小為 [363x3025],其中每一列都是展開的感受野,總共有 55*55 = 3025 個。注意到,因為感受野是重合的,輸入方體中的每一個數會重複出現在不同的列中。
  2. 卷積層的權重類似的展開成行向量。例如,如果有 96 個大小為 [11x11x3] 的過濾器,則得到大小為 [96x363] 的矩陣 W_row
  3. 現在卷積的結果就等價於進行矩陣乘法 np.dot(W_row, X_col),這是每一個過濾器與每一個感受野進行點積。在我們的例子中,這個運算的輸出大小為 [96x3025],給出了每一個濾波器在每一個位置的點積。
  4. 最後的結果再次重現塑形成合適的輸出維數 [55x55x96]。

       這個方法的缺點是它要使用大量的記憶體,因為輸入方體電話中一些值會在 X_col 中重複多次。然而,它的好處是存在很多的我們可以充分利用的矩陣乘法的高效實現(比如,經常使用的 BLAS API)。另外,相同的 im2col 的思想也可以用於進行池化運算(我們將在後面討論)。

       反向傳播。(對於資料和權重的)卷積運算的反向過程也是卷積(只不過過濾器是空間翻轉的)。這可以使用非常簡單的 1 維例子來推導(這裡略過)。

       1x1 卷積。在 Network in Network 首次提出後,一些論文也使用 1x1 的卷積。一些具有訊號處理背景的人第一次看到 1x1 卷積的時候會很困惑,因為正常訊號都是 2 維的,因此 1x1 的卷積沒有意義(它只是進行逐點的伸縮)。然而,在卷積網路中情況卻不是這樣,因為我們現在是在 3 維輸入方體進行操作,而且過濾器永遠在輸入方體的整個深度上擴充套件。例如,如果輸入大小是 [32x32x3],則使用 1x1 卷積進行 3 維點積是有效的(因為輸入深度有 3 個通道)。

       Dilated convolutions。最近的發展(例如,Fisher Yu 和 Vladlen Koltun 的論文)往卷積層上又引入了一個稱為 dilation 的超引數。到目前為止,我們討論的卷積過濾器都是接觸的,然而,也可以有單元之間是分離的過濾器。例如,1 維的時候,一個大小為 3 的過濾器在輸入 x 上進行計算:w[0]*x[0]+w[1]*x[1]+w[2]*x[2],這是 dilation 為 0 的情況。對於 dilation 為 1 的過濾器,則計算 w[0]*x[0]+w[1]*x[2]+w[2]*x[4]。換句話說,權重使用的時候是有間隔的。當與 0-dilated 的過濾器進行聯合使用的時候,這變得非常有用,因為它只用很少的層就能高度的融合輸入的空間資訊。例如,如果你堆疊兩個 3x3 的卷積層,你可以確認第二個層的神經元是輸入的的 5x5 的圖塊的函式(我們說這些神經元的有效感受野是 5x5)。假如我們使用 dilated convolution,則這些有效感受野會更快的增長。

池化層

       在卷積結構中通常會在相繼的卷積層之間週期性的插入池化層(Pooling Layer),它的作用是逐漸的減少表示的空間大小,從而減少網路的引數的個數核計算量,進而控制過擬合。池化層在輸入的每個 depth slice 上使用 MAX 操作獨立的計算,改變它的空間大小。池化層最常用的形式是在輸入的每個 depth slice 上使用 2x2 大小的過濾器和步幅為 2 的降取樣,忽略其中 75% 的啟用。每一個 MAX 操作都是對 4 個數(depth slice 中的 2x2 小區域)取最大。另外,網路的深度保持不變。一般的,池化層:

  • 接收大小為W1×H1×D1 的方體
  • 需要 2 個超引數:
    • 空間範圍 F
    • 步幅S
  • 產生大小為 W2×H2×