1. 程式人生 > >如何理解卷積神經網路

如何理解卷積神經網路

通過實際例子來理解卷積神經網路:

1. 找橘貓:最簡單的辦法

今天我們的任務是找出圖中有沒有橘貓:

怎樣用最簡單(笨)的方法完成這個任務?那肯定是看圖中的橘色佔多少面積,比如說超過10%就認為有橘貓:

但怎麼告訴電腦?具體來說,影象在電腦中是按畫素(就是一個個點)儲存的:

可以計算每個點的色彩與“標準橘色”的接近程度。如果足夠接近,就認為屬於橘色。

例如,如果我們定義標準橘色是紅0.8,綠0.6,藍0.4。 那麼,如果某個點的紅色在0.7到0.9範圍,綠色在0.5到0.7範圍,藍色在0.3到0.5範圍,就可以認為它是橘色。

然後電腦檢查一遍所有點,統計有多少個橘色點。如果橘色點的個數超過全體點的10%,就認為有橘貓。這就是一個電腦可以理解的方法。

總結,這裡有兩個步驟:

1、對影象中的每個點進行相同的操作。

2、然後將結果彙總。

這是卷積神經網路的直觀思想,我們將在下文逐步看到它的更多細節。

現在還沒有出現“卷積”,不過,這樣簡單的方法,已經可以寫成一個卷積神經網路架構(這段是寫給懂神經網路的,不懂的同學可以先忽略),其中的卷積核是1x1,網路還得有幾層,需要用好幾個神經元,還需要做 Global Average Pooling。可以想想怎麼寫!

2. 找橘貓:更好的方法

上文的方法無疑是太簡單了,很容易誤報和漏報:

如何改進?應該再考慮其它特徵,例如紋理、形狀。特別是紋理。

例如,下圖沒有出現任何“貓頭”“貓身”“貓腳”“貓尾”,但我們一看就知道是橘貓(其它動物的紋理確實不一樣):

於是,一個更好的方法是:找到圖中的橘貓紋理區域,然後計算區域的面積,這個區域也許有 1% 就足夠我們認為圖中有橘貓了。

問題是,如何教會電腦什麼是“橘貓紋理”?可以用卷積。

3. 卷積操作:

紋理,就是區域性的一種圖案。如何快速判斷圖中是否有區域性的一種圖案?

快速的方法,是使用卷積,也是分兩步:

1、對影象中的每個點進行相同的操作。

2、然後將結果彙總。

看例子,這是我在 excel 畫的,可以用 SUMPRODUCT 函式做卷積:

不同的卷積核,可以識別不同的目標。

卷積操作後,影象會變小一點。如果希望影象不變小,可以提前給圖片加一圈0(稱為padding)。

我們往往還會加入一個“偏置”(bias),就是給整個影象加上一個可以訓練的數(這個思想來自於全連線神經網路)。

對於得到的影象,還可以進行進一步變換:

1、可以取最大值(此時會得到5.0),這標誌著圖中是否存在這個特徵。

2、可以取平均值(此時會得到0.25),這標誌著圖中這個特徵的密度。

3、還可以取"最大值"與"平均值"之間的值,會更接近我們的某種直覺。這在數學上有很多辦法。

在深度卷積網路中,會經常用到如上的變換(其實就是 max pooling 和 average pooling)。

4. 卷積神經網路的結構

卷積需要卷積核,但怎麼找到能有效判斷“橘貓紋理”的卷積核?

首先,實際上需要多個卷積核。因為不同角度、不同位置、不同大小、不同貓的紋理都不同,所以我們要用不同的卷積核去匹配。而且不一定直接可以得到“評分”,往往還要經過更多的處理(例如,請思考如何判斷紋理的顏色是橘色)。因此我們會使用一個網路結構。

舉例:

• 用 A 個卷積核,把原始的圖分別用每個卷積核處理,得到 A 張圖。

• 然後每張圖都做一個非線性操作,例如把得到的圖中所有小於 0 的數設定為0。這很重要。簡單地說,這是因為卷積是線性操作,如果不加入非線性的操作,最終得到的模型仍然是線性的,無法描述大自然的非線性現象。

• 下面的圖是我用滑鼠畫的......:

• 得到了 A 張圖。那麼,再用 B x A 個卷積核,把這 A 張圖變成 B 張圖。

• 舉個例子,用 3 x 2 個卷積核,可以把 2 張圖,變成 3 張圖。圖中的加法,是點對點相加:

• 別忘了再做非線性處理。

• 然後用 C x B 個卷積核,又可以把 B 張圖變成 C 張圖。

• 經過很多層之後,我們考慮最終的 N 張圖,得到最終的結果。

卷積神經網路的結構,與普通的全連結神經網路非常相似,只是把乘法換成了卷積。 其實,乘法就相當於 1x1 的卷積。

通過使用多層結構,我們可以顯著提高網路的識別能力和通用性,這是因為自然界中的影象具有層次性。其實人的大腦的視覺系統也是由多層次組成,也許視覺系統是在進化中形成了這種層次性。