卷積神經網絡 (Convolutional Neural Networks,簡稱CNN),是一種經典的神經網絡算法。因爲在圖像識別領域取得的良好效果,隨着人工智能的火熱,它也受到愈來愈多的關注。CNN的核心概念卷積、池化聽起來好像很神祕,瞭解以後會發現其實也並不複雜。本文試圖用通俗的語言,簡明扼要地介紹這些關鍵的概念,給讀者帶來一個直觀的理解。做者在文章最後給出了一些參考資料,以便讀者進一步參考。算法
1、爲何要提出CNN?網絡
咱們知道CNN是一種基於神經網絡的算法。而傳統的神經網絡,多層感知機(MLP),在圖像識別領域的效果並很差。緣由也很容易理解:按照傳統網絡的觀點,要處理圖像,須要將圖片按行展開,每個像素就是一個輸入。可想而知,參數數量會多麼巨大,而這又會帶來更多問題:須要龐大的數據集、漫長的訓練時間不說,還容易帶來讓人頭疼的過擬合問題。架構
以手寫體識別爲例,一個圖像通過平移、旋轉、縮放等變換會呈現出不一樣的姿態。人類很容易應對這種變換,可是對於傳統的神經網絡來講,其泛化能力就不足以處理這些變換了。機器學習
還有一個問題,圖像自己帶有拓撲結構——典型的二維結構。而傳統的全鏈接網絡不能有效利用這種結構。在進入神經網絡以前,這些重要的結構信息就已經被破壞掉了。爲了解決上面提到的各類問題,LeCun在1998年提出了LeNet,今後CNN應運而生。函數
2、什麼是卷積?性能
首先來看看「卷積」這個關鍵概念。首先須要明確的是,卷積不是在CNN中被提出的,而是一種有着普遍應用的數學運算,有明確的數學定義和物理意義。在圖像處理領域經常使用卷積操做,不少圖像處理操做好比模糊、銳化等均可以經過卷積來實現。學習
下面來看看CNN中卷積運算是怎麼進行的:對於給定的一幅圖像來講,給定一個卷積核,卷積操做就是根據卷積窗口進行加權求和。卷積窗口在整個圖片上滑動,在每個位置輸出一個數值,最終仍然輸出一個矩陣。以下圖所示:人工智能
在圖像處理中,卷積核是已知的。而在CNN的卷積層,卷積核的參數也是須要訓練的。在LeCun的論文中,他使用局部感覺野的概念來解釋其原理。考慮到人類在感知目標時老是從局部到整體、從片面到全面的,這樣就從神經科學的角度解釋了卷積層的原理。本文從另外一個角度解釋,卷積能夠視爲圖像處理的操做,可是圖像變換的參數是未知的,須要從數據集中學習獲得。這正是機器學習方法擅長的套路。.net
但願上面的解釋能使讀者對卷積產生一個直觀的認識。實際上CNN中的卷積和數學上的卷積並不徹底一致,若是想要進一步理解卷積的概念和應用,能夠參閱下面給出的參考資料。翻譯
3、什麼是池化?
LeNet5中第一個隱藏層是卷積層,第二個隱藏層就是池化層。池化,實際上也沒有聽上去那麼神祕,其實就是圖片下采樣 (sub-sampling)。具體來講就是對圖片的每一個子區域進行聚合統計,例如最大值、平均值等。獲得的效果是相鄰的幾個像素合併成一個像素。下面舉一個例子 (2, 2) 最大池化的例子。
假設原圖是一張4 * 4的圖片,(2, 2) 池化就是對相鄰的4個像素,取最大值做爲下采樣後的像素值。計算過程以下所示:
通過這次下采樣,咱們獲得處理後的圖片爲:
池化的方法還有不少,好比可使用不一樣的聚合函數,還有重疊採樣的池化等。那麼在神經網絡中加入池化層有什麼做用呢?首先,很明顯地,通過池化後像素點的個數大大減小了,訓練參數的數量也隨之降低。在計算能力足夠的狀況下是否是就不須要池化了呢?也不是的,池化的過程省略掉了圖片的一些細節,這樣有利於避免過擬合,增長模型的泛化性能。
4、全鏈接層
在通過若干次卷積和池化以後,特徵圖被送到全鏈接層進行分類。全鏈接層的功能至關於經典的前向全鏈接網絡,所以做爲分類器是很是天然的。回過頭來看CNN的總體架構,能夠把卷積和池化的步驟看作是特徵提取的過程,把最後的全鏈接層看作一個分類器。這就回歸到機器學習的經典套路了,理解這種結構也比較天然了。
5、總結
本文簡要介紹了CNN中的幾個關鍵性的概念,力圖清晰,不求全面。最後,做者也是剛剛接觸深度學習不久,若有謬誤之處,還請批評指正。
參考資料