一文幫你深入學習卷積神經網絡(CNN)的原理知識

專欄推廣

正文

卷積神經網絡常用於圖片,先來看一下在計算機中,圖片是如何表達和存儲的?

圖像在計算機中是一堆按順序排列的數字,數值為0到255。0表示最暗,255表示最亮。 我們可以把這堆數字用一個長長的向量來表示,類似tensorflow的向量的表示方式。 然而用向量表示的話會失去平面結構的信息,為保留該平面結構信息,通常選擇矩陣的表示方式。

有些圖片是灰度圖,普遍的圖片表達方式是RGB顏色模型,即紅、綠、藍三原色的色光以不同的比例相加,以產生多種多樣的色光。

這樣,RGB顏色模型中,單個矩陣就擴展成了有序排列的三個矩陣,也可以用三維張量去理解,其中的每一個矩陣又叫這個圖片的一個通道。

在電腦中,一張圖片是數字構成的“長方體”。可用 寬, 高, 深(通道)來描述,一張圖片在電腦中是這樣存在的:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

以上就是圖片在計算機中的形式。

下面讓我們來看一下神經網絡:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

上圖是人工神經網絡,有些時候使用神經網絡已經有很好的效果了,但是對於多類別的可能需要更多的層次結構和神經元個數來完成這個任務,如此多的神經元個數和複雜的神經網絡結構我們要想訓練它,會有一些問題。

首先需要非常多的計算資源才能支撐它來做反向傳播和前向傳播,層次多了之後神經網絡的學習能力會非常的強,有了非常強的記憶功能,可以存儲非常多的參數w,也就是說如果你給它的樣本如果沒有達到它的量級的時候,它可以輕輕鬆鬆把你給他的樣本全部都記下來,這會出現過擬合的情況。

所以我們應該把神經元和神經元之間的連接的權重個數降下來,但是降下來我們又不能保證它有較強的學習能力,所以這是一個糾結的地方,所以有一個方法就是局部連接+權值共享,人們發現局部連接+權值共享不僅權重參數降下來了,而且學習能力並沒有實質的降低,除此之外還有其它的好處,下來看一下,下面的這幾張圖片:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

我們發現這幾張圖片描述的都是一個東西,但是不同的是有的大有的小,有的靠左邊,有的靠右邊,有的位置不同,但是我們構建的網絡識別這些東西的時候應該是同一結果。為了能夠達到這個目的,我們可以讓圖片的不同位置具有相同的權重(權值共享),也就是上面所有的圖片,我們只需要在訓練集中放一張,我們的神經網絡就可以識別出上面所有的,這也是權值共享的好處。

用一句話總結這個神經網絡就是:卷積神經網絡就是讓權重在不同位置共享的神經網絡

現在我們對卷積神經網絡有一個初步認識了,下面具體來講解一下卷積神經網絡,卷積神經網絡依舊是層級結構,但層的功能和形式做了改變,用卷積神經網絡來識別圖片是比較好的,比如識別一輛汽車(主體):

一文幫你深入學習卷積神經網絡(CNN)的原理知識

上面是卷積神經網絡的基本的結構,一般卷積神經網絡的結構是這樣的:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

RELU表示激活函數

數據輸入的是一張圖片(輸入層)

後面其中CONV表示卷積層,RELU表示激勵層,POOL表示池化層(多個卷積層+激勵層之後接一個池化層)

Fc表示全連接層(和人工神經網絡一樣)

先來看一下數據輸入層/input layer

有三種常見的圖像的處理方式:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

1均值化(CNN只用去均值):把輸入數據各個維度都中心化到0

2歸一化:數據幅度歸一化到同樣的範圍

3PCA/白化:用PCA降維,白化是對數據每個特徵軸上的幅度歸一化

一文幫你深入學習卷積神經網絡(CNN)的原理知識

去均值:所有樣本求和求平均,然後用所有的樣本減去這個均值樣本就是去均值。

歸一化:對於每個特徵而言,範圍最好是[-1,1],

PCA/白化:用PCA降維,讓每個維度的相關度取消,特徵和特徵之間是相互獨立的。

白化,對數據每個特徵軸上的幅度歸一化

卷積神經網絡之卷積層:

圖片有一個性質叫做局部關聯性質,一個圖片的像素點影響最大的是它周邊的像素點,而距離這個像素點比較遠的像素點二者之間關係不大。這個性質意味著每一個神經元我們不用讀全局的圖片了(和上一層全連接),我們的每一個神經元只需要和上一層局部連接,相當於每一個神經元掃描一小區域,然後許多神經元(這些神經元權值共享)合起來就相當於掃描了全局,這樣就構成一個特徵圖(表示圖像的某一維度的特徵,具體是哪一維度可能也說不清),n個特徵圖就提取了這個圖片的n維特徵,每個特徵圖是由很多神經元來完成的。

在卷積神經網絡中,我們先選擇一個局部區域(filter),用這個局部區域(filter)去掃描整張圖片。 局部區域所圈起來的所有節點會被連接到下一層的一個節點上。我們拿灰度圖(只有一維)來舉例:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

圖片是矩陣形式的,將這些以矩陣排列的節點展成了向量。就能更好的看出來卷積層和輸入層之間的連接,並不是全連接的,我們將上圖中的紅色方框稱為filter,它是2*2的,這是它的尺寸(filter-size),這不是固定的,我們可以指定它的尺寸。

我們可以看出來當前filter是2*2的小窗口,這個小窗口會將picture矩陣從左上角滑到右下角,每滑一次就會一下子圈起來四個,連接到下一層的一個神經元,然後產生四個權重,,這四個權重((w1、w2、w3、w4))形成的矩陣,就叫做卷積核,因為權重共享,所以卷積核是一樣的。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

卷積核是算法自己學習得到的,它會和上一層計算,比如,第二層的節點0的數值就是局部區域的線性組合(w1*0+w2*1+w3*4+w4*5),即被圈中節點的數值乘以對應的權重後相加

我們前面說過圖片不用向量表示是為了保留圖片平面結構的信息。 同樣的,卷積後的輸出若用上圖的向量排列方式則丟失了平面結構信息。 所以我們依然用矩陣的方式排列它們,就得到了下圖所展示的連接,每一個藍色的連接四個黃色的。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

圖片是一個矩陣,然後它的下一層也是一個矩陣,我們用一個filter從圖片矩陣左上角到右下角滑動,每滑動一次,當然被圈起來的神經元們就會連接下一層的一個神經元,形成參數矩陣這個就是卷積核,當然每次滑動雖然圈起來的神經元不同,連接下一層的神經元也不同,但是產生的參數矩陣確是一樣的,這就是權值共享。

卷積核會和掃描的圖片的那個局部矩陣作用產生一個值,比如第一次的時候,(w1*0+w2*1+w3*4+w4*5),所以,filter從左上到右下的這個過程中會得到一個矩陣(這就是下一層也是一個矩陣的原因),具體過程如下所示:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

上圖中左邊是圖片矩陣,我們使用的filter的大小是3*3的,第一次滑動的時候,卷積核和圖片矩陣作用(1*1+1*0+1*1+0*0+1*1+1*0+0*1+0*0+1*1)=4,會產生一個值,就是右邊矩陣的第一個值,filter滑動9次之後,會產生9個值,也就是說下一層有9個神經元,這9個神經元產生的值就構成了一個矩陣,就是上圖右圖所示,這矩陣叫做特徵圖,表示image的某一維度的特徵,當然具體哪一維度可能並不知道,可能是這個圖像的顏色,也有可能是這個圖像的輪廓等等。

以上就是單通道的圖片的卷積處理,這裡再總結一下,圖片是一個矩陣,我們用指定大小的filter去左上角到右下角來滑動,每次滑動所圈起來的結點會和下一層的一個結點相連,連接之後就會形成局部連接,每一條連接都會產生權重,這些權重就是卷積核,所以每次滑動都會產生一個卷積核,因為權值共享,所以這些卷積核都是一樣的。卷積核會不斷和當時filter所圈起來的局部矩陣作用,每次產生的值就是下一層結點的值了,這樣多次產生的值組合起來就是一個特徵圖,表示某一維度的特徵。

也就是從左上滑動到右下這一過程中會形成一個特徵圖矩陣(共享一個卷積核),再從左上滑動到右下又會形成另一個特徵圖矩陣(共享另一個卷積核),這些特徵圖都是表示特徵的某一維度。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

我們來看一下這個圖,我們的圖片是一維的,我們的下一層有5個特徵圖集合,這裡化的很抽象,其中每一個特徵圖是由很多個神經元構成的,每一個特徵圖都是通過共享的卷積核從左上到右下作用得到的。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

至此我們應該已經知道了單通道的灰度圖是如何處理的,實際上我們的圖片都是RGB的圖像,有三個通道,那麼此時的時候,圖像是如何卷積的呢?

filter窗口滑動的時候,我們只是從width和height的角度來滑動的,並沒有考慮depth,所以每滑動一次實際上是產生一個卷積核,共享這一個卷積核,而現在depth=3了,所以每滑動一次實際上產生了三個卷積核(三個卷積核不相同,分別作用於藍色、綠色、紅色),共享這三個卷積核。

卷積核是要和上一層的數據發生作用的,我們已經知道了單通道的是如何作用的

一文幫你深入學習卷積神經網絡(CNN)的原理知識

而現在三通道呢?

我們的一個卷積核和藍色的矩陣作用產生一個值,另一個卷積核和綠色的矩陣作用產生一個值,最後一個卷積核和紅色的矩陣作用產生一個值,然後這些值加起來就是下一層結點的值了。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

這裡我們要注意一點,我們雖然此時有三個卷積核,是因為我們要卷積的depth為三層,所以這三個卷積核實際上是分別卷積每一depth的,最後卷積的結果要加起來,所以它們最終只會得到某一維度的特徵,也就是一張特徵圖,並不是三張特徵圖。這裡要注意。

要想有多張特徵圖的話,我們可以再用新的filter來進行左上到右下的滑動,也是三個卷積核(本特徵圖中共享這三個卷積核的權值)分別對每一depth滑動,這樣就會形成新的特徵圖。

也就是說增加一個滑動窗口filter(filter其實就是卷積核,可以看作是卷積核是在滑動),讓他從左上到右下滑動就會產生一個特徵圖,多個特徵圖,所以這樣卷積層的輸出也不再是depth為1的一個平面,而是和輸入一樣是depth為複數的長方體。

這樣卷積後輸出的長方體可以作為新的輸入送入另一個卷積層中處理,有幾個特徵圖depth就是幾,那麼下一層的每一個特徵圖就得用幾個卷積核來對應處理,這個邏輯要清楚。

現在我們知道了一個卷積層的輸出也是一個長方體。 那麼這個輸出長方體的(width, height, depth)由哪些因素決定和控制。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

矩陣乘法執行卷積:

如果按上面所說的以掃描的方式一步步計算局部節點和filter的權重的點乘,不能高效的利用GPU的並行能力。 要想利用好矩陣的方式,可以利用兩個大矩陣的乘法來一次性囊括所有計算。

卷積層的每個輸出節點其實都是由若干個輸入節點的線性組合所計算(w的轉秩✖)。所以我們可以使用矩陣的方式, 矩陣乘矩陣的意義可以理解為批量的線性組合按順序排列。 其中一個矩陣可以表示權重w(下面的w1、w2、w3表示三個卷積核),另一個矩陣上一層的結點值(V1、V2、V3表示每層通道上的結點值)。一般權重放在矩陣乘法的左邊。可以表示如下所示:

這裡要說三個概念

1深度depth:卷積核(濾波器的個數)

2步長stride:每次滑動幾步,步數越大得到的特徵數越少,上面的例子中每次滑動1步。

3填充值zero-padding:我們設置了步長之後,很有可能某些位置滑不到,為了避免了邊緣信息被一步步捨棄的問題,我們需要設置填充值來解決這個問題。還有一個問題,4x4的圖片被2x2的filter卷積後變成了3x3的圖片,每次卷積後都會小一圈的話,經過若干層後豈不是變的越來越小?zero padding就可以在這時幫助控制Feature Map的輸出尺寸。

比如:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

4x4的圖片在邊緣Zero padding一圈後,再用3x3的filter卷積後,得到的Feature Map尺寸依然是4x4不變。

當然也可以使用5x5的filter和2的zero padding可以保持圖片的原始尺寸,3x3的filter考慮到了像素與其距離為1以內的所有其他像素的關係,而5x5則是考慮像素與其距離為2以內的所有其他像素的關係。

規律: Feature Map的尺寸等於(input_size + 2 * padding_size − filter_size)/stride+1。

我們可以把池化層的作用總結一點就是,池化層其實就是在提取特徵,池化層中最重要的是卷積核(訓練出來的),不同的卷積核(不同特徵圖的)可以探測特定的形狀、顏色、對比度等(就是什麼神奇),然後特徵圖保持了抓取後的空間結構,所以不同卷積核對應的特徵圖表示某一維度的特徵。特徵圖作為輸入再被卷積的話,可以則可以由此探測到“更大”的形狀概念

可以從下面這張圖中感受到不同數值的filters所卷積過後的Feature Map可以探測邊緣,稜角,模糊,突出等概念。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

我們通過這張圖片可以看出來不同的卷積核作用在圖片上效果是不一樣的,所以我們不同的卷積核相當於提取的是某一維度的特徵。

圖片被識別成什麼不僅僅取決於圖片本身,還取決於圖片是如何被觀察的。而卷積核內的權重矩陣W是卷積神經網絡根據數據學習得到的,也就是說,我們讓神經網絡自己學習以什麼樣的方式去觀察圖片。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

比如這副圖像有些人可能看成是一個少女,有些人看成一個老婦,所以w究竟是什麼?核我們的標記有關,當標籤是少女時,卷積網絡就會學習抓取可以成少女的形狀、概念,w就是少女的時的權重矩陣。 當標籤是老婦時,卷積網絡就會學習抓取可以成老婦的形狀、概念,w就是老夫的權重矩陣,這個很神奇。

上面就把卷積神經網絡的中的卷積層講解完了,它的核心就是在提取特徵,下面講解激勵層的作用,激勵層的作用可以理解為把卷積層的結果做非線性映射。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

上面的f表示激勵函數,常用的激勵函數有幾下幾種:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

我們先來看一下激勵函數Sigmoid:導數最小為0,最大為1/4:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

Tanh(雙曲正切):和sigmoid相比,它會關於x軸上下對應,不至於朝某一方面偏向

一文幫你深入學習卷積神經網絡(CNN)的原理知識

ReLU(修正線性單元):收斂快,求梯度簡單,較脆弱,左邊的梯度為0,只要不是一條直線,那麼就是非線性的。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

(Leaky ReLU);不會飽和/掛掉,不會“飽和”/掛掉,計算也很快,但是計算量比較大,a 是一個很小的值

一文幫你深入學習卷積神經網絡(CNN)的原理知識

指數線性單元ELU:所有ReLU有的優點都有,不會掛,輸出均值趨0,因為指數存在,計算量略大

一文幫你深入學習卷積神經網絡(CNN)的原理知識

一些激勵函數的使用技巧:不要用sigmoid,首先試RELU,因為快,但要小心點,如果RELU失效,請用Leaky ReLU或者Maxout,某些情況下tanh倒是有不錯的結果。上面就是激勵層,他就是將卷積層的線性計算的結果進行了非線性映射。可以從下面的圖中理解。它展示的是將非線性操作應用到一個特徵圖中。這裡的輸出特徵圖也可以看作是“修正”過的特徵圖。如下所示:

一文幫你深入學習卷積神經網絡(CNN)的原理知識

池化層

降低了各個特徵圖的維度,但可以保持大部分重要的信息。

池化層夾在連續的卷積層中間,壓縮數據和參數的量,減小過擬合,池化層並沒有參數,它只不過是把上層給它的結果做了一個下采樣(數據壓縮)。

下采樣有兩種非常用的方式:

Max pooling:選取最大的,我們定義一個空間鄰域(比如,2x2 的窗口),並從窗口內的修正特徵圖中取出最大的元素,最大池化被證明效果更好一些。

Average pooling:平均的,我們定義一個空間鄰域(比如,2x2 的窗口),並從窗口內的修正特徵圖算出平均值

一文幫你深入學習卷積神經網絡(CNN)的原理知識

上面就是max pool方式,使用的是2*2的步長為2的,這樣操作可以降低我們特徵圖的維度。

我們要注意一點的是:pooling在不同的depth上是分開執行的,也就是depth=5的話,pooling進行5次,產生5個池化後的矩陣,池化不需要參數控制。池化操作是分開應用到各個特徵圖的,我們可以從五個輸入圖中得到五個輸出圖。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

一文幫你深入學習卷積神經網絡(CNN)的原理知識

無論是max pool還是average pool都會有部分信息被捨棄,那麼部分信息被捨棄後會損壞識別結果嗎?

因為卷積後的Feature Map中有對於識別物體不必要的冗餘信息,我們下采樣就是為了去掉這些冗餘信息,所以並不會損壞識別結果。

我們來看一下卷積之後的冗餘信息是怎麼產生的?

我們知道卷積核就是為了找到特定維度的信息,比如說某個形狀,但是圖像中並不會任何地方都出現這個形狀,但卷積核和沒有出現這個形狀的局部作用的時候也會產生一個值,但是這個值的意義就不是很大了,所以我們使用池化層的作用,將這個值去掉的話,自然也不會損害識別結果了。

比如下圖中,假如卷積核探測"橫折"這個形狀。 卷積後得到3x3的Feature Map中,真正有用的就是數字為3的那個節點,其餘數值對於這個任務而言都是無關的。 所以用3x3的Max pooling後,並沒有對"橫折"的探測產生影響。 試想在這裡例子中如果不使用Max pooling,而讓網絡自己去學習。 網絡也會去學習與Max pooling近似效果的權重。因為是近似效果,增加了更多的parameters的代價,卻還不如直接進行Max pooling。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

到現在為止,我們已經從輸入講到了卷積層,激勵層,池化層,這些層一起就可以從圖像中提取有用的特徵,並在網絡中引入非線性,減少特徵維度,同時保持這些特徵具有某種程度上的尺度變化不變性。

最終的結果會作為全連接層的輸入,下面我們來講解一下全連接層。兩層之間所有神經元都有權重連接,通常全連接層在卷積神經網絡尾部。當前面卷積層抓取到足以用來識別圖片的特徵後,接下來的就是如何進行分類。 全連接層(前饋層)就可以用來將最後的輸出映射到 。 通常卷積網絡的最後會將末端得到的長方體平攤成一個長長的向量,並送入全連接層配合輸出層進行分類。比如,在下面圖中我們進行的圖像分類有四個可能的輸出結果。

一文幫你深入學習卷積神經網絡(CNN)的原理知識

至此卷積神經網絡就總結完了,還有一些總結的不是很好,網上也借鑑了一些高手的經驗帖,感謝。


分享到:


相關文章: