實戰卷積神經網路

在近些年,深度學習領域的卷積神經網路(CNNs或ConvNets)在各行各業為我們解決了大量的實際問題。但是對於大多數人來說,CNN彷彿戴上了神祕的面紗。

CNN能做什麼

CNN是深度學習演算法在影象處理領域的一個應用。主要被用來找尋圖片中的模式。這個過程主要有兩個步驟,首先要對圖片做卷積,然後找尋模式。在神經網路中,前幾層是用來尋找邊界和角,隨著層數的增加,我們就能識別更加複雜的特徵。這個性質讓CNN非常擅長識別圖片中的物體。

學習CNN之前,我們需要對CNN和Deep Learning有一個簡單的瞭解。
Deep Learning強大的地方就是可以利用網路中間某一層的輸出當做是資料的另一種表達,從而可以將其認為是經過網路學習到的特徵。基於該特徵,可以進行進一步的相似度比較等。Deep Learning演算法能夠有效的關鍵其實是大規模的資料,這一點原因在於每個DL都有眾多的引數,少量資料無法將引數訓練充分。

神經網路

簡要介紹下神經網路,神經網路的每個單元如下:
這裡寫圖片描述
對應的公式:
這裡寫圖片描述

該單元也可以被稱作是Logistic迴歸模型。當將多個單元組合起來並具有分層結構時,就形成了神經網路模型。其對於的結構圖如下:
這裡寫圖片描述
其對應的公式如下:
這裡寫圖片描述

CNN

神經網路的訓練方法也同Logistic類似,不過由於其多層性,還需要利用鏈式求導法則對隱含層的節點進行求導,即梯度下降 鏈式求導法則,專業名稱為反向傳播。
CNN是一種特殊的神經網路,它包含卷積層、池化層和啟用層。

卷積層

要想了解什麼是卷積神經網路,你首先要知道卷積是怎麼工作的。想象你有一個5*5矩陣表示的圖片,然後你用一個3*3的矩陣在圖片中滑動。每當3*3矩陣經過的點就用原矩陣中被覆蓋的矩陣和這個矩陣相乘。這樣一來,我們可以使用一個值來表示當前視窗中的所有點。下面是一個過程的動圖:
這裡寫圖片描述

正如你所見的那樣,特徵矩陣中的每一個項都和原圖中的一個區域相關。
在圖中像視窗一樣移動的叫做核。核一般都是方陣,對於小圖片來說,一般選用3*3的矩陣就可以了。每次視窗移動的距離叫做步長。值得注意的是,一些圖片在邊界會被填充零,如果直接進行卷積運算的話會導致邊界處的資料變小(當然圖片中間的資料更重要)。
卷積層的主要目的是濾波。當我們在圖片上操作時,我們可以很容易得檢查出那部分的模式,這是由於我們使用了濾波,我們用權重向量乘以卷積之後的輸出。當訓練一張圖片時,這些權重會不斷改變,而且當遇到之前見過的模式時,相應的權值會提高。來自各種濾波器的高權重的組合讓網路預測影象的內容的能力。 這就是為什麼在CNN架構圖中,卷積步驟由一個框而不是一個矩形表示; 第三維代表濾波器。

這裡寫圖片描述

池化層

池化層和卷積層很類似,也是用一個卷積核在圖上移動。唯一的不同就是池化層中核和圖片視窗的操作不再是線性的。最大池化和平均池化是最常見的池化函式。最大池化選取當前核覆蓋的圖片視窗中最大的數,而平均池化則是選擇圖片視窗的均值。
這裡寫圖片描述

啟用層

在CNN中,啟用函式和其他網路一樣,函式將數值壓縮在一個範圍內。下面列出了一些常見的函式。
在CNN中最常用的是relu(修正線性單元)。人們有許多喜歡relu的理由,但是最重要的一點就是它非常的易於實現,如果數值是負數則輸出0,否則輸出本身。這種函式運算簡單,所以訓練網路也非常快。

總結

CNN中主要有三種層,分別是:卷積層、池化層和啟用層。
卷積層使用卷積核和圖片視窗相乘,並使用梯度下降法去優化卷積核。
池化層使用最大值或者均值來描述一個圖形視窗。
啟用層使用一個啟用函式將輸入壓縮到一個範圍中,典型的[0,1][-1,1]。

這裡寫圖片描述

CNN例項

讓我們來看一個例項,實現使用keras識別貓咪。
這裡寫圖片描述

這張圖長400畫素寬320畫素,有三個通道(rgb)的顏色。那麼經過一層卷積運算之後會變成什麼樣子呢?

這裡寫圖片描述

這是用一個3*3的卷積核和三個濾波器處理的效果。
我們可以看到,圖中的貓非常的模糊,因為我們使用了一個隨機的初始值,而且我們還沒有訓練網路。他們都在彼此的頂端,即使每層都有細節,我們將無法看到它。但我們可以製作出與眼睛和背景相同顏色的貓的區域。如果我們將核心大小增加到10×10,會發生什麼呢?

這裡寫圖片描述

我們可以看到,由於核心太大,我們失去了一些細節。還要注意,從數學角度來看,卷積核越大,影象的形狀會變得越小。
這裡寫圖片描述

這張看起來好多了!現在我們可以看到我們的過濾器看到的一些事情。看起來紅色替換掉了黑色的鼻子和黑色眼睛,藍色替換掉了貓邊界的淺灰色。我們可以開始看到圖層如何捕獲照片中的一些更重要的細節。

這裡寫圖片描述

如果我們增加核心大小,我們得到的細節就會越來越明顯,當然影象也比其他兩個都小。

增加一個啟用層

這裡寫圖片描述

我們通過新增一個relu,去掉了很多不是藍色的部分。

增加一個池化層

我們新增一個池化層(擺脫啟用層最大限度地讓圖片更加更容易顯示)。

這裡寫圖片描述

正如預期的那樣,貓咪變成了斑駁的,而我們可以讓它更加斑駁。

這裡寫圖片描述

啟用和最大池化

這裡寫圖片描述

如果我們將貓咪的圖片放到LeNet模型中做卷積和池化,那麼效果會怎麼樣呢?

LeNet

這裡寫圖片描述

CNN是非常強大的,雖然這些視覺化並不完美,但我希望他們能夠幫助像我這樣正在嘗試更好地理解ConvNets的人。

部落格原文:https://hackernoon.com/@erikreppel