1. 程式人生 > >淺析卷積神經網路的內部結構

淺析卷積神經網路的內部結構

提到卷積神經網路(CNN),很多人的印象可能還停留在黑箱子,輸入資料然後輸出結果的狀態。裡面超級多的引數、眼花繚亂的命名可能讓你無法短時間理解CNN的真正內涵。這裡推薦斯坦福大學的CS231n課程,知乎上有筆記的中文翻譯。如果你需要更淺顯、小白的解釋,可以讀讀看本文。文章大部分理解都源自於CS321n卷積神經網路篇的筆記。

讀完本文,你將從以下幾個方面認識CNN:

 一、CNN概述

二、濾波器和感受野

濾波器

感受野

三、神經元的排列方式

步長

零填充

計算卷積層的空間維度

四、引數共享和卷積的由來

深度切片

引數共享

區域性連線層

五、總結


一、CNN概述

CNN,卷積神經網路,和常規神經網路非常類似,擁有輸入層、輸出層以及中間一系列隱層。隱層可以是:卷積層、ReLu層、匯聚層(也叫池化層)和全連線層。各個隱層由神經元組成,每個神經元都含有引數,這些引數是具有學習能力的權重和偏差,用於內積運算。需要說明的是,卷積神經網路的輸入是三維資料,從而各層也由三維的神經元組成。

如上圖所示,左邊表示普通的神經網路,右邊是卷積神經網路。圓圈表示每個神經元,可以看到卷積神經網路的畫素資料、神經元等都是三維排列的。

以對影象分類舉例,輸入一張影象,整個網路相當於一個可導的評分函式,輸入是影象的畫素,輸出是不同類別的評分。網路中的隱層對輸入資料做各種運算,且存在損失函式

(也叫代價函式目標函式)來衡量我們對結果的不滿意程度。如果你不知道損失函式,沒關係,在這裡不影響你的閱讀,你可以選擇在後續的學習中補充這方面的知識。現在,你只需要知道它的作用就可以了。

卷積神經網路為什麼叫卷積神經網路呢?重點就在卷積二字。上面提到的卷積層是CNN的核心和靈魂。一切精巧的設計都在於此。

下面,我們就重點探索一下CNN中的卷積層

二、濾波器和感受野

濾波器

介紹濾波器之前,先考慮一個例子。

一張rgb輸入影象的尺寸是300*300*3(長寬各300畫素,3表示通道數),如果按照普通神經網路的思路,讓每個畫素值都和神經元全連線,一個神經元需要的引數將高達300*300*3=270,000個!網路中神經元的個數很多,引數的量很快就會快速增加到不可接受的地步,導致效率低下,網路過擬合。

於是呢,人們就考慮,既然輸入資料是三維的,我們可不可以讓神經元也三維排列?既然全連線情況下引數巨多,我們能不能讓每個神經元只連線一部分輸入資料的畫素?只要神經元數目足夠,肯定可以覆蓋所有輸入畫素。

沒錯,人們就是這樣做的。我們定義了濾波器,由一系列權重組成,仍然是三維的。每個濾波器在空間維度上的寬和高比較小,屬於超引數,需要在迭代中慢慢找到最優解;在深度上自然需要和輸入資料保持一致,才能和三維的輸入資料做卷積。舉個例子,輸入資料300*300*3,一個典型的濾波器可以是5*5*3。想象濾波器在輸入資料的空間維度上慢慢滑動,是不是最終覆蓋了所有的畫素?濾波器的權重和輸入資料做內積,最終形成了一張二維的啟用圖。如果我們的卷積層深度為D_c,那麼相當於形成D張啟用圖。這些圖疊放在一起,就是最終的輸出資料體的深度,即輸出資料體維度為300*300*D。

再強調一遍,輸入資料的深度決定了濾波器的深度。一個濾波器是權重的集合,每個神經元都擁有一個濾波器。這樣,神經元和輸入資料連線的時候,才能進行內積運算。

小結:

濾波器是權重的集合。

每個神經元都擁有一個濾波器,包含其用來內積運算的引數。

濾波器的深度和輸入資料的深度保持一致,而空間上區域性連線於輸入資料。對於影象資料來說,濾波器的深度一定是3.

卷積層的深度決定了輸出資料體的深度。

感受野

有了濾波器的概念,感受野再好理解不過了。簡單的說,濾波器的空間維度 等於 感受野;直觀的說,就是每個神經元在空間維度上能探測到的二維平面,即每個神經元與輸入資料相連線的空間大小。

上圖粉色區域是輸入資料,藍色是卷積層,圓圈表示神經元。老生常談,都是三維排列。粉色區域中較深的平面就是該神經元的感受野。多說一句,沿著深度方向排列的神經元,感受野相同。這些沿著深度深度方向排列的神經元被稱為深度列(圖中藍框中的小矩形)或纖維

三、神經元的排列方式

我們已經瞭解了每個神經元和輸入資料體之間的連線方式,知道每個神經元的引數集合叫濾波器,濾波器和部分輸入資料進行內積運算得到二維啟用圖。深度方向上的神經元個數決定了卷積層的輸出資料體的深度。現在,我們來聊聊神經元的數量和排列方式如何確定。

步長

上面提到了濾波器將在輸入資料體上進行滑動。濾波器在滑動時,必須指定固定的步長,即濾波器每次移動的畫素。如果步長為2,表示濾波器每次滑動兩個畫素。容易得知,步長大於等於1的時候會使輸出資料體在空間上變小。

零填充

零填充可以解決上面的問題,在輸入資料體邊緣用0進行填充,可以控制輸出資料體的空間尺寸,從而保證輸出資料體的空間尺寸和輸入資料體相同。

計算卷積層的空間維度

考慮簡單的情況,輸入資料體長寬相等,神經元的感受野長寬也相等。這樣,濾波器的滑動就可以在一維上進行抽象:

 

如上圖左,紫色表示7*7的輸入資料體(經過2個零填充),綠色表示3*3的濾波器,濾波器滑動步長為1,最終得到5*5的輸出,由橘色表示。同理,右邊最終得到3*3的輸出。

假設輸入資料體尺寸為W(長寬相等),神經元的感受野尺寸為F(長寬相等),步長為S,零填充的數量為P,可得輸出資料體的空間尺寸:(W-F+2P)/S+1。

有興趣的可以推算看看~

如果輸入資料體長寬不等,只需要分別用上述公式計算即可。

總結一下,通過計算得到的神經元數量,他們的感受野是不是恰好能夠覆蓋(甚至可能還會重疊)所有的輸入資料體的空間維度?於是,每個神經元利用自己的濾波器和輸入資料體進行內積運算,最終在深度方向上排列成了輸出資料體。

四、引數共享和卷積的由來

深度切片

深度切片是神經元在深度維度上的二維切片。舉個例子,一個尺寸為55*55*96的卷積層,擁有96個深度切片,每個切片的維度是55*55. 考慮一袋96片裝的切片面包(真多啊),深度切片就是一片片切好的麵包,其長寬為55*55cm.

引數共享

前面我們提到,每個神經元都擁有一個濾波器,假設濾波器的尺寸為11*11*3,即一個濾波器的引數是363個。我們擁有的卷積層維度是55*55*96,即55*55*96=290,400個神經元。綜合一下,所有的神經元將擁有290,400*363個引數,這無疑也是巨大的。

終於說到重點了!我們假設,如果一個濾波器找到的特徵在空間位置(x,y)處,那麼這個濾波器在另一個位置(x1,y1)處應該一樣有效。基於這個假設,我們讓一個深度切片上的所有神經元共享一個濾波器,也就是共享一套引數!

這樣,上面的神經元將96個濾波器,共363*96個權重引數。顯著降低了引數數量。

另外,共享引數看起來,是不是有些眼熟?沒錯,同一個深度切片上的神經元都擁有相同的濾波器,相當於將濾波器在輸入資料體上以一定的步長滑動,做卷積運算!不同深度切片上的濾波器不同,因此濾波器的個數等於卷積層的深度。這就是卷積層的由來。

同樣地,如果同一深度切片上的濾波器不同,可以理解為,濾波器在滑動的時候,每隔一個步長,其引數就發生了變化。

區域性連線層

小小拓展一下:有時候,上面的引數共享假設沒有意義,比如我們的輸入影象是一些明確的中心結構的時候。比如人臉,我們希望不同的特徵應該在圖片的不同位置被學習到。這時候,就需要放鬆引數共享的限制,稱為區域性連線層

五、總結

講到這裡,我們對卷積層的大概構成和原理已經有了一定理解啦。現在我們對上面講述做一個總結性的描述:

卷積層有四個超引數,分別為:濾波器的數量K(=輸出資料體的深度=卷積層的深度),濾波器的空間尺寸F,步長S,零填充數量P。

假設輸入資料體尺寸為W1*H1*D1,輸出資料體尺寸為W2*H2*D2,則:

W2 = (W1 – F + 2P)/ S + 1

H2 = (H1 – F + 2P)/ S + 1

D2 = K

每個濾波器包含F*F*D1個權重,由於深度切片的引數共享,卷積層擁有F*F*D1*K個權重和K個偏置。(關於偏置,是一個濾波器卷積運算後的加和。在這裡對卷積神經網路的理解影響不大,可以後續學習)

理解CNN,再使用CNN。

祝大家卷積愉快(笑)。