卷積在圖像處理中的應用(轉自https://medium.com/@irhumshafkat/intuitively-understanding-convolutions-for-deep-learn

直觀理解深度學習的卷積

探索使他們工做的強大視覺層次

 

近年來強大且多功能的深度學習框架的出現使得能夠將卷積層應用到深度學習模型中,這是一項很是簡單的任務,一般能夠在一行代碼中實現。html

然而,理解卷積,特別是第一次理解卷積經常會讓人感到有些不安,諸如內核,濾波器,通道等都是相互堆疊在一塊兒的。然而,卷積做爲一個概念是很是強大和高度可擴展的,在這篇文章中,咱們將逐步分解卷積操做的機制,將它與標準的徹底鏈接的網絡相關聯,並探索它們是如何創建強大的視覺層次結構,使其成爲圖像的強大特徵提取器。git

2D卷積:操做

二維卷積是一個至關簡單的操做:從一個核心開始,它只是一個小的權重矩陣。該內核在2D輸入數據上「滑動」,對當前輸入的部分進行元素乘法運算,而後將結果彙總爲單個輸出像素。github

 

標準卷積[1]算法

內核爲它滑過的每一個位置重複此過程,將特徵的二維矩陣轉換爲另外一個二維特徵矩陣。輸出特徵實質上是位於輸入層上的輸出像素的相同位置上的輸入特徵的加權和(其權重是內核自己的值)。canvas

不管輸入特徵是否落入這個「大體相同的位置」,直接取決於它是否在產生輸出的內核區域。這意味着內核的大小直接決定了在生成新的輸出特性時多少個(或幾個)輸入特徵相結合。安全

這與徹底鏈接的層徹底相反。在上面的例子中,咱們有5×5 = 25個輸入特徵,3×3 = 9個輸出特徵。若是這是一個標準的徹底鏈接圖層,那麼您將擁有25×9 = 225個參數的權重矩陣,每一個輸出特徵是每一個輸入特徵的加權和卷積容許咱們僅使用9個參數進行這種轉換,每一個輸出特性不是「查看」每一個輸入特徵,而是隻是「查看」來自大體相同位置的輸入特徵。請注意這一點,由於這對咱們後面的討論相當重要。網絡

一些經常使用的技術

在咱們繼續以前,絕對值得研究兩種卷積層中常見的技術:Padding和Strides。架構

  • 填充:若是您看到上面的動畫,請注意,在滑動過程當中,邊緣基本上會「裁剪掉」,將5×5特徵矩陣轉換爲3×3特徵矩陣。邊緣上的像素永遠不在內核的中心,由於內核沒有任何東西能夠擴展到邊緣以外。這並不理想,由於咱們常常但願輸出的大小等於輸入。
 

相同的填充[1]框架

填充作一些很是聰明的事來解決這個問題:用額外的「假」像素(一般值爲0,所以常用的術語「零填充」)填充邊緣。這樣,滑動時的內核能夠容許原始邊緣像素位於其中心,同時延伸到邊緣以外的假像素,從而產生與輸入相同大小的輸出。less

  • Striding:常常運行卷積圖層時,您須要比輸入尺寸更小的輸出。這在卷積神經網絡中是常見的,其中在增長通道數量時空間尺寸的大小減少。實現這一點的一種方法是使用池化層(例如,取每2×2網格的平均值/最大值將每一個空間維度減半)。還有一種方法是使用步伐:
 

步幅2卷積[1]

邁進的想法是跳過內核的一些幻燈片位置。步驟1意味着選擇一個像素,所以基本上每一個幻燈片都是標準卷積。步幅2意味着選擇幻燈片2像素,跳過過程當中的每一張幻燈片,縮小大約2倍,步幅3表明跳過每2張幻燈片,大體縮小3倍,等等。

更爲現代化的網絡,例如ResNet架構徹底放棄了在其內部層中聚集層,在須要減小輸出尺寸時採用逐步卷積。

多通道版本

固然,上面的圖表僅涉及圖像具備單個輸入通道的狀況。實際上,大多數輸入圖像都有3個通道,這個數字只會增長你進入網絡的深度。通常來講,思考渠道很是容易,由於它是對整個形象的「見解」,強調某些方面而不強調其餘方面。

 
大多數狀況下,咱們用三個通道處理RGB圖像。(信貸: Andre Mouton
 
過濾器:內核的集合

因此這就是術語之間的一個關鍵區別派上用場的地方:而在1通道的狀況下,濾波器和內核這兩個術語能夠互換,在通常狀況下,它們實際上很不相同。每一個過濾器實際上剛好是一個內核的集合 與存在是爲每個輸入信道到第1級的內核,而且每一個內核是惟一的。

卷積圖層中的每一個濾鏡都會產生一個且只有一個輸出通道,而且它們是這樣作的:

過濾器的每一個內核在各自的輸入通道上「滑動」,產生每一個處理版本。一些內核可能比其餘內核具備更強的權重,以便比某些內核更強調某些輸入通道(例如,過濾器可能具備比其餘內核通道權重更大的紅色內核通道,所以,對紅色通道功能的差別的反應比其餘)。

 

而後將每一個通道處理的版本彙總在一塊兒造成一個通道。過濾器的內核每一個產生一個版本的每一個通道,而且整個過濾器產生一個總體輸出通道。

 

最後,這裏有一個偏向的術語。這裏偏置項的工做方式是每一個輸出濾波器都有一個偏置項。到目前爲止,偏置被添加到輸出通道以產生最終輸出通道。

 

在單個濾波器的狀況下,任何數量的濾波器的狀況都是相同的:每一個濾波器使用其本身的不一樣的內核集合和具備上述過程的標量誤差來處理輸入,從而產生單個輸出通道。而後將它們鏈接在一塊兒以產生整體輸出,其中輸出通道的數量是過濾器的數量。而後一般應用非線性,而後將其做爲輸入傳遞給另外一個卷積層,而後重複此過程。

2D卷積:直覺

卷積仍然是線性變換

即便使用卷積層的機制,仍然很難將其與標準的前饋網絡聯繫起來,但它仍不能解釋爲何卷積縮放到,而且對圖像數據的工做更好。

假設咱們有一個4×4的輸入,而且咱們想把它轉換成一個2×2的網格。若是咱們使用的是前饋網絡,咱們會將4×4輸入重塑爲一個長度爲16的矢量,並將其經過一個具備16個輸入和4個輸出的密集鏈接層。能夠將一個圖層的權重矩陣W可視化

 
總而言之,大約有64個參數

儘管卷積核函數起初看起來有點奇怪,但它仍然是一個具備等價變換矩陣的線性變換。若是咱們在整形的4×4輸入上使用大小爲3 的內核K來得到2×2的輸出,那麼等價變換矩陣多是:

 
這裏只有9個參數。

(注意:雖然上面的矩陣是一個等價的變換矩陣,但實際操做一般是做爲一個很是不一樣的矩陣乘法實現的)[2]

總體而言,卷積仍然是一種線性變換,但同時它也是一種大相徑庭的變換。對於一個有64個元素的矩陣,只有9個參數能夠重複使用幾回。每一個輸出節點只能看到必定數量的輸入(內核中的輸入)。與任何其餘輸入都沒有交互,由於它們的權重設置爲0。

將卷積運算看做權重矩陣硬先驗頗有用在此狀況下,我以前的意思是預約義的網絡參數。例如,當您使用預訓練模型進行圖像分類時,可使用預訓練的網絡參數做爲您的最終密集鏈接圖層的特徵提取器。

從這個意義上說,爲何二者都如此高效(與他們的選擇相比)之間存在直接的直覺。與隨機初始化相比,傳輸學習效率高達數量級,由於您只須要優化最終徹底鏈接層的參數,這意味着您能夠得到夢幻般的性能,每一個類只有幾十個圖像。

在這裏,您不須要優化全部64個參數,由於咱們將其中的大部分參數設置爲零(而且它們將保持這種方式),其他的咱們轉換爲共享參數,從而僅優化9個實際參數。這個效率很重要,由於當你從MNIST的784個輸入移動到真實世界的224×224×3圖像時,這就超過了150,000個輸入。試圖將輸入減半到75,000個輸入的密集層仍然須要超過100 億個參數。爲了比較,ResNet-50 整個參數大約有2500萬個。

所以,將一些參數固定爲0,並綁定參數會提升效率,但與傳輸學習案例不一樣的是,咱們知道先驗是好的,由於它適用於大量通用圖像,咱們怎麼知道有什麼好處呢?

答案在於先驗的特徵組合致使參數學習。

局部性

在本文早期,咱們討論了這一點:

  • 內核僅未來自小局部區域的像素組合爲輸出。也就是說,輸出功能只能「看到」來自小局部區域的輸入功能。
  • 內核在整個圖像中被全局應用以產生輸出矩陣。

所以,從網絡的分類節點一路回傳,內核具備學習權重的有趣任務,以僅從一組本地輸入中產生特徵。此外,因爲內核自己應用於整個映像,內核學習的功能必須足夠廣泛以來自映像的任何部分。

若是這是其餘類型的數據,例如。應用程序的分類數據安裝,這將一直是個災難,只是由於你的號碼應用安裝應用型列彼此相鄰,並不意味着他們有任何「本地,共享功能」共同使用的應用程序安裝日期使用時間固然,這四者可能有一個潛在的更高層次的特徵(例如,人們最想要的應用程序),可是這使咱們沒有理由相信前二者的參數與後二者的參數徹底相同。這四人可能已經以任何(一致)的順序,並仍然有效!

然而,像素老是以一致的順序出現,而且附近的像素影響像素,例如,若是全部附近的像素都是紅色的,則像素極可能也是紅色的。若是存在誤差,這是一個有趣的異常,能夠轉換成一個特徵,全部這一切均可以經過比較一個像素與其鄰居以及其本地的其餘像素來檢測。

這個想法其實是許多早期的計算機視覺特徵提取方法的基礎。例如,對於邊緣檢測,可使用Sobel邊緣檢測濾波器,這是一種具備固定參數的內核,與標準單通道卷積同樣工做:

 
應用垂直邊緣檢測器內核

對於包含非邊的網格(例如背景天空),大多數像素是相同的值,所以內核在該點的總輸出爲0.對於具備垂直邊緣的網格,邊緣左側和右側的像素,內核計算出該差值爲非零值,激活並顯示邊緣。內核一次只能處理3×3的網格,檢測局部範圍內的異常,但在整個圖像中應用時,足以在圖像中的任意位置檢測全局範圍內的某個特徵!

所以,咱們與深度學習的關鍵區別在於問這個問題:能夠學習有用的內核嗎?對於在原始像素上運行的早期圖層,咱們能夠合理地指望具備至關低級特徵的特徵檢測器,如邊緣,線條等。

有一整套深度學習研究集中於使神經網絡模型可解釋。使用優化的特徵可視化是最強大的工具之一[3]核心思想很簡單:優化圖像(一般用隨機噪聲初始化)以儘量強烈地激活濾鏡。這確實具備直觀的意義:若是優化後的圖像徹底充滿了邊緣,這就是過濾器自己正在尋找並被激活的有力證據。使用這個,咱們能夠窺探學到的過濾器,結果使人驚歎:

 
從GoogLeNet [3]的第一個卷積層的3個不一樣通道的特徵可視化。注意,儘管它們檢測不一樣類型的邊緣,但它們仍然是低級邊緣檢測器。
 
從第二和第三卷積中可視化通道12 [3]

這裏須要注意的一件重要事情是,卷積圖像仍然是圖像。圖像左上方的小網格像素的輸出仍然位於左上角。所以,您能夠在另外一個上面運行另外一個卷積圖層(例如左側的兩個卷積圖層)以提取更深層的特徵,這些特徵是咱們可視化的。

然而,不管咱們的特徵探測器的深度如何,沒有任何進一步的改變,它們仍然會在很是小的圖像塊上運行。不管您的探測器有多深,都沒法從3×3網格中探測到面部。這就是接受領域的想法出現的地方。

接受領域

任何CNN架構的基本設計選擇是,從網絡的開始到結束,輸入尺寸愈來愈小,同時通道數量也愈來愈多。如前所述,這一般是經過步驟或合併層完成的。局部性決定輸出結果來自前一層的輸入。接受區域決定了輸出到達整個網絡的原始輸入區域

分步卷積的思想是咱們只處理幻燈片一個固定的距離,並跳過中間的幻燈片。從另外一個角度來看,咱們只保留輸出相距固定的距離,並去除其他部分[1]。

 
3×3卷積,步幅2

而後,咱們將非線性應用於輸出,並按照慣例,而後在頂部堆疊另外一個新的卷積層。這就是事情變得有趣的地方。即便咱們將具備相同局部區域大小的相同大小的核(3×3)應用於逐步卷積的輸出,內核也將具備更大的有效感覺域:

 

這是由於交錯層的輸出仍然表明相同的圖像。它不是調整大小,而是調整大小,只是輸出中的每一個單個像素都是來自原始輸入的相同粗略位置的更大區域(其餘像素被丟棄)的「表明」。所以,當下一層的內核在輸出上運行時,它會對從更大區域收集的像素進行操做。

(注意:若是你熟悉擴張的卷積,注意上述不是擴張的卷積,二者都是增長感覺野的方法,可是擴張的卷積是單層的,而這是發生在一個規則的卷積以後卷積,其間具備非線性)

 
特徵可視化來自每一個主要卷積塊集合的信道,顯示出複雜性逐漸增長[3]

接受域的這種擴展容許卷積層將低級特徵(線,邊)組合成更高級的特徵(曲線,紋理),就像咱們在混合3a層看到的同樣。

接下來是一個池/跨層,網絡繼續爲更高層次的特徵(零件,模式)建立探測器,就像咱們看到的混合4a同樣。

整個網絡圖像大小的重複減小致使第5塊卷積,輸入尺寸僅爲7×7,而輸入尺寸爲224×224。此時,每一個單個像素表明一個32×32像素的網格,這是巨大的。

與早期的圖層相比,激活意味着要檢測邊緣,在這裏,微小的7×7網格上的激活是很是高級的特徵之一,例如鳥類。

整個網絡從少許濾波器(GoogLeNet中的64個),檢測低級特徵,到大量濾波器(最終卷積中的1024個),每一個濾波器都尋找一個很是特定的高級特徵。隨後是最終的合併圖層,將每一個7×7網格摺疊爲一個像素,每一個通道都是一個特徵檢測器,具備與整個圖像相同的接受區域

與標準的前饋網絡所作的相比,這裏的輸出真是使人驚歎。一個標準的前饋網絡將產生抽象的特徵向量,從圖像中的每一個單一像素的組合,須要難以處理的數據量進行訓練。

美國有線電視新聞網在開始學習很是低級別的特徵探測器的同時,開始學習很是低層次的特徵探測器,而且隨着其接受範圍的擴大,學習將這些低級特徵結合到逐步升級的特徵中; 不是每一個像素的抽象組合,而是一個強大的視覺層次的概念。

經過檢測低級特徵,並使用它們來檢測更高級別的特徵,隨着它進入其視覺層次結構,它最終可以檢測整個視覺概念,例如臉部,鳥類,樹木等,這就是使它們如此強大的緣由高效的圖像數據。

關於對抗性攻擊的最後說明

隨着視覺層次CNN的構建,假設他們的視覺系統與人類類似是至關合理的。他們對真實世界的圖像很是棒,但他們的失敗方式也強烈暗示他們的視覺系統並不徹底像人類同樣。最主要的問題:敵對案例[4],爲了欺騙這個模型而特地修改過的例子。

 
對於一我的來講,這兩張圖片顯然都是熊貓。對這個模型來講,沒有那麼多。[4]

若是形成模型失敗的惟一被篡改的模型就是人類會注意到的模型,那麼敵對的例子就不是問題。問題在於,這些模型容易受到僅僅被輕微篡改的樣本的攻擊,而且顯然不會欺騙任何人。這爲模型悄無聲息地打開了大門,對於從自動駕駛汽車到醫療保健等各類應用而言,這可能很是危險。

針對敵對攻擊的穩健性是當前很是活躍的研究領域,是許多論文甚至競爭的主題,解決方案確定會提升CNN架構的安全性和可靠性。

結論

CNN是容許計算機視覺從簡單應用擴展到爲複雜產品和服務提供支持的模型,從照片庫中的人臉檢測到更好的醫療診斷。它們多是將來計算機視覺領域的關鍵方法,或者其餘一些新的突破可能就在眼前。不管如何,有一件事是確定的:它們無可估量,是當今許多創新應用程序的核心,並且絕對值得深刻理解。

參考

  1. 深度學習的卷積算法指南
  2. 用於視覺識別的CS231n卷積神經網絡 - 卷積神經網絡
  3. 特徵可視化 - 神經網絡如何加強他們對圖像的理解(注意:這裏的特徵可視化是用Lucid庫生成的,這是本期刊文章中技術的開源實現)
  4. 敵對機器進攻機器學習

更多資源

  1. fast.ai - 第3課:改進你的圖像分類器
  2. Conv Nets:模塊化視角
  3. 使用很是少的數據創建強大的圖像分類模型
相關文章
相關標籤/搜索