一、基礎結構

CNN和之 前介紹的神經網路一樣,可以像樂高積木一樣透過組裝層來構建。不過, CNN中新出現了卷積層(Convolution層)和池化層(Pooling層)。此外,各層中傳遞的資料是有形狀的資料(比如,3維資料)

初識卷積神經網路(CNN)

靠近輸出的層中使用了之前 的“ Affine - ReLU”組合。此外,最後的輸出層中使用了之前的“Affine - Softmax”組合。這些都是一般的CNN中比較常見的結構。

二、卷積層

2.1 卷積層的優勢

在全連線層中,資料的形狀被忽視了。以影象輸入為例子,影象通常是高、長、通道方向上的3維形狀。但是,向全連線層輸入時,需要將3維資料拉平為1維資料。前面提到的使用 了MNIST資料集的例子中,輸入影象就是1通道、高28畫素、長28畫素的(1, 28, 28)形狀,但卻被排成1列,以784個數據的形式輸入到最開始的 Affine層。 而卷積層可以保持形狀不變。當輸入資料是影象時,卷積層會以3維資料的形式接收輸入資料,並同樣以3維資料的形式輸出至下一層。因此可以提取出鄰近的畫素為相似的值、RBG的各個通道之間分別有密切的關聯性、相距 較遠的畫素之間沒有什麼關聯等值得提取的本質模式,利用與資料形狀相關的資訊。

2.2 卷積運算(影象處理中的濾波器運算)

2.2.1 卷積運算基本過程

先來看一個經過卷積運算的結果

初識卷積神經網路(CNN)

對於輸入資料,卷積運算以一定間隔滑動濾波器的視窗並應用。這裡所說的視窗是指下圖中灰色的3×3的部分。如下圖所示,將各個位置上濾波器的元素和輸入的對應元素相乘,然後再求和(有時將這個計算稱為乘積累加運算)。然後,將這個結果儲存到輸出的對應位置。將這個過程在所有位置都進行一遍,就可以得到卷積運算的輸出。 如果有偏置,則在卷積運算結果的各個位置都加上偏置的值。

初識卷積神經網路(CNN)

2.2.2 填充

在卷積神經網路中引入了填充和步幅等特殊概念,這裡我們來介紹一下填充。 在進行卷積層的處理之前,有時要向輸入資料的周圍填入固定的資料(比如0等),這稱為填充(padding),是卷積運算中經常會用到的處理。比如, 在下圖的例子中,對大小為(4, 4)的輸入資料應用了幅度為1的填充。“幅度為1的填充”是指用幅度為1畫素的0填充周圍。

初識卷積神經網路(CNN)

可以看到,透過填充,大小為(4, 4)的輸入資料變成了(6,6)的形狀。 然後,應用大小為(3, 3)的濾波器,生成了大小為(4,4)的輸出資料。這個例子中將填充的值設成了1,不過填充的值也可以設定成2、3等任意的整數。在圖該例子中,如果將填充設為2,則輸入資料的大小變為(8,8);如果將填充設 為3,則大小變為(10, 10)。

使用填充主要是為了調整輸出的大小。比如,對大小為(4, 4)的輸入資料應用(3,3)的濾波器時,輸出大小變為(2, 2),相當於輸出大小比輸入大小縮小了2個元素。在反覆進行多次卷積運算的深度網路中,如果每次進行卷積運算都會縮小空間,那麼在某個時刻輸出大小就有可能變為1,導致無法再應用卷積運算。

2.2.3 步幅

介紹完填充,再來介紹一下步幅。步幅是應用濾波器的位置間隔,以下是步幅為2的情況。

初識卷積神經網路(CNN)

2.2.4 填充,步幅和輸出結果的瓜系

增大步幅後,輸出大小會變小。而增大填充後,輸出大小會變大。 如果將這樣的關係寫成算式,會如何呢? 我們看一下對於填充和步幅,如何計算輸出大小。 這裡,假設輸入大小為(H,W),濾波器大小為(FH,FW),輸出大小為 (OH,OW),填充為P,步幅為S。此時,輸出大小可透過下列式子計算。

 OH = \frac{H+2P-FH}{S} + 1

 OW = \frac{H+2P-FW}{S} + 1

我們來思考一個問題,為什麼卷積運算是有效的?

依然用例子來說明,比如我們有一個4*4的影象,我們設計兩個卷積核,看看運用卷積核後圖片會變成什麼樣。

初識卷積神經網路(CNN)

從結果可以看出,透過第一個卷積核計算後的特徵圖是一個三維資料,在第三列的絕對值最大,說明原始圖片上對應的地方有一條垂直方向的特徵,即畫素數值變化較大; 而透過第二個卷積核計算後,第三列的數值為0,第二行的數值絕對值最大,說明原始圖片上對應的地方有一條水平方向的特徵,即畫素值數值變化較大。 這樣就提取出了大致的兩個特徵,透過在更深層次的網路中設定更多更巧妙的卷積核,我們就可以得到更多更準確的特徵。 我們設計的卷積核分別能夠提取,或者說檢測出原始圖片的特定的特徵。所以實際上就可以把卷積核理解為特徵提取器,我們不需要手動去選取特徵,只用設計好卷積核的尺寸,數量和滑動的步長就可以讓它自己去訓練了。同時,由於多個神經元可以共享卷積核,對於高位資料的處理將會變得非常簡單。 留下幾個小問題供大家思考:

1。卷積核的尺寸必須為正方形嗎?可以為長方形嗎?如果是長方形應該怎麼計算?

2。卷積核的個數如何確定?每一層的卷積核的個數都是相同的嗎?

3。步長的向右和向下移動的幅度必須是一樣的嗎?

在最後我將給出這些問題的答案。

2.2.5 多通道圖的卷積運算

這裡先介紹單通道圖和多通道圖的概念 (一):單通道圖 俗稱灰度圖,每個畫素點只能有有一個值表示顏色,它的畫素值在0到255之間,0是黑色,255是白色,中間值是一些不同等級的灰色。(也有3通道的灰度圖,3通道灰度圖只有一個通道有值,其他兩個通道的值都是零)。 (二):三通道圖 每個畫素點都有3個值表示 ,所以就是3通道。也有4通道的圖。例如RGB圖片即為三通道圖片,RGB色彩模式是工業界的一種顏色標準,是透過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標準幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。總之,每一個點由三個值表示。

之前的卷積運算的例子都是以有高、長方向的2維形狀的單通道圖為物件的。 但是, 影象是3維資料,除了高、長方向之外,還需要處理通道方向。這裡,我們按照與之前相同的順序,看一下對加上了通道方向的3維資料進行卷積運算的例子。這裡以3通道的資料為例, 展示了卷積運算的結果。和2維資料時相比,可以發現縱深方向(通道方向)上特徵圖增加了。通道方向上有多個特徵圖時,會按通道進行輸入資料和濾波器的卷積運算,並將結果相加,從而得到輸出。

初識卷積神經網路(CNN)

需要注意的是,在3維資料的卷積運算中,輸入資料和濾波器的通道數要設為相同的值。從上圖可知,每個卷積核輸出一張特徵圖,而多個卷積核輸出的特徵圖彙集在一起,傳遞給下一層,這就是CNN的處理流。 最後再看看一看卷積運算中的處理流是什麼亞子。

初識卷積神經網路(CNN)

三、 池化

講了這麼久的卷積,終於來到了池化(pooling)層 池化是縮小高、長方向上的空間的運算。比如,如圖所示,進行將 2×2的區域集約成1個元素的處理,縮小空間大小。一般來說,池化的視窗大小會 和步幅設定成相同的值。

初識卷積神經網路(CNN)

除了MaxPooling之外,還有AveragePooling等。相對於MaxPooling是從目標區域中取出最大值,AveragePooling則是計算目標區域的平均值。 在影象識別領域,主要使用MaxPooling。

那麼問題來了,為什麼MaxPooling能起到效果呢

MaxPooling意義在哪裡?如果我們只取最大值,那其他的值被捨棄難道就沒有影響嗎?不會損失這部分資訊嗎?如果認為這些資訊是可損失的,那麼是否意味著我們在進行卷積操作後仍然產生了一些不必要的冗餘資訊呢?

其實從上文分析卷積核為什麼有效的原因來看,每一個卷積核可以看做一個特徵提取器,不同的卷積核負責提取不同的特徵,我們例子中設計的第一個卷積核能夠提取出“垂直”方向的特徵,第二個卷積核能夠提取出“水平”方向的特徵,那麼我們對其進行MaxPooling操作後,提取出的是真正能夠識別特徵的數值,其餘被捨棄的數值,對於我提取特定的特徵並沒有特別大的幫助。 在進行後續計算時,就減小了特徵圖的尺寸,從而減少引數,達到減小計算量,缺不損失效果的情況。

這也意味著MaxPooling對微小的位置變化具有健壯性,輸入資料發生微小偏差時,池化仍會返回相同的結果,池化會吸收輸入資料的偏差(根據資料的不同,結果有可能不一致)。

不過並不是所有情況MaxPooling的效果都很好,有時候有些周邊資訊也會對某個特定特徵的識別產生一定效果,那麼這個時候捨棄這部分“不重要”的資訊,就不划算了。所以還要具體情況具體分析,如果加了Max Pooling後效果反而變差了,不如把卷積後不加MaxPooling的結果與卷積後加了MaxPooling的結果輸出對比一下,看看MaxPooling是否對卷積核提取特徵起了反效果。

3.1 Flatten層 & Fully Connected Layer

到這一步,其實我們的一個完整的“卷積部分”就算完成了,如果想要疊加層數,一般也是疊加“Conv-MaxPooing“,透過不斷的設計卷積核的尺寸,數量,提取更多的特徵,最後識別不同類別的物體。做完MaxPooling後,我們就會把這些資料“拍平”,丟到Flatten層,然後把Flatten層的output放到full connected Layer裡,採用softmax對其進行分類。

初識卷積神經網路(CNN)

初識卷積神經網路(CNN)

四、 CNN的視覺化

學習前的濾波器是隨機進行初始化的,所以在黑白的濃淡上沒有規律可循,但學習後的濾波器變成了有規律的影象。我們發現,透過學習,濾波器被更新成了有規律的濾波器,比如從白到黑漸變的濾波器、含有塊狀區域(稱為blob)的濾波器等。

初識卷積神經網路(CNN)

如果要問右邊的有規律的濾波器在“觀察”什麼,答案就是它在觀察邊緣(顏色變化的分界線)和斑塊(區域性的塊狀區域)等。比如,左半部分為白色、右半部分為黑色的濾波器的情況下,如圖所示,會對垂直方向上的邊緣有響應。

初識卷積神經網路(CNN)

五、問題小結

最後是上面給大家留下的問題 1。卷積核的尺寸必須為正方形嗎?可以為長方形嗎?如果是長方形應該怎麼計算?

2。卷積核的個數如何確定?每一層的卷積核的個數都是相同的嗎?

3。步長的向右和向下移動的幅度必須是一樣的嗎?

下面的想法,可以作為參考:

1。卷積核的尺寸不一定非得為正方形。長方形也可以,只不過通常情況下為正方形。如果要設定為長方形,那麼首先得保證這層的輸出形狀是整數,不能是小數(一些框架會對小數進行四捨五入處理,一些會引起報錯)。如果你的影象是邊長為 28 的正方形。那麼卷積層的輸出就滿足 [ (28 - kernel_size)/ stride ] + 1 ,這個數值得是整數才行,否則沒有物理意義。池化層同理。FC 層的輸出形狀總是滿足整數,其唯一的要求就是整個訓練過程中 FC 層的輸入得是定長的。如果你的影象不是正方形。那麼在製作資料時,可以縮放到統一大小(非正方形),再使用非正方形的卷積核來使得卷積層的輸出依然是整數。總之,撇開網路結果設定的好壞不談,其本質上就是在做算術應用題:如何使得各層的輸出是整數。

2。由經驗確定。通常情況下,靠近輸入的卷積層,譬如第一層卷積層,會找出一些共性的特徵,如手寫數字識別中第一層我們設定卷積核個數為5個,一般是找出諸如”橫線“、“豎線”、“斜線”等共性特徵,我們稱之為basic feature,經過池化後,在第二層卷積層,設定卷積核個數為20個,可以找出一些相對複雜的特徵,如“橫折”、“左半圓”、“右半圓”等特徵,越往後,卷積核設定的數目越多,越能體現的特徵就越細緻,就越容易分類出來。比如你想分類出“0”的數字,你看到

初識卷積神經網路(CNN)

這個特徵,能推測是什麼數字呢?只有越往後,檢測識別的特徵越多,試過才能慢慢能識別出

初識卷積神經網路(CNN)

這幾個特徵,那麼我就能夠確定這個數字是“0”。

3。有stride_w和stride_h,表示左右步長和上下步長。如果用stride,則表示stride_h=stride_w=stride。

知乎的圖片上傳真的是爛的亞批。。。高畫質配圖版本和更多持續更新內容歡迎移步我的簡書 id: Desirelife6

以及個人部落格