【深度學習】卷積神經網絡

講卷積神經網絡之前說說爲什麼能夠進行分類識別?按照傳統的SIFT,HOG算法都是先進行特徵的提取過程,那麼卷積神經網絡怎麼進行特徵的提取呢?

 

下面,我們就開始吧!

先提一個小問題:“你是通過什麼瞭解這個世界的?”

當一輛汽車從你身邊疾馳而過,你是通過哪些信息知道那是一輛汽車?

“它的材質,速度,發動機的聲響,還是什麼?”

你可能說不清所以然,但是當你看到下圖時,你會第一時間反應出來,“噢,車!

以下圖片來源於:HTTPS://mp.weixin.qq.com/s/x6NIkzQSgvl0_rfGe7Cjqg

 

爲什麼你能猜對它?

“輪廓”!

- 對,我給你看了它的輪廓(相當於車的特徵)

再給你一些七七八八,大小不一的圖片,你總能猜對一些。

你是怎樣做到的?

很簡單

你讀一張了圖片  →交通交通找到了圖片的特徵  →交通交通  進而對圖片做出了分類照片照片什麼 

其實,CNN的工作原理也是這樣。

先不考慮那些複雜的專有名詞:什麼卷積(卷積),池化(池),過濾器(過濾器)等等......統統拋到一邊。

神經細胞網絡做的就是下面3件事:

讀取圖片;

2.提取特徵;

3.圖片分類。

下面,我們逐一來看各步驟的細節。

1讀取圖片--2特徵提取--3圖片分類

如果是一張黑白圖片,我們看到的,是這個樣子的:

而在計算機的眼裏,它看到的,是這個樣子的:

好沒有情趣......

 

 

這些數字是哪裏來的?

因爲圖片是由一個又一個的像素點構成。(當你將圖片無限放大,你能看到那些像素點)

 

而每一個像素點,都是由一個0〜255的數字組成。

所以,在計算機“看”來,一張圖片,就是一個又一個的數字。

所以,我們第一步的工作,是將左上圖的那隻小狗,轉換成右上圖的那一行行數字。

幸運的是,目前在蟒中,很多第三方庫,如PIL / Matplotlib等,都可以實現這種轉換,我們需要了解的是,後面的所有運算過程,基於都是右上圖產品來完成的,至於具體的轉換過程,不需要我們費心來做。

在文章開篇的例子中,我們知道,在識別一輛汽車的時候,可以將它的輪廓提取出來,從而判斷出那是一輛車。

同樣的,CNN 在識別圖片時,也需要提取圖像的特徵。

在細胞神經網絡中,完成這一工作的小夥叫“ 卷積 ”。(希望你不要糾結這個極具個性的名字,它懂得原理的就行)

“卷積”在每次工作時,手裏都會握着幾把“ 過濾器 ”。

過濾器的作用是:尋找圖片的特徵

仍以小狗爲例,過濾器會在圖片上從頭到尾“ 滑過 ”一遍

每滑到一個地方,就將該地方的圖像特徵提取出來。

那它是怎樣提取的呢?

別忘了,在計算機的眼裏,世界是這個樣子的:

(爲了簡化問題,這裏將像素值僅用0和1表示)

假設過濾器是這個樣子的:

當橘色的過濾器在綠色矩形框中,緩慢滑過時,

我們用橘色過濾器中的每一個值,與綠色矩形框中的對應值相乘,再相加

有點兒拗口,直接看圖:

結果“ 4 ”,就是我們從第一個橘色方框中,提取出的特徵。

如果我們每次將橘色過濾器,向右,向下移動1格,則提取出的特徵爲:

 

 

你可能會問:

我知道綠色矩陣代表一張圖片,是計算機“眼中”圖片的樣子。

但是,

經過橘色過濾器提取特徵後,得到的粉色矩陣,那是什麼?

我們從人類的視角,再重新審視一遍。

這次,我們回到之前的例子中。

仍以這張萌狗爲例,它經過“過濾器”提取特徵後,得到的是一張......哦,好吧......看起來有點兒模糊的圖。

雖然圖片模糊了,但是圖片中的主要特徵,已經被過濾器全部提取出來,單憑這麼一張模糊的圖,作爲人類的我們,足以對它做出判斷了。(誰敢說它是一隻貓?!)

下面,我們再換幾個過濾器試試。

這些就是經過過濾器提取後,得到的不同“ 特徵圖片 ”。

由此我們可以看出,採用不同的“過濾器”,能夠提取出不同的圖片特徵。

 

那過濾器裏的數值,該如何確定呢?

 

這就涉及到CNNs要做的工作了。每一個過濾器中的數值,都是算法自己學習來的,不需要我們費心去設置。

 

需要我們做的有:

① 設置過濾器的大小(用字母“F”表示)

上例中,我們的過濾器大小是3×3,即F=3。

當然,你還可以設置成5×5,都是可以的。

只不過,需要注意的是:過濾器的尺寸越大,得到的圖像細節就越少,最終得到的特徵圖的尺寸也更小。

 

② 設置過濾器滑動的步幅數(用字母“S”表示)

上例中,過濾器滑動的步幅是1,即每次過濾器向右或向下滑動1個像素單位。

當然,你也可以將步幅設置爲2或更多,但是通常情況下,我們會使用S=1或S=2。

 

③ 設置過濾器的個數(用字母“K”表示)

上例中,我們分別給大家展示了4種過濾器。所以你可以理解爲K=4,如下圖:

 

當然,你可以設置任意個數。

再次強調:不要在意過濾器裏面的數值,那是算法自己學習來的,不需要我們操心,我們只要把過濾器的個數設置好,就可以了。

 

所以,一張圖片,在經過4種過濾器的提取後,會得到4種不同的特徵圖片:

 

 

實際上,這就是“卷積”小夥兒所做的工作。

 

 

從上面的例子我們能夠看到,“卷積”輸出的結果,是包含“寬、高、深”3個維度的:

 

 

實際上,在CNNs中,所有圖片都是包含有“寬、高、深”。

像輸入的圖片——萌狗,它也是包含3個維度,只不過,它的深度是1,所以在我們的圖片中沒有明顯地體現出來:

 

 

所以,我們要記住,經過“卷積”層的處理後,圖片含有深度,這個“深度”,等於過濾器的個數

例如,上面我們採用了4種過濾器,那麼,輸出的結果,深度就爲4。

 

④ 設置是否補零(用字母“P”表示)

何爲“補零”?

上面的例子中,我們採用了3×3大小的過濾器,直接在原始圖片滑過。

從結果中可以看到,最終得到的“特徵圖片”比“原始圖片”小了一圈:

爲什麼會出現這種情況?

原因很簡單:過濾器將原始圖片中,每3*3=9個像素點,提取爲1個像素點

 

所以,當過濾器遍歷整個圖片後,得到的特徵圖片會比原始圖片更小。

 

當然,你也可以得到一個和原始圖片大小一樣的特徵圖,這就需要採用“在原始圖片外圍補零”的方法:

 

下面,我們來看看“補零”後的效果:

 

 

從圖中可以看到,當我們在原始圖片外圍補上1圈零後,得到的特徵圖大小和原始圖一樣,都是5*5。

 

你可能會問:

 

如何確定“補零”的圈數,才能保證圖片大小一致?

 

假設你的過濾器大小爲F,滑動步幅S=1,想要實現這一目標,補零的個數應爲:

 

舉個例子:

在上圖中,因爲我們使用的是3*3大小的過濾器,而且每次滑動時,都是向右或向下移動1格。

所以,爲了使特徵圖片與原始圖片保持一致,需要補零P=(3-1)/2=1,即在原始圖片外圍,補1圈零。

 

如果你使用的過濾器大小爲5*5,那麼補零P=(5-1)/2=2,即在原始圖片外圍,補2圈零。

 

當然,是否需要“補零”,由你自己來決定,“補零”並不是硬性規定。

 

 溫馨提示:

假設原始圖片的大小爲W,當我們設置了

過濾器的大小(F)、滑動的步幅數(S)、以及補零的圈數(P)

實際上,得到的特徵圖片大小爲:

 

所以,當我們設置這些超參數時,需要遵循一個原則,即“上面公式得到的結果,必須爲一個整數”:

 

 

看懂了卷積神經網絡的大概提取特徵的過程吧,那現在就接着講卷積神經網絡的理論部分吧,看看這裏面有什麼技巧以及參數個數,連接數都是怎麼計算的?

 

 

卷積神經網絡是一個多層的神經網絡,每層由多個二維平面組成,而每個平面由多個獨立神經元組成。

       圖:卷積神經網絡的概念示範:輸入圖像通過和三個可訓練的濾波器和可加偏置進行卷積,濾波過程如圖一,卷積後在C1層產生三個特徵映射圖,然後特徵映射圖中每組的四個像素再進行求和,加權值,加偏置,通過一個小號型函數得到三個S2層的特徵映射圖。這些映射圖再進過濾波得到C3層。這個層級結構再和S2一樣產生S4。最終,這些像素值被光柵化,並連接成一個向量輸入到傳統的神經網絡,得到輸出。

       一般地,C層爲特徵提取層,每個神經元的輸入與前一層的局部感受野相連,並提取該局部的特徵,一旦該局部特徵被提取後,它與其他特徵間的位置關係也隨之確定下來; 小號層是特徵映射層,網絡的每個計算層由多個特徵映射組成,每個特徵映射爲一個平面,平面上所有神經元的權值相等特徵映射結構採用影響函數核小的小號形函數作爲卷積網絡的激活函數,使得特徵映射具有位移不變性。

       此外,由於一個映射面上的神經元共享權值,因而減少了網絡自由參數的個數,降低了網絡參數選擇的複雜度。卷積神經網絡中的每一個特徵提取層(C-層)都緊跟着一個用來求局部平均與二次提取的計算層(S-層),這種特有的兩次特徵提取結構使網絡在識別時對輸入樣本有較高的畸變容忍能力。

關於參數減少與權值共享

      上面聊到,好像CNN一個牛逼的地方就在於通過感受野和權值共享減少了神經網絡需要訓練的參數的個數。那究竟是啥的呢?

       下圖左:如果我們有1000×1000像素的圖像,有1百萬個隱層神經元,那麼他們全連接的話(每個隱層神經元都連接圖像的每一個像素點),就有1000x1000x1000000 = 10 ^ 12個連接,也就是10 ^ 12個權值參數。然而圖像的空間聯繫是局部的,就像人是通過一個局部的感受野去感受外界圖像一樣,每一個神經元都不需要對全局圖像做感受,每個神經元只感受局部的圖像區域,然後在更高層,將這些感受不同局部的神經元綜合起來就可以得到全局的信息了(局部感受野是有科學依據的,是科學家研究腦科學所得出的結論)這樣,我們就可以減少連接的數目,也就是減少神經網絡需要訓練的權值參數的個數瞭如下圖右:假如局部感受野是10×10,隱層每個感受野只需要和這10×10的局部圖像相連接,所以1百萬個隱層神經元就只有一億個連接,即10 ^ 8個參數。比原來減少了四個0 數量級),這樣訓練起來就沒那麼費力了,但還是感覺很多的啊,那還有啥辦法沒?

 

       我們知道,隱含層的每一個神經元都連接10×10個圖像區域,也就是說每一個神經元存在10×10 = 100個連接權值參數。那如果我們每個神經元這100個參數是相同的呢?也就是說每個神經元用的是同一個卷積核去卷積圖像。這樣我們就只有多少個參數?只有100個參數啊!!!親!不管你隱層的神經元個數有多少,兩層間的連接我只有100個參數啊!親!這就是權值共享啊!同時有相同程度的位移,不變性旋轉親!這就是卷積神經網絡的主打賣點啊!親!(有點煩了,呵呵),也許你會問,這樣做靠譜嗎?爲什麼可行呢?這個......共同學習。注意這裏權值共享不是局部連接的神經元權值相同,而是同一平面層的神經元型態權值相同(所以目前爲止還只是提取了一個特徵圖,好戲在後面)

       好了,你就會想,這樣提取特徵也忒不靠譜吧,這樣你只提取了一種特徵啊?對了,真聰明,我們需要提取多種特徵對不?假如一種濾波器,也就是一種卷積核就是提出圖像的一種特徵,例如某個方向的邊緣。那麼我們需要提取不同的特徵,怎麼辦,加多幾種濾波器不就行了嗎?對了。所以假設我們加到100種濾波器,每種濾波器的參數不一樣,表示它提出輸入圖像的不同特徵,例如不同的邊緣。這樣每種濾波器去卷積圖像就得到對圖像的不同特徵的放映,我們稱之爲特徵圖。所以100種卷積核就有100個特徵圖(這裏的特徵圖的個數就相當於卷積層的深度)。這100個特徵圖就組成了一層神經元。到這個時候明瞭了吧。我們這一層有多少個參數了?100種卷積核X每種卷積核共享100個參數= 100×100 = 10K,也就是1萬個參數。才1萬個參數啊!親!(又來了,受 !不了了),見下圖右:不同的顏色表達不同的濾波器。

 

       嘿喲,遺漏一個問題了。剛纔說隱層的參數個數和隱層的神經元個數無關,只和濾波器的大小和濾波器種類的多少有關。那麼隱層的神經元個數怎麼確定呢?它和原圖像,也就是輸入的大小(神經元個數),濾波器的大小和濾波器在圖像中的滑動步長都有關!例如,我的圖像是1000×1000像素,而濾波器大小是10x10,假設濾波器沒有重疊,也就是步長爲10,這樣隱層的神經元個數就是(1000x1000)/(10x10)= 100x100個神經元了,假設步長是8,也就是卷積核會重疊兩個像素,那麼......我就不算了,思想懂了就好。注意了,這只是一種濾波器,也就是一個Feature Map的神經元個數哦,如果100個Feature Map就是100倍了。由此可見,圖像越大,神經元個數和需要訓練的權值參數個數的貧富差距就越大。

 

      需要注意的一點是,上面的討論都沒有考慮每個神經元的偏置部分。所以權值個數需要加1。這個也是同一種濾波器共享的。

      總之,卷積網絡的核心思想是將:局部感受野,權值共享(或者權值複製)以及時間或空間亞採樣這三種結構思想結合起來獲得了某種程度的位移,尺度,形變不變性。

4)一個典型的例子說明

       一種典型的用來識別數字的卷積網絡是LeNet-5(效果和紙張等見這)。當年美國大多數銀行就是用它來識別支票上面的手寫數字的。能夠達到這種商用的地步,它的準確性可想而知。畢竟目前學術界和工業界的結合是最受爭議的。

      那下面咱們也用這個例子來說明下。

        LeNet-5共有7層,不包含輸入,每層都包含可訓練參數(連接權重)。輸入圖像爲32×32大小。這要比MNIST數據庫(一個公認的手寫數據庫)中最大的字母還大。這樣做的原因是希望潛在的明顯特徵如筆畫斷電或角點能夠出現在最高層特徵監測子感受野的中心。

        我們先要明確一點:每個層有多個Feature Map,每個Feature Map通過一種卷積濾波器提取輸入的一種特徵,然後每個Feature Map有多個神經元。

        C1層是一個卷積層(爲什麼是卷積?卷積運算一個重要的特點就是,通過卷積運算,可以使原信號特徵增強,並且降低噪音),由6個特徵圖Feature Map構成。特徵圖中每個神經元與輸入中5×5的鄰域相連。特徵圖的大小爲28 * 28,這樣能防止輸入的連接掉到邊界之外(是爲了BP反饋時的計算,不致梯度損失,個人見解).C1有156個可訓練參數(每個濾波器5 * 5 = 25個單元參數和一個偏置參數,一共6個濾波器,共(5 * 5 + 1)×6 = 156個參數),共156 *(28 * 28)= 122304個連接。

       S2層是一個下采樣層(爲什麼是下采樣?利用圖像局部相關性的原理,對圖像進行子抽樣,可以減少數據處理量同時保留有用信息),有6個14×14的特徵圖。特徵圖中的每個單元與C1中相對應特徵圖的2 * 2鄰域相連接.S2層每個單元的4個輸入相加,乘以一個可訓練參數,再加上一個可訓練偏置。結果通過乙狀結腸函數計算。可訓練係數和偏置控制着乙狀結腸函數的非線性程度。如果係數比較小,那麼運算近似於線性運算,亞採樣相當於模糊圖像。如果係數比較大,根據偏置的大小亞採樣可以被看成是有噪聲的“或”運算或者有噪聲的“與”運算。每個單元的2 * 2感受野並不重疊,因此S2中每個特徵圖的大小是C1中特徵圖大小的1/4(行和列各1/2).S2層有12個可訓練參數和5880個連接。

圖:卷積和子採樣過程:卷積過程包括:用一個可訓練的濾波器f x去卷積一個輸入的圖像(第一階段是輸入的圖像,後面的階段就是卷積特徵map了),然後加一個偏置b x,得到卷積層C x。子採樣過程包括:每鄰域四個像素求和變爲一個像素,然後通過標量W x + 1加權,再增加偏置b x + 1,然後通過一個sigmoid激活函數,產生一個大概縮小四倍的特徵映射圖S x + 1。

       所以從一個平面到下一個平面的映射可以看作是作卷積運算,S-層可看作是模糊濾波器,起到二次特徵提取的作用。隱層與隱層之間空間分辨率遞減,而每層所含的平面數遞增,這樣可用於檢測更多的特徵信息。最後說說池化層的作用:1簡化網絡的計算的複雜度,2特徵壓縮特區主要特徵(一般是取局部的最大值,相當於提取了重要信息,還有一種方式就是去局部平均值)。但是可能有人問,池化層壓縮過程中可能影響網絡的準確度,因此可以增加特徵圖的深度來彌補這裏的深度一般通常取兩倍。

       C3層也是一個卷積層,它同樣通過5×5的卷積核去卷積層S2,然後得到的特徵地圖就只有10×10個神經元,但是它有16種不同的卷積核,所以就存在16個特徵地圖了這裏需要注意的一點是:C3中的每個特徵的地圖是連接到S2中的所有6個或者幾個特徵地圖的,表示本層的特徵地圖是上一層提取到的特徵地圖的不同組合(這個做法也並不是唯一的)。(看到沒有,這裏是組合,就像之前聊到的人的視覺系統一樣,底層的結構構成上層更抽象的結構,例如邊緣構成形狀或者目標的部分)。

       剛纔說C3中每個特徵圖由S2中所有6個或者幾個特徵映射組合而成。爲什麼不把S2中的每個特徵圖連接到每個C3的特徵圖呢?原因有2點。第一,不完全的連接機制將連接的數量保持在合理的範圍內。第二,也是最重要的,其破壞了網絡的對稱性。由於不同的特徵圖有不同的輸入,所以迫使他們抽取不同的特徵(希望是互補的)。

組合方式如下:

 

         

 

 

      例如,存在的一個方式是:C3的前6個特徵圖以S2中3個相鄰的特徵圖子集爲輸入接下來6個特徵圖以S2中4個相鄰特徵圖子集爲輸入。然後的3個以不相鄰的4個特徵圖子集爲輸入。最後一個將S2中所有特徵圖爲輸入。這樣C3層有1516個可訓練參數和151600個連接。

       S4層是一個下采樣層,由16個5×5大小的特徵圖構成。特徵圖中的每個單元與C3中相應特徵圖的2 * 2鄰域相連接,跟C1和S2之間的連接一樣.S4層有32個可訓練參數(每個特徵圖1個因子和一個偏置)和2000個連接。

       C5層是一個卷積層,有120個特徵圖。每個單元與S4層的全部16個單元的5×5鄰域相連。由於S4層特徵圖的大小也爲5 * 5(同濾波器一樣),故C5特徵圖的大小爲1 * 1:這構成了S4和C5之間的全連接之所以仍將C5標示爲卷積層而非全相聯層,是因爲如果LeNet-5的輸入變大,而其他的保持不變,那麼此時特徵圖的維數就會比1 * 1大.C5層有48120個可訓練連接。

        F6層有84個單元(之所以選這個數字的原因來自於輸出層的設計),與C5層全相連。有10164個可訓練參數。如同經典神經網絡,F6層計算輸入向量和權重向量之間的點積,再加上一個偏置。然後將其傳遞給S形函數產生單元我的一個狀態。

      最後,輸出層由歐式徑向基函數(Euclidean Radial Basis Function)單元組成,每類一個單元,每個有84個輸入。距離。輸入離參數向量越遠,RBF輸出的越大。一個RBF輸出可以被理解爲衡量輸入模式和與RBF相關聯類的一個模型的匹配程度的懲罰項。用概率術語來說,RBF輸出可以被理解爲F6層配置空間的高斯分佈的負對數似然。給定一個輸入模式,損失函數應能使得F6的配置與RBF參數向量(即模式的期望分類)足夠接近。這些單元的參數是人工選取並保持固定的(至少初始時候如此)。這些參數向量的成分被設爲-1或1。雖然這些參數可以以-1和1等概率的方式任選,或者構成一個糾錯碼,但是被設計成一個相應字符類的7 * 12大小(即84)的格式化圖片。這種表示對識別單獨的數字不是很有用,但是對 別可打印的ASCII集中的字符串很有用。

      使用這種分佈編碼而非更常用的“N of 1”編碼用於產生輸出的另一個原因是,當類別比較大的時候,非分佈編碼的效果比較差。原因是大多數時間非分佈編碼的輸出必須爲0。這使得用乙狀結腸單元很難實現。另一個原因是分類器不僅用於識別字母,也用於拒絕非字母。使用分佈編碼的RBF更適合該目標。因爲與乙狀結腸不同,他們在輸入空間的較好限制的區域內興奮,而非典型模式更容易落到外邊。

        需要指出這些向量的成分是+1或-1,這正好在F6 sigmoid的範圍內,因此可以防止sigmoid函數飽和。實際上,+ 1和-1是乙狀結腸函數的最大彎曲的點處。這使得F6單元運行在最大非線性範圍內。必須避免乙狀結腸函數的飽和,因爲這將會導致損失函數較慢的收斂和病態問題。

來自:HTTPS://blog.csdn.net/zouxy09/article/details/8781543

https://mp.weixin.qq.com/s/x6NIkzQSgvl0_rfGe7Cjqg

       

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章