1. 程式人生 > >卷積神經網路的直觀解釋(筆記)

卷積神經網路的直觀解釋(筆記)

原文地址:請戳這裡
譯文地址:請戳這裡

這篇博文讓我對卷積神經網路有了更好的理解,我把要點整理在這裡,供以後回顧:
如果你對神經網路也不是很熟悉的話,請戳這裡

卷積神經網路( ConvNets或者CNNs)是神經網路的範疇。

應用領域:影象識別、語音識別、自然語言處理(如語句分類)。可以識別人臉、物體和交通訊號,從而為機器人和自動駕駛汽車提供視力。也可以識別場景,提供相關的標籤。

LeNets架構(1990s)

LeNets是最早的卷積神經網路。
經過多次成功迭代,1998年,Yann LeCun 把這項工作命名為LeNets5。該架構主要用於字元識別,如郵編,數字等。

卷積神經網路如下圖所示:

這裡寫圖片描述

主要有四個操作:

  1. 卷積
  2. 非線性處理(ReLU)
  3. 池化或亞取樣
  4. 分類(全連線層)

影象是畫素值的矩陣

這裡寫圖片描述

通道:用於表示影象的某種組成。一個標準數字相機拍攝的影象會有三通道 - 紅、綠和藍;你可以把它們看作是堆在一起的深度為3的二維矩陣(每一個通道代表一個顏色),每個通道的畫素值在 0 到 255 的範圍內。

灰度影象:僅僅只有一個通道,就是一個普通的二維矩陣。矩陣中各個畫素的值在 0 到 255 的範圍內——零表示黑色,255 表示白色。

卷積

卷積的目的:為了從輸入影象中提取特徵。卷積可以通過從輸入的一小塊資料中學到影象的特徵,並可以保留畫素間的空間關係。

原始影象:
這裡寫圖片描述

特徵檢測器:
這裡寫圖片描述

卷積過程:
這裡寫圖片描述

在 CNN 的術語中,3x3 的矩陣叫做“濾波器(filter)”或者“核(kernel)”或者“特徵檢測器(feature detector)”。
通過在影象上滑動濾波器並計算點乘得到矩陣叫做“卷積特徵(Convolved Feature)”或者“啟用圖(Activation Map)”或者“特徵圖(Feature Map)”。
濾波器在原始輸入影象上的作用是特徵檢測器。
對於同樣的輸入影象,不同值的濾波器將會生成不同的特徵圖。
通過在卷積操作前修改濾波矩陣的數值,我們可以進行諸如邊緣檢測、銳化和模糊等操作 —— 這表明不同的濾波器可以從圖中檢測到不同的特徵,比如邊緣、曲線等。

這裡寫圖片描述

在實踐中,CNN 會在訓練過程中學習到這些濾波器的值(儘管我們依然需要在訓練前指定諸如濾波器的個數、濾波器的大小、網路架構等引數)。我們使用的濾波器越多,提取到的影象特徵就越多,網路所能在未知影象上識別的模式也就越好。

特徵圖的大小(卷積特徵)由三個引數控制:深度(depth)、步長(stride)、零填充(zero-padding)。

深度:深度對應的是卷積操作所需的濾波器個數。在下圖的網路中,我們使用三個不同的濾波器對原始影象進行卷積操作,這樣就可以生成三個不同的特徵圖。你可以把這三個特徵圖看作是堆疊的 2d 矩陣,那麼,特徵圖的“深度”就是三。
這裡寫圖片描述

步長:步長是我們在輸入矩陣上滑動濾波矩陣的畫素數。當步長為 1 時,我們每次移動濾波器一個畫素的位置。當步長為 2 時,我們每次移動濾波器會跳過 2 個畫素。步長越大,將會得到更小的特徵圖。

零填充:有時,在輸入矩陣的邊緣使用零值進行填充,這樣我們就可以對輸入影象矩陣的邊緣進行濾波。零填充的一大好處是可以讓我們控制特徵圖的大小。使用零填充的也叫做泛卷積,不適用零填充的叫做嚴格卷積。

非線性單元(ReLU)

在每次的卷積操作後都使用了一個叫做 ReLU 的操作。ReLU 表示修正線性單元(Rectified Linear Unit),是一個非線性操作。

這裡寫圖片描述

ReLU 是一個元素級別的操作(應用到各個畫素),並將特徵圖中的所有小於 0 的畫素值設定為零。ReLU 的目的是在 ConvNet 中引入非線性,因為在大部分的我們希望 ConvNet 學習的實際資料是非線性的(卷積是一個線性操作——元素級別的矩陣相乘和相加,所以我們需要通過使用非線性函式 ReLU 來引入非線性。

其他非線性函式,比如 tanh 或者 sigmoid 也可以用來替代 ReLU,但 ReLU 在大部分情況下表現是更好的。

池化

空間池化(Spatial Pooling)(也叫做亞採用或者下采樣)降低了各個特徵圖的維度,但可以保持大部分重要的資訊。空間池化有下面幾種方式:最大化、平均化、加和等等。
對於最大池化(Max Pooling),我們定義一個空間鄰域(比如,2x2 的視窗),並從視窗內的修正特徵圖中取出最大的元素。除了取最大元素,我們也可以取平均(Average Pooling)或者對視窗內的元素求和。在實際中,最大池化被證明效果更好一些。

這裡寫圖片描述

池化函式可以逐漸降低輸入表示的空間尺度。特別地,池化:

  • 使輸入表示(特徵維度)變得更小,並且網路中的引數和計算的數量更加可控的減小,因此,可以控制過擬合。
  • 使網路對於輸入影象中更小的變化、冗餘和變換變得不變性(輸入的微小冗餘將不會改變池化的輸出——因為我們在區域性鄰域中使用了最大化/平均值的操作。
  • 幫助我們獲取影象最大程度上的尺度不變性。它非常的強大,因為我們可以檢測影象中的物體,無論它們位置在哪裡。

目前為止的故事

到目前為止我們瞭解了卷積、ReLU 和池化是如何操作的。理解這些層是構建任意 CNN 的基礎是很重要的。

這裡寫圖片描述

如圖所示,我們有兩組卷積、ReLU & 池化層 —— 第二組卷積層使用六個濾波器對第一組的池化層的輸出繼續卷積,得到一共六個特徵圖。接下來對所有六個特徵圖應用 ReLU。接著我們對六個修正特徵圖分別進行最大池化操作。
這些層一起就可以從影象中提取有用的特徵,並在網路中引入非線性,減少特徵維度,同時保持這些特徵具有某種程度上的尺度變化不變性。
第二組池化層的輸出作為全連線層的輸入,我們會在下一部分介紹全連線層。

全連線層

全連線層是傳統的多層感知器,在輸出層使用的是 softmax 啟用函式(也可以使用其他像 SVM 的分類器,但在本文中只使用 softmax)。“全連線(Fully Connected)”這個詞表明前面層的所有神經元都與下一層的所有神經元連線。

卷積和池化層的輸出表示了輸入影象的高階特徵。全連線層的目的是為了使用這些特徵把輸入影象基於訓練資料集進行分類。

除了分類,新增一個全連線層也(一般)是學習這些特徵的非線性組合的簡單方法。從卷積和池化層得到的大多數特徵可能對分類任務有效,但這些特徵的組合可能會更好。

從全連線層得到的輸出概率和為 1。這個可以在輸出層使用 softmax 作為啟用函式進行保證。softmax 函式輸入一個任意大於 0 值的向量,並把它們轉換為0~1之間的數值向量,其和為1。

把它們組合起來——使用反向傳播進行訓練

卷積 + 池化層的作用是從輸入影象中提取特徵,而全連線層的作用是分類器。

這裡寫圖片描述

完整的卷積神經網路的訓練過程:

這裡寫圖片描述

實際上,現在有些表現最好的 ConvNet 擁有多達十幾層的卷積和池化層!同時,每次卷積層後面不一定要有池化層。

這裡寫圖片描述

其他的卷積網路

  • LeNet (1990s): 本文已介紹。
  • 1990s to 2012:在上世紀 90 年代後期至 2010 年初期,卷積神經網路進入孵化期。隨著資料量和計算能力的逐漸發展,卷積神經網路可以處理的問題變得越來越有趣。
  • AlexNet (2012) – 在 2012,Alex Krizhevsky (與其他人)釋出了 AlexNet,它是比 LeNet 更深更寬的版本,並在 2012 年的 ImageNet 大規模視覺識別大賽(ImageNet Large Scale Visual Recognition Challenge,ILSVRC)中以巨大優勢獲勝。這對於以前的方法具有巨大的突破,當前 CNN 大範圍的應用也是基於這個工作。
  • ZF Net (2013) – ILSVRC 2013 的獲勝者是來自 Matthew Zeiler 和 Rob Fergus 的卷積神經網路。它以 ZFNet (Zeiler & Fergus Net 的縮寫)出名。它是在 AlexNet 架構超引數上進行調整得到的效果提升。
  • GoogLeNet (2014) – ILSVRC 2014 的獲勝者是來自於 Google 的 Szegedy等人的卷積神經網路。它的主要貢獻在於使用了一個 Inception 模組,可以大量減少網路的引數個數(4M,AlexNet 有 60M 的引數)。
  • VGGNet (2014) – 在 ILSVRC 2014 的領先者中有一個 VGGNet 的網路。它的主要貢獻是展示了網路的深度(層數)對於效能具有很大的影響。
  • ResNets (2015) – 殘差網路是何凱明(和其他人)開發的,並贏得 ILSVRC 2015 的冠軍。ResNets 是當前卷積神經網路中最好的模型,也是實踐中使用 ConvNet 的預設選擇(截至到 2016 年五月)。
  • DenseNet (2016 八月) – 近來由 Gao Huang (和其他人)發表的,the Densely Connected Convolutional Network 的各層都直接於其他層以前向的方式連線。DenseNet 在五種競爭積累的目標識別基準任務中,比以前最好的架構有顯著的提升。可以在這裡看 Torch 實現

參考文獻

這裡寫圖片描述