您當前的位置:首頁 > 攝影

全面瞭解卷積神經網路

作者:由 Evan 發表于 攝影時間:2018-02-02

背景

四類解決方案解決圖片的不變性(from PRML)

簡介

理解卷積

卷積層

匯聚層

歸一化層

整體架構

小結

背景

20世紀60年代,Hubel和Wiesel在研究貓腦皮層中用於區域性敏感和方向選擇的神經元時發現其獨特的網路結構可以有效地降低反饋神經網路的複雜性,繼而提出了卷積神經網路(Convolutional Neural Networks-簡稱CNN)

同時,人眼在識別影象時,往往從區域性到全域性,區域性與區域性之間聯絡往往不太緊密。結合到神經網路,我們發現我們不需要神經網路中的每個結點都掌握全域性的知識,因此可以從這裡可以大量減少需要學習的引數數量

需要注意的是CNN的思想和BP網路是相反的,BP網路認為,大腦每個神經元都要感知物體的全部(全畫素全連線),並且只是簡單的對映,並沒有對物體進行抽象處理。而卷積神經網路(Convolution Neural Network)最先證明了BP網路的不科學性,然後在各種任務中大放異彩!

四類解決方案解決圖片的不變性(from PRML)

我們知道,在很多圖片中,比如都存在一隻貓,那隻貓的姿態或者形態是非常不同的,在我們人類看來這沒什麼,很容易知道它都是一隻貓,但是,在計算機看來,就沒有那麼簡單了,關於這種圖片內容的不變性,我們可以有如下的方法來解決:

Data Augmentation:用多種變化後生成不同樣本的圖片

Tangent Propagation:用正則項的方式,用一個函式

Invariant feature:用一些特徵來做不變性

Neural Network structure with invariant properties (e。g。 CNN):用一些特徵結構,比如CNN中的卷積

簡介

卷積神經網路主要由三種類型的層構成:

卷積層,匯聚(Pooling)層和全連線層(全連線層和常規神經網路中的一樣)

。透過將這些層疊加起來,就可以構建一個完整的卷積神經網路。有的層有引數,有的沒有(卷積層和全連線層有,非線性(ReLU)層和匯聚層沒有)。有的層有額外的超引數,有的沒有(卷積層、全連線層和匯聚層有,非線性(ReLU)層沒有)。

然後下面是一個簡單的cnn神經網路結構的例子:

全面瞭解卷積神經網路

理解卷積

首先來看通俗理解,比如往一片平靜的水面投入一塊石頭,水面的波紋隨時間推移擴散開去,在水面還沒有變為平靜前,再投入一顆石頭,也產生波紋,這時候當兩個波紋相混合時,就會發現波紋成了另一種,而且不是兩種波紋的直接疊加。這就是一種卷積,所以簡單來說,卷積就是兩個函式(上面例子的兩種波紋)互相作用產生的一個新函式(上面例子就是新的波紋)

再來一個更加接近定義的例子:假如你被別人打了一拳,這一拳會在1小時疼痛消失[這一拳輕重不同,所以雖說都在一個小時消失,但是在1個小時內感覺的疼痛也不一樣。設最輕(注意)的一拳在一小時內的疼痛感覺函式為h(t),二倍的最輕力度打你,疼痛感就是2h(t)對吧,f(n)倍最輕力度,就是f(n)h(t)了吧],當別人在一小時內在第一秒,第二秒,第三秒。。。。。第六十秒……動武時,可設f(n)為每次的輕重函式,這就是說在0到2小時內你會感覺疼,那麼在這0到2小時的任意一個時刻的疼痛程度Y(t)怎麼表示呢?(自己先可以算一下,算出來的話下面的就不用看啦)——肯定是每拳的疼痛效果疊加啦,既0到n的f(n)h(t-n)相加,如f(1)h(t-1)+f(2)h(t-2)……,當n很小時,為0。00000001時,就可以用積分符號來代替求和。n次抽象為τ就是我們平時的f(t)與h(t)的卷積啦!

第二個例子摘自如何通俗易懂地解釋卷積——馮小帥的回答

然後簡述下定義,簡單定義:卷積是分析數學中一種重要的運算。設:f(x),g(x)是R上的兩個可積函式,作積分:

全面瞭解卷積神經網路

可以證明,關於幾乎所有的實數

x

,上述積分是存在的。這樣,隨著

x

的不同取值,這個積分就定義了一個新函式h(x),稱為函式

f

g

的卷積,記為h(x)=(f*g)(x)。

或者說,卷積是兩個變數在某範圍內相乘後求和的結果。如果卷積的變數是序列x(n)和h(n),則卷積的結果

全面瞭解卷積神經網路

其中星號*表示卷積。當時序n=0時,序列h(-i)是h(i)的時序i取反的結果;時序取反使得h(i)以縱軸為中心翻轉180度,所以這種相乘後求和的計算法稱為卷積和,簡稱卷積。另外,n是使h(-i)位移的量,不同的n對應不同的卷積結果。(注意這裡就是符合神經網路卷積計算的)

如果卷積的變數是函式x(t)和h(t),則卷積的計算變為

全面瞭解卷積神經網路

其中p是積分變數,積分也是求和,t是使函式h(-p)位移的量,星號*表示卷積

最後說應用,在其他很多領域卷積都有廣泛的應用,比如統計學,物理學,聲學等等。這裡主要說說在神經網路中的應用:假如用一個模板和一幅影象進行卷積,對於影象上的一個點,讓模板的原點和該點重合,然後模板上的點和影象上對應的點相乘,然後各點的積相加,就得到了該點的卷積值。對影象上的每個點都這樣處理,而在神經網路中,就直接可以看作加權求和 由於大多數模板都是對稱的,所以模板不旋轉也可以。

也就是說,運算和之前全連線的神經網路是一模一樣的,CNN只是在區域性上加權求和,其中以上說的模板就是下面的卷積核。

然後下面以層到層的順序來詳細講解cnn,其中全連線在之前神經網路的文章也做講解,詳細看之前文章!

卷積層

注意,以下討論的前提是你熟悉了傳統ANN的網路結構和一般知識,不明白的可以先看下我專欄前面的文章。

卷積計算

卷積層的引數是有一些可學習的卷積核集合構成的。每個卷積核在空間上(寬度和高度)都比較小,但是

深度和輸入資料一致。

在每個卷積層上,我們會有一整個集合的卷積核(比如12個),每個都會生成一個不同的二維啟用圖,一個啟用圖對應的得到影象的一種特徵,也就是原來三維的影象變成一個二維的特徵啟用圖。將這些啟用對映在深度方向上層疊起來就生成了輸出資料。

注意:多個卷積核就是對應在提取不同的方面的特徵,比如顏色,輪廓,背景等等。

普通深度神經網路就是隱含層的數量較多,導致引數增多,而我們可以認為卷積層比起常見的全連線層的重要特點

就是減少引數的數量。

在深度一致的時候,

n*n

的卷積核對

m*m

的圖片做卷積運算的話,就會產生

(m-n)/1+1

(注意那個除以1是步長,在這裡步長是1,當然也可以設定成其他的值,除不盡的情況是在外圍加上幾層,使得可以整除)的新的生成層,所以最重要的就是能整除。

注意:我們傾向於選擇多層小size的卷積層,而不是一個大size的卷積層。比如3×3,5×5。

然後進一步解釋幾個超引數,一個是輸出資料體的

深度

,它和使用的卷積核的數量一致,而每個卷積核在輸入資料中尋找一些不同的東西,也就是對應不同的特徵(這裡注意和上面卷積核的深度是不一樣的概念!)。另一個是卷積核在滑動的時候的

步長

。當步長為1,卷積核每次移動1個畫素。當步長為2(或者不常用的3,或者更多,這些在實際中很少使用),卷積核滑動時每次移動2個畫素。這個操作會讓輸出資料體在空間上變小。還有一個就是

零填充尺寸,

將輸入資料體用0在邊緣處進行填充,使得卷積核在滑動是可以正好滑滿整個輸入資料體,當然,其作用就是控制輸出資料體的空間尺寸。

舉個例子: 假設輸入資料體尺寸為[32x32x3](比如CIFAR-10的RGB影象),如果卷積核是5x5的寬度×廣度,那麼卷積層中的每個神經元會有輸入資料體中[5x5x3]區域的權重,共5x5x3=75個權重(還要加一個偏差引數)。注意這個連線在深度維度上的大小必須為3,和輸入資料體的深度一致。

如圖,一個二維的影象(沒有三通道,只有一通道)做卷積的圖示:

全面瞭解卷積神經網路

當然,也可以看下CS231n卷積計算例子,其中有個三維圖(三通道)動態卷積運算。挺直觀的!

區域性連線

受啟發於生物學裡面的視覺系統結構,也就是動物視覺皮層的神經元就是區域性接受資訊的(即這些神經元只響應某些特定區域的刺激),CNN取樣了局部連線(及其重要的特徵),這樣做的效果很好,且減少大量引數!

全面瞭解卷積神經網路

左圖為全連線,右圖為區域性連線

左圖中,引數是10的12次方個。右圖中,當隱層的數量一樣(1m個)時,且卷積核是10×10,那麼權值資料為1000000×100個引數,減少為原來的萬分之一。所以卷積運算能大大的減少了引數的數量。

引數共享

CNN還有一個降低引數數目的重要特性,就是引數共享。而可以引數共享的原因是如果在

影象某些地方探測到一個水平的邊界是很重要的,那麼在其他一些地方也會同樣是有用的,這是因為影象結構具有平移不變性。

所以在卷積層的輸出資料體的5x5個不同位置中,就沒有必要重新學習去探測一個水平邊界了。也就是說如果說一個卷積核在圖片的一小塊兒區域可以得到很好的特徵,那麼在其他的地方,也可以得到很好的特徵。結合到具體,就是一個卷積核對影象做一次卷積得到一個二維特徵啟用圖,若這個啟用圖一共n個元素,然後啟用圖中每個元素通常是被非線性(ReLU)層啟用,這樣的話就類似於一個啟用圖相當於n神經元,但這些神經元共享一個卷積核,也就是引數是一樣的!

下面就是一組固定的權重和不同視窗內資料做卷積,且不同的卷積核(或叫filter)得到不同的特徵啟用圖:

全面瞭解卷積神經網路

相對全連線傳統神經網路,CNN的引數較少的原理就是

引數共享和區域性連線

1×1的卷積大概有兩個方面的作用:

實現跨通道的互動和資訊整合(NIN)

進行卷積核通道數的降維和升維(Residual network,google net)

下一篇文章也會結合論文講述!

匯聚層

在連續的卷積層之間會週期性地插入一個匯聚層。它的作用是逐漸降低資料體的空間尺寸,這樣的話就能減少網路中引數的數量,

使得計算資源耗費變少,也能有效控制過擬合,提取重要特徵,符合不變性

。最常見的形式是匯聚層使用尺寸2x2的濾波器,以步長為2來對每個深度切片進行降取樣,將其中75%的啟用資訊都丟掉。每個MAX操作是從4個數字中取最大值(也就是在深度切片中某個2x2的區域)。深度保持不變。

在池化單元內部能夠具有平移的不變性,它的平移範圍也是有一定範圍的,因為每個池化單元都是連續的,所以能夠保證影象整體上發生了平移一樣能提取特徵進行匹配。一般來說,都是用max或者是mean(或Average),而max還是mean都是在提取區域特徵,均相當於一種抽象,抽象就是過濾掉了不必要的資訊(當然也會損失資訊細節),所以在抽象層次上可以進行更好的識別。至於max與mean效果是否一樣,還是要看需要識別的影象細節特徵情況,這個不一定的,不過據說差異不會超過2%。

全面瞭解卷積神經網路

如上圖,Max Pooling的優點在於不增加需要調整的引數且通常比其他方法準確,突出特徵。而mean Pooling更趨向於平滑。

若沒有搞懂就再舉個圖例,下面是Max pooling,對於每個2*2的視窗選出最大的數作為輸出矩陣的相應元素的值,比如輸入矩陣第一個2*2視窗中最大的數是6,那麼輸出矩陣的第一個元素就是6,如此類推。

全面瞭解卷積神經網路

當然,現在有些人認為池化層並不是必要的,此外,有人發現

去除池化層對於生成式模型(generative models)很重要,

例如variational autoencoders(VAEs),generative adversarial networks(GANs)。可能在以後的模型結構中,池化層會逐漸減少或者消失。

歸一化層

在卷積神經網路的結構中,提出了很多不同型別的歸一化層,有時候是為了

實現在生物大腦中觀測到的抑制機制。

比如在AlexNet 中的Local Response Nomalization ,但是這些層漸漸都不再流行,因為實踐證明它們的效果即使存在,也是極其有限的。

當然,cnn中有很多都用到了batch normalization和dropout,關於這個trick的講解,可以看下專欄之前的文章。

整體架構

這裡列舉幾種普通常見型別的卷積神經網路結構:

INPUT ——> FC/OUT 這其實就是個線性分類器

INPUT ——> CONV ——> RELU ——> FC/OUT

INPUT ——> [CONV ——> RELU ——> POOL]*2 ——> FC ——> RELU ——> FC/OUT

INPUT ——> [CONV ——> RELU ——> CONV ——> RELU ——> POOL]*3 ——> [FC——> RELU]*2 ——> FC/OUT

小結

本文主要了解了CNN的各種基礎知識,當然,CNN本身各種博大精深,需要仔細研究。下一篇文章,我應該會講述在imagenet上有關CNN的變體和文章,敬請期待

標簽: 卷積  神經網路  引數  CNN  影象