CNN學習筆記——CNN是怎麼做到圖像識別的?


——CNN初識筆記


CNN的由來及發展(包含圖像識別的思路)

剛接觸CNN的時候,很懵。CNN?到底是什麼?美國有線電視新聞網?哦,卷積神經網絡(Convolutional Neural Networks)啊!爲什麼要叫這個名字,他又是怎麼來的呢?

先思考一個問題:如果給你一張圖片,你是怎麼去識別圖片裏的內容的?一般我們應該會用到兩樣東西吧,那就是記憶和經驗,這些東西我們也可以稱之爲知識,也就是對於一個圖像識別任務我們必須認識過跟他同類的才能準確地識別它,這個就有意思了,和我們有監督學習的過程不就是一樣的嗎,根據數據及標籤訓練模型,再在測試集上去測試模型預測的準確性。異曲同工之妙啊。

假設CNN整體過程就是上面所說的那樣,那我們又是怎麼把一個物體識別出來的呢,於人類而言,對於我們見過的物體,有的時候我們只需要看到物體的某一部分我們便可以判斷出這是什麼。Hubel 和 Wiesel 於 1962 年進行的一項有趣的試驗證明了這件事,他們驗證出大腦中的一些個體神經細胞只有在特定方向的邊緣存在時才能做出反應,例如,一些神經元只對垂直邊緣興奮,另一些對水平或對角邊緣興奮,大家一起工作的時候,視覺感知便產生了,你就知道了,哦,原來這是一個西瓜。後來日本的科學家又提出了一種層級化的多層人工神經網絡,即神經認知,在這個神經認知模型裏,最重要的兩個組成單元便是是“S細胞”和“C細胞”,兩類細胞交替堆疊在一起構成了神經認知網絡。其中,S細胞用於抽取局部特徵,C型細胞則用於抽象和容錯,S細胞在自身的感受野內最大限度地對圖像中類似邊緣模式的刺激做出響應,而C細胞具有更大的感受野, 它可以對圖像中產生刺激的模式的空間位置進行精準地定位。再到80年代末,Yann LeCun作爲貝爾實驗室的研究員提出了卷積網絡技術,他們構建了一個叫做LeNet-5的多層前饋神經網絡,並展示瞭如何使用它來大幅度提高手寫識別能力,這爲後來卷積神經網絡的發展奠定了基礎,後來不斷有新的模型被提出來,網絡層數逐漸加深,網絡圖像識別的準確率也不斷提升甚至超過人類(這已經是2015年的事了),直到今天這個體系還在不斷的完善與發展。

回顧整個CNN的發展,不難發現,他的思想來源於生物學,實現靠數學,發展靠數據和算力,這的確是一件有趣的事情。

CNN的基本結構

我們以LeNet-5爲例,來看看一看CNN的基本結構組成:

image-20200610075029464

總體來說,卷積神經網絡是一種多層級的網絡模型,在圖像處理領域,它的輸入是由多種通道構成的圖像數據(如RGB的三通道),數據在經過網絡中的多重卷積、池化和激活之後,特徵被提取出來,然後再通過全連接層輸出,這便是網絡的前向傳播過程,同時,作爲一種神經網絡,它也會有反向傳播過程:通過計算預測值與真實值之間的loss,通過反向傳播,將loss逐層向前一層反饋,進而更新前向傳播中的各個參數,如此往復,以訓練出泛化效果更好的網絡模型。

但是要深入理解卷積神經網絡,我們還需要了解一些卷積神經網絡中的重要概念。

感受野、濾波器、卷積

什麼是感受野(receptive fields)?通俗的,可以理解爲在觀察時某個畫面時你看到的那個視野,比如“一葉蔽目”這個詞,當一片葉子遮住你的眼睛時,你的感受野便只是一片葉子,看不見葉子之外的世界。在CNN中,每個神經元只感受局部的圖像區域、提取局部的特徵,然後在更高的層次上,不同的特徵信息被彙總起來,整個圖像是個什麼樣便也逐漸清晰起來。就好像盲人摸象,某一個盲人摸到了大象的腿,那麼他的感受野就是這個像柱子一樣的腿了。

那麼卷積(Convolution)又是什麼?卷積其實是通過一種點積形式的數學運算,將局部感受野對應範圍內的特徵提取出來的一個過程。記得大學時期在信號與系統中,卷積的定義如下:

image-20200610082522809

(其中x(n)是激勵信號,h(n)是單位樣值響應,*表示求卷積,延申:一個域中的卷積相當於另一個域中的乘積,例如時域中的卷積就對應於頻域中的乘積,這也是傅里葉變換要說的事,扯遠了。)

在CNN中,卷積的實際運算是求點積(也稱內積、數量積),即矩陣或向量的對應元素相乘求和。

那麼,CNN又是如何利用卷積來提取圖像特徵的呢?這就需要用到濾波器(filter)了。

提取不同的特徵,需要多個濾波器。每種濾波器的參數不一樣,表示它提取的是輸入圖像的不同特徵。這樣每種濾波器去卷積圖像就得到對圖像的不同特徵的反映,我們稱之爲特徵圖(Feature Map)。

濾波器去卷積圖像的過程有點類似中學時代老師批改英語試卷答題卡的情景,她會拿一張空白的答題卡,然後把所有正確答案對應的填塗區全部拿菸頭燙穿,這樣就得到了一個標準答案“濾波器”,當她拿着這張答題卡覆蓋到你的答題卡上的時候,你對了多少題得多少分就是數數求和的事了,這個過程和濾波器卷積圖像基本如出一轍,我們通過下面的過程可以清楚的看見:

每個過濾器可以被看成是特徵標識符( feature identifiers)。這裏的特徵指的是例如直邊緣、顏色、曲線之類的東西。我們可以把圖像都看成是由一個個特徵組成的特徵集合,我們拿一個個單獨檢測某一特徵的濾波器去檢測單一特徵並標記,最後便可以知道圖像都由哪些特徵組成且他們都在圖像的哪個位置。

檢測單個特徵時,我們是這麼做的,比如說下面的曲線檢測:

image-20200610125150181

圖中右半部分就是你要識別的特徵,他是一根曲線,對應到左邊的濾波器上,可以看出,只是對應像素塊上被填充了數值,這個數值可以看作是一個權重,假設他能代表顏色的深淺,如果這條曲線的下半部分全部是淺灰色,可能對應的數值就又不一樣了,就像英語的選擇題,有的一題一分,有的一題兩分。

假如我們要識別一個老鼠圖案,我們把上述這樣一個曲線濾波器放在老鼠的屁股上,這樣當我們拿着這樣一個濾波器去卷積原始圖像轉化出來的矩陣時會發生什麼:

image-20200611101946838

image-20200611101410551

最左邊是我們的感受野,就像你答題卡上塗的一小格,轉化爲像素的數值表示就是中間的矩陣,最右邊是我們的濾波器,就是你英語老師手上拿着的標準答案對應的那一格,好啦,卷積就是對應元素相乘做加法,我們會得到一個很大的數值,這樣這個特徵就被我們標記在這了,根據數值大小,我們可以認爲這一塊就是一條曲線,在英語試卷上就是這一題你得分了。

那麼,把這個濾波器放在老鼠的頭部會發生什麼呢?

image-20200612075224125

可以看到,在局部感受野內,實際像素和濾波器完美錯開,卷積出來的數值等於0。我們通過這個結果可以看出,原始信號對於我們給的濾波器沒有響應,從而我們知道了這一個局部感受野內沒有我們要的那條曲線,但是如果我們拿一個類似老鼠圓耳朵和眼睛的濾波器來測試,這一部分就會得到一個較大的數值,我們就知道了,哦這一塊是一個頭啊。

那麼讓我們從整體上來看,如果我們要識別一張圖片裏的物體,我們需要怎麼做呢,我們需要拿不同的濾波器去在整張圖片上不斷的掃描滑動,得出不同感受野與濾波器卷積之後的結果,這就是特徵圖(Feature Map)或(Convolved Feature” 或 “Activation Map”)。假如下圖中濾波器代表曲線,卷積之後我們可以看出,在右對角線上整個都有曲線分佈的概率就會比較大一些,這就是我們通過卷積的出來的特徵信息。

img

步幅和填充

對於上面動圖展示的卷積過程,我們每次將卷積窗滑動了一個像素點,我們稱每次滑動的單位爲步幅(stride),這裏步幅就爲1,如果我們增大步幅,勢必我們掃描的也就沒有那麼仔細,特徵提取的也就不如小步幅那樣精確。但是,不難看出對於一個5x5的原始圖像,我們拿一個3x3卷積核(即濾波器)設置步幅爲1來卷積的時候,發現最外圍的那一圈都只能被掃描一次,而其他的像素點都可以被掃描兩次,這樣就可能導致我們漏掉圖像邊緣的某些重要特徵,那麼怎麼辦,我們可以在圖像的外層再加上一圈來擴展圖像的邊界,這個我們稱之爲填充(padding),但是需要注意的是填充的內容不能改變圖像的原始特徵,所以我們不能讓前來卷積的濾波器激活,一般我們需要填充的數值應該是0,這樣你卷積出來的這部分結果也會是0,這樣也就不影響原有特徵了。

那麼,針對不同的原始圖像和不同大小的濾波器,我們到底需要填充多少呢?通過上面的例子可以看出:
P=F12 P=\frac{F-1}{2}

其中F是濾波器的尺寸,比如,上面F=3,那麼P=1,就代表原圖像周圍要填充一圈0。

填充不是必需的,有的時候我們需要填充,有的時候我們不選擇填充。那麼通常情況下輸出的特徵圖大小又是多少呢?
W2=(W1+2PF+S)S=(W1+2PF)S+1 W_2=\frac{(W_1+2P-F+S)}{S}=\frac{(W_1+2P-F)}{S}+1
同樣的:
H2=(H1+2PF)S+1 H_2=\frac{(H_1+2P-F)}{S}+1
其中W1、H1分別是卷積層的輸入圖像尺寸,W2、H2爲卷積輸出尺寸,P爲填充量,S爲步幅。這個公式可以不用特意去記,理解之後其實很簡單。

例如在LeNet-5中,輸入圖像大小32x32,卷積核5x5,步幅1,無填充,那麼第一層卷積之後輸出的特徵圖就應該是28x28.

激活層

一般在卷積之後都會跟着一層激活層,激活函數會選擇RELU函數,從而引入非線性特徵,增強模型的表達能力。而Relu函數有可以避免sigmoid、tanh中常見的梯度消失的問題(因爲其梯度只有0/1兩種值,很穩定),而且還能比較好的加快收斂,提升模型訓練速度,所以經常被拿來使用。

池化

池化(pooling ,也稱下采樣)是什麼?池化就是通過抽象特徵的過程來留住特徵的同時減少參數。以最常用的最大池化(max-pooling)爲例,它採用了一個過濾器(常用)和一個同樣長度的步幅。然後把它應用到輸入內容上,輸出過濾器卷積計算的每個子區域中的最大數字。直白一點說就是把卷積出來的特徵圖劃分成多個小方格,取每個小方格區域內最大的數作爲這一區域的代表組成新的特徵圖。

img

池化的作用主要就是在保證特徵信息保留的同時減少了訓練的參數量,簡化了網絡的複雜度,同時也實現了圖像的不變性,所謂不變性即圖像目標經過平移/旋轉/尺度變化後是否還能取得相似的檢測結果。程序每運行一輪,總能保持原有的特徵。在某種程度上也擴大了感受野。

除了最大池化之外還有平均池化和隨機池化等等。

光柵化

圖像經過池化-下采樣後,得到的是一系列的特徵圖,而多層感知器接受的輸入是一個向量。因此需要將這些特徵圖中的像素依次取出,排列成一個向量。這就是光柵化。

image-20200613145345665

全連接層

全連接層在神經網絡中一般就是起到一個分類器的作用,他將特徵向量送入分類器,得到一個結果。全連接層把之前卷積出來的局部特徵放到一起,比如我們找到了老鼠的屁股,找到了老鼠的眼睛鬍鬚等等一系列特徵,到了全連接層,把這些特徵擺出來一看,哦這很像是一個老鼠啊,那就把它分類成老鼠吧。

preview

訓練網絡

讓我們回到最初的這張圖上看一看,通過上面的學習我們已經理解了,我們是怎麼去提取圖像特徵、並如何分類的了,網絡訓練的過程其實就是這個過程的具化。

image-20200610075029464

我們不斷的卷積提取特徵、前向傳播暫定網絡參數,反向傳播更新參數以期達到在訓練集上loss最小,在測試集上模型的準確率更高;這其實就是我們整個CNN甚至整個神經網絡學習的大致過程。爲了更好更快地實現我們“訓練出一個好模型”的目標,我們越來越傾向於使用更深層的網絡,當然我們還會使用到一些技巧(trick),比如,批量正則化(batch normalization)、隨機失活(dropout)、圖像增廣(image augmentation),當然也包括我們之前說過的填充(padding)、池化(pooling),甚至我個人理解使用Relu激活函數也能算得上一種trick,填充(padding)、池化(pooling)之前已經說過了,這裏再簡單說一下其他幾個的作用:

批量正則化(batch normalization):在BN之前我們一般都只是對輸入數據進行歸一化,卻沒有在中間層進行歸一化,但這樣會有W一個問題,當輸入數據經過矩陣乘法或各種非線性運算之後,其數據分佈很可能被改變,而隨着深度網絡的多層運算之後,數據分佈的變化將越發的不可預測。batch normalization則是對每一批數據都進行歸一化,即在神經網絡的訓練過程中對每層的輸入數據加一個標準化處理。這樣保證了對每一層而言其輸入數據都是歸一化過的。

實際操作上,BN就是通過一定的規範化手段,把每層神經網絡任意神經元輸入值的分佈強行拉回到均值爲0方差爲1的標準正態分佈,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,從而避免梯度消失問題。這樣輸入的小變化就會導致損失函數較大的變化(使得梯度變大,避免梯度消失問題產生),同時也
讓收斂速度更快,加快訓練速度。

隨機失活(dropout):爲了防止過擬合。在訓練網絡模型的過程中,常常容易出現過擬合的情況,特別是在訓練參數很多,訓練樣本又很少的情況下,過擬合更容易出現。Dropout的應用就是爲了防止模型的過擬合問題。Dropout通過在前向傳播的過程中,讓某個神經元的激活值以一定概率p停止工作(即隨機暫時丟棄一些神經元),這樣可以使模型的泛化能力更強,因爲他不會太依賴於某些局部特徵。

圖像增廣(image augmentation):圖像增廣就是通過對訓練圖像做一系列隨機改變, 產生相似但又不同的訓練樣本,從而擴大訓練數據集的規模,降低模型對某些屬性的依賴,從而提高模型的泛化能力。(常用的圖像增廣方法:翻轉和裁剪、變化顏色及各方法疊加等)

寫在最後

上面我們基本上把CNN在圖像領域的基本應用原理說了一遍,希望我自己有一天忘記又需要用的時候,能及時的上來點開這篇文章,快速的撿回來,也希望大家相互學習指教,共享知識,共同進步。晚安。

參考文章:
圖像處理講解-以CNN對圖像進行分類爲例
CNN(卷積神經網絡)是什麼

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