A. 一文看懂卷積神經網路-CNN(基本原理+獨特價值+實際應用)
在 CNN 出現之前,圖像對於人工智慧來說是一個難題,有2個原因:
圖像需要處理的數據量太大,導致成本很高,效率很低
圖像在數字化的過程中很難保留原有的特徵,導致圖像處理的准確率不高
下面就詳細說明一下這2個問題:
圖像是由像素構成的,每個像素又是由顏色構成的。
現在隨隨便便一張圖片都是 1000×1000 像素以上的, 每個像素都有RGB 3個參數來表示顏色信息。
假如我們處理一張 1000×1000 像素的圖片,我們就需要處理3百萬個參數!
1000×1000×3=3,000,000
這么大量的數據處理起來是非常消耗資源的,而且這只是一張不算太大的圖片!
卷積神經網路 – CNN 解決的第一個問題就是「將復雜問題簡化」,把大量參數降維成少量參數,再做處理。
更重要的是:我們在大部分場景下,降維並不會影響結果。比如1000像素的圖片縮小成200像素,並不影響肉眼認出來圖片中是一隻貓還是一隻狗,機器也是如此。
圖片數字化的傳統方式我們簡化一下,就類似下圖的過程:
假如有圓形是1,沒有圓形是0,那麼圓形的位置不同就會產生完全不同的數據表達。但是從視覺的角度來看, 圖像的內容(本質)並沒有發生變化,只是位置發生了變化 。
所以當我們移動圖像中的物體,用傳統的方式的得出來的參數會差異很大!這是不符合圖像處理的要求的。
而 CNN 解決了這個問題,他用類似視覺的方式保留了圖像的特徵,當圖像做翻轉,旋轉或者變換位置時,它也能有效的識別出來是類似的圖像。
那麼卷積神經網路是如何實現的呢?在我們了解 CNN 原理之前,先來看看人類的視覺原理是什麼?
深度學習的許多研究成果,離不開對大腦認知原理的研究,尤其是視覺原理的研究。
1981 年的諾貝爾醫學獎,頒發給了 David Hubel(出生於加拿大的美國神經生物學家) 和TorstenWiesel,以及 Roger Sperry。前兩位的主要貢獻,是「 發現了視覺系統的信息處理 」,可視皮層是分級的。
人類的視覺原理如下:從原始信號攝入開始(瞳孔攝入像素 Pixels),接著做初步處理(大腦皮層某些細胞發現邊緣和方向),然後抽象(大腦判定,眼前的物體的形狀,是圓形的),然後進一步抽象(大腦進一步判定該物體是只氣球)。下面是人腦進行人臉識別的一個示例:
對於不同的物體,人類視覺也是通過這樣逐層分級,來進行認知的:
我們可以看到,在最底層特徵基本上是類似的,就是各種邊緣,越往上,越能提取出此類物體的一些特徵(輪子、眼睛、軀乾等),到最上層,不同的高級特徵最終組合成相應的圖像,從而能夠讓人類准確的區分不同的物體。
那麼我們可以很自然的想到:可以不可以模仿人類大腦的這個特點,構造多層的神經網路,較低層的識別初級的圖像特徵,若干底層特徵組成更上一層特徵,最終通過多個層級的組合,最終在頂層做出分類呢?
答案是肯定的,這也是許多深度學習演算法(包括CNN)的靈感來源。
典型的 CNN 由3個部分構成:
卷積層
池化層
全連接層
如果簡單來描述的話:
卷積層負責提取圖像中的局部特徵;池化層用來大幅降低參數量級(降維);全連接層類似傳統神經網路的部分,用來輸出想要的結果。
下面的原理解釋為了通俗易懂,忽略了很多技術細節,如果大家對詳細的原理感興趣,可以看這個視頻《 卷積神經網路基礎 》。
卷積層的運算過程如下圖,用一個卷積核掃完整張圖片:
這個過程我們可以理解為我們使用一個過濾器(卷積核)來過濾圖像的各個小區域,從而得到這些小區域的特徵值。
在具體應用中,往往有多個卷積核,可以認為,每個卷積核代表了一種圖像模式,如果某個圖像塊與此卷積核卷積出的值大,則認為此圖像塊十分接近於此卷積核。如果我們設計了6個卷積核,可以理解:我們認為這個圖像上有6種底層紋理模式,也就是我們用6中基礎模式就能描繪出一副圖像。以下就是25種不同的卷積核的示例:
總結:卷積層的通過卷積核的過濾提取出圖片中局部的特徵,跟上面提到的人類視覺的特徵提取類似。
池化層簡單說就是下采樣,他可以大大降低數據的維度。其過程如下:
上圖中,我們可以看到,原始圖片是20×20的,我們對其進行下采樣,采樣窗口為10×10,最終將其下采樣成為一個2×2大小的特徵圖。
之所以這么做的原因,是因為即使做完了卷積,圖像仍然很大(因為卷積核比較小),所以為了降低數據維度,就進行下采樣。
總結:池化層相比卷積層可以更有效的降低數據維度,這么做不但可以大大減少運算量,還可以有效的避免過擬合。
這個部分就是最後一步了,經過卷積層和池化層處理過的數據輸入到全連接層,得到最終想要的結果。
經過卷積層和池化層降維過的數據,全連接層才能」跑得動」,不然數據量太大,計算成本高,效率低下。
典型的 CNN 並非只是上面提到的3層結構,而是多層結構,例如 LeNet-5 的結構就如下圖所示:
卷積層 – 池化層- 卷積層 – 池化層 – 卷積層 – 全連接層
在了解了 CNN 的基本原理後,我們重點說一下 CNN 的實際應用有哪些。
卷積神經網路 – CNN 很擅長處理圖像。而視頻是圖像的疊加,所以同樣擅長處理視頻內容。下面給大家列一些比較成熟的應用�:
圖像分類、檢索
圖像分類是比較基礎的應用,他可以節省大量的人工成本,將圖像進行有效的分類。對於一些特定領域的圖片,分類的准確率可以達到 95%+,已經算是一個可用性很高的應用了。
典型場景:圖像搜索…
目標定位檢測
可以在圖像中定位目標,並確定目標的位置及大小。
典型場景:自動駕駛、安防、醫療…
目標分割
簡單理解就是一個像素級的分類。
他可以對前景和背景進行像素級的區分、再高級一點還可以識別出目標並且對目標進行分類。
典型場景:美圖秀秀、視頻後期加工、圖像生成…
人臉識別
人臉識別已經是一個非常普及的應用了,在很多領域都有廣泛的應用。
典型場景:安防、金融、生活…
骨骼識別
骨骼識別是可以識別身體的關鍵骨骼,以及追蹤骨骼的動作。
典型場景:安防、電影、圖像視頻生成、游戲…
今天我們介紹了 CNN 的價值、基本原理和應用場景,簡單總結如下:
CNN 的價值:
能夠將大數據量的圖片有效的降維成小數據量(並不影響結果)
能夠保留圖片的特徵,類似人類的視覺原理
CNN 的基本原理:
卷積層 – 主要作用是保留圖片的特徵
池化層 – 主要作用是把數據降維,可以有效的避免過擬合
全連接層 – 根據不同任務輸出我們想要的結果
CNN 的實際應用:
圖片分類、檢索
目標定位檢測
目標分割
人臉識別
骨骼識別
本文首發在 easyAI - 人工智慧知識庫
《 一文看懂卷積神經網路-CNN(基本原理+獨特價值+實際應用) 》
B. GCN圖卷積網路入門詳解
在這篇文章中,我們將仔細研究一個名為GCN的著名圖神經網路。首先,我們先直觀的了解一下它的工作原理,然後再深入了解它背後的數學原理。
字幕組雙語原文: 【GCN】圖卷積網路(GCN)入門詳解
英語原文: Graph Convolutional Networks (GCN)
翻譯: 聽風1996 、 大表哥
許多問題的本質上都是圖。在我們的世界裡,我們看到很多數據都是圖,比如分子、社交網路、論文引用網路。
圖的例子。(圖片來自[1])
在圖中,我們有節點特徵(代表節點的數據)和圖的結構(表示節點如何連接)。
對於節點來說,我們可以很容易地得到每個節點的數據。但是當涉及到圖的結構時,要從中提取有用的信息就不是一件容易的事情了。例如,如果2個節點彼此距離很近,我們是否應該將它們與其他對節點區別對待呢?高低度節點又該如何處理呢?其實,對於每一項具體的工作,僅僅是特徵工程,即把圖結構轉換為我們的特徵,就會消耗大量的時間和精力。
圖上的特徵工程。(圖片來自[1])
如果能以某種方式同時得到圖的節點特徵和結構信息作為輸入,讓機器自己去判斷哪些信息是有用的,那就更好了。
這也是為什麼我們需要圖表示學習的原因。
我們希望圖能夠自己學習 "特徵工程"。(圖片來自[1])
論文 :基於圖神經網路的半監督分類 (2017)[3]
GCN是一種卷積神經網路,它可以直接在圖上工作,並利用圖的結構信息。
它解決的是對圖(如引文網路)中的節點(如文檔)進行分類的問題,其中僅有一小部分節點有標簽(半監督學習)。
在Graphs上進行半監督學習的例子。有些節點沒有標簽(未知節點)。
就像"卷積"這個名字所指代的那樣,這個想法來自於圖像,之後引進到圖(Graphs)中。然而,當圖像有固定的結構時,圖(Graphs)就復雜得多。
從圖像到圖形的卷積思想。 (圖片來自[1])
GCN的基本思路:對於每個節點,我們從它的所有鄰居節點處獲取其特徵信息,當然也包括它自身的特徵。假設我們使用average()函數。我們將對所有的節點進行同樣的操作。最後,我們將這些計算得到的平均值輸入到神經網路中。
在下圖中,我們有一個引文網路的簡單實例。其中每個節點代表一篇研究論文,同時邊代表的是引文。我們在這里有一個預處理步驟。在這里我們不使用原始論文作為特徵,而是將論文轉換成向量(通過使用NLP嵌入,例如tf-idf)。NLP嵌入,例如TF-IDF)。
讓我們考慮下綠色節點。首先,我們得到它的所有鄰居的特徵值,包括自身節點,接著取平均值。最後通過神經網路返回一個結果向量並將此作為最終結果。
GCN的主要思想。我們以綠色節點為例。首先,我們取其所有鄰居節點的平均值,包括自身節點。然後,將平均值通過神經網路。請注意,在GCN中,我們僅僅使用一個全連接層。在這個例子中,我們得到2維向量作為輸出(全連接層的2個節點)。
在實際操作中,我們可以使用比average函數更復雜的聚合函數。我們還可以將更多的層疊加在一起,以獲得更深的GCN。其中每一層的輸出會被視為下一層的輸入。
2層GCN的例子:第一層的輸出是第二層的輸入。同樣,注意GCN中的神經網路僅僅是一個全連接層(圖片來自[2])。
讓我們認真從數學角度看看它到底是如何起作用的。
首先,我們需要一些註解
我們考慮圖G,如下圖所示。
從圖G中,我們有一個鄰接矩陣A和一個度矩陣D。同時我們也有特徵矩陣X。
那麼我們怎樣才能從鄰居節點處得到每一個節點的特徵值呢?解決方法就在於A和X的相乘。
看看鄰接矩陣的第一行,我們看到節點A與節點E之間有連接,得到的矩陣第一行就是與A相連接的E節點的特徵向量(如下圖)。同理,得到的矩陣的第二行是D和E的特徵向量之和,通過這個方法,我們可以得到所有鄰居節點的向量之和。
計算 "和向量矩陣 "AX的第一行。
在問題(1)中,我們可以通過在A中增加一個單位矩陣I來解決,得到一個新的鄰接矩陣Ã。
取lambda=1(使得節點本身的特徵和鄰居一樣重要),我們就有Ã=A+I,注意,我們可以把lambda當做一個可訓練的參數,但現在只要把lambda賦值為1就可以了,即使在論文中,lambda也只是簡單的賦值為1。
通過給每個節點增加一個自循環,我們得到新的鄰接矩陣
對於問題(2): 對於矩陣縮放,我們通常將矩陣乘以對角線矩陣。在當前的情況下,我們要取聚合特徵的平均值,或者從數學角度上說,要根據節點度數對聚合向量矩陣ÃX進行縮放。直覺告訴我們這里用來縮放的對角矩陣是和度矩陣D̃有關的東西(為什麼是D̃,而不是D?因為我們考慮的是新鄰接矩陣Ã 的度矩陣D̃,而不再是A了)。
現在的問題變成了我們要如何對和向量進行縮放/歸一化?換句話說:
我們如何將鄰居的信息傳遞給特定節點?我們從我們的老朋友average開始。在這種情況下,D̃的逆矩陣(即,D̃^{-1})就會用起作用。基本上,D̃的逆矩陣中的每個元素都是對角矩陣D中相應項的倒數。
例如,節點A的度數為2,所以我們將節點A的聚合向量乘以1/2,而節點E的度數為5,我們應該將E的聚合向量乘以1/5,以此類推。
因此,通過D̃取反和X的乘法,我們可以取所有鄰居節點的特徵向量(包括自身節點)的平均值。
到目前為止一切都很好。但是你可能會問加權平均()怎麼樣?直覺上,如果我們對高低度的節點區別對待,應該會更好。
但我們只是按行縮放,但忽略了對應的列(虛線框)。
為列增加一個新的縮放器。
新的縮放方法給我們提供了 "加權 "的平均值。我們在這里做的是給低度的節點加更多的權重,以減少高度節點的影響。這個加權平均的想法是,我們假設低度節點會對鄰居節點產生更大的影響,而高度節點則會產生較低的影響,因為它們的影響力分散在太多的鄰居節點上。
在節點B處聚合鄰接節點特徵時,我們為節點B本身分配最大的權重(度數為3),為節點E分配最小的權重(度數為5)。
因為我們歸一化了兩次,所以將"-1 "改為"-1/2"
例如,我們有一個多分類問題,有10個類,F 被設置為10。在第2層有了10個維度的向量後,我們將這些向量通過一個softmax函數進行預測。
Loss函數的計算方法很簡單,就是通過對所有有標簽的例子的交叉熵誤差來計算,其中Y_{l}是有標簽的節點的集合。
層數是指節點特徵能夠傳輸的最遠距離。例如,在1層的GCN中,每個節點只能從其鄰居那裡獲得信息。每個節點收集信息的過程是獨立進行的,對所有節點來說都是在同一時間進行的。
當在第一層的基礎上再疊加一層時,我們重復收集信息的過程,但這一次,鄰居節點已經有了自己的鄰居的信息(來自上一步)。這使得層數成為每個節點可以走的最大跳步。所以,這取決於我們認為一個節點應該從網路中獲取多遠的信息,我們可以為#layers設置一個合適的數字。但同樣,在圖中,通常我們不希望走得太遠。設置為6-7跳,我們就幾乎可以得到整個圖,但是這就使得聚合的意義不大。
例: 收集目標節點 i 的兩層信息的過程
在論文中,作者還分別對淺層和深層的GCN進行了一些實驗。在下圖中,我們可以看到,使用2層或3層的模型可以得到最好的結果。此外,對於深層的GCN(超過7層),反而往往得到不好的性能(虛線藍色)。一種解決方案是藉助隱藏層之間的殘余連接(紫色線)。
不同層數#的性能。圖片來自論文[3]
論文作者的說明
該框架目前僅限於無向圖(加權或不加權)。但是,可以通過將原始有向圖表示為一個無向的兩端圖,並增加代表原始圖中邊的節點,來處理有向邊和邊特徵。
對於GCN,我們似乎可以同時利用節點特徵和圖的結構。然而,如果圖中的邊有不同的類型呢?我們是否應該對每種關系進行不同的處理?在這種情況下如何聚合鄰居節點?最近有哪些先進的方法?
在圖專題的下一篇文章中,我們將研究一些更復雜的方法。
如何處理邊的不同關系(兄弟、朋友、......)?
[1] Excellent slides on Graph Representation Learning by Jure Leskovec (Stanford): https://drive.google.com/file/d//view?usp=sharing
[2] Video Graph Convolutional Networks (GCNs) made simple: https://www.youtube.com/watch?v=2KRAOZIULzw
[3] Paper Semi-supervised Classification with Graph Convolutional Networks (2017): https://arxiv.org/pdf/1609.02907.pdf
[4] GCN source code: https://github.com/tkipf/gcn
[5] Demo with StellarGraph library: https://stellargraph.readthedocs.io/en/stable/demos/node-classification/gcn-node-classification.html
雷鋒字幕組是一個由AI愛好者組成的翻譯團隊,匯聚五五多位志願者的力量,分享最新的海外AI資訊,交流關於人工智慧技術領域的行業轉變與技術創新的見解。
團隊成員有大數據專家,演算法工程師,圖像處理工程師,產品經理,產品運營,IT咨詢人,在校師生;志願者們來自IBM,AVL,Adobe,阿里,網路等知名企業,北大,清華,港大,中科院,南卡羅萊納大學,早稻田大學等海內外高校研究所。
如果,你也是位熱愛分享的AI愛好者。歡迎與雷鋒字幕組一起,學習新知,分享成長。
C. 如何利用卷積神經網路提取圖像特徵
卷積神經網路有以下幾種應用可供研究: 1、基於卷積網路的形狀識別 物體的形狀是人的視覺系統分析和識別物體的基礎,幾何形狀是物體的本質特徵的表現,並具有平移、縮放和旋轉不變等特點,所以在模式識別領域,對於形狀的分析和識別具有十分重要的意義,而二維圖像作為三維圖像的特例以及組成部分,因此二維圖像的識別是三維圖像識別的基礎。 2、基於卷積網路的人臉檢測 卷積神經網路與傳統的人臉檢測方法不同,它是通過直接作用於輸入樣本,用樣本來訓練網路並最終實現檢測任務的。它是非參數型的人臉檢測方法,可以省去傳統方法中建模、參數估計以及參數檢驗、重建模型等的一系列復雜過程。本文針對圖像中任意大小、位置、姿勢、方向、膚色、面部表情和光照條件的人臉。 3、文字識別系統 在經典的模式識別中,一般是事先提取特徵。提取諸多特徵後,要對這些特徵進行相關性分析,找到最能代表字元的特徵,去掉對分類無關和自相關的特徵。然而,這些特徵的提取太過依賴人的經驗和主觀意識,提取到的特徵的不同對分類性能影響很大,甚至提取的特徵的順序也會影響最後的分類性能。同時,圖像預處理的好壞也會影響到提取的特徵。
D. 深度卷積網路
LeNet網路的結構如下圖所示,可以看出,LeNet網路並沒有使用padding,每進行一次卷積,圖像的高度和寬度都會縮小,而通道數會一直增加。在全連接層中有400個節點,每個極點都有120個神經元,有時還會從這400個節點抽取一部分節點構建一個全連接層,即有兩個全連接層。在該網路中,最後一步就是利用84個特徵得到最後的輸出,該網路剛開始使用的是 sigmoid 函數 tanh 函數,而現在常常傾向於使用 softmax 函數。需要注意的是,LeNet-5網路進行圖像分類時,輸入的圖像是單通道的灰度圖像。
AlexNet是以論文第一作者的名字命名的,該網路的結構,如下圖所示,該網路的輸出層使用了 softmax 函數。AlexNet網路比LeNet網路規模更大,大約有6000萬個參數,用於訓練圖像和數據集時,能夠處理非常相似的基本構造模塊,這些模塊中包含著大量的隱藏單元,並且與LeNet網路不同的是,該網路使用了ReLu的激活函數。
VGG-16網路沒有太多的超參數,這是一種專注於構建卷積層的簡單網路。如下圖所示,該網路首先利用64個過濾器進行了兩次卷積,接著在池化層將輸入圖像壓縮,接著又是128個過濾器進行兩次卷積,接著載池化。繼續用256個過濾器進行3次卷積,再池化,接著再利用512個過濾器卷積3次,再池化,將稍後得到的特徵圖進行全連接操作,再進 softmax 激活。
由於存在梯度消失和梯度爆炸的原因,深層次的神經網路是很難訓練的,如果採用一種跳躍連接的方式,即從某一層網路層獲取激活,然後迅速反饋給另外一層,甚至是神經網路的更深層。這種利用跳躍連接構建的深度神經網路ResNets,深度能夠超過100層
一個簡單的兩層神經網路示例,如下圖所示:
常規的輸出和輸出之間的關系可以用如下的公式表示:
如上公式所述,這是一條神經網路的主路徑。如果將 的輸入直接到深層的激活函數之前,此時,神經網路有了一條副路徑,其對應輸出將有公式(5)變成如下所示的公式(6)
此時的輸入除了原先的輸入 外,多了一個 項,即由於 產生了一個殘差塊。
構建一個ResNet網路就是將很多這樣的殘差塊堆積在一起,形成一個深度神經網路,如下所示:
使用傳統的標准優化演算法訓練一個網路,隨著網路深度的增加,訓練誤差會先減小再增加,隨著網路層數的增加,優化演算法會越難以訓練,訓練誤差也會越來越多。但是,使用ResNet網路,能夠有效地避免這種情況。
如上所述,加入殘差網路之後,其輸出計算公式如公式(6)所示,展開這個公式,則有:
如果使用L2正則化或者權重衰減,則會壓縮權重參數 的值,如果參數 和參數 等於0,其輸出將由公式(7)變成 ,假定使用ReLU激活函數,則有:
由於殘差網路存在的這種跳躍連接,很容易得出以上等式,這意味著,即使給神經網路增加兩層,但是其效率並不遜色與更簡單的神經網路。並且由於存在以上恆等式,使得網路學習隱藏層的單元的信息更加容易。而普通網路,隨著網路層數的增加,學習參數會變得很困難。
此外,關於殘差網路,如公式(6)所示,假設 與 具有相同的維度,由於ResNets使用了許多same卷積, 的維度等於輸出層的維度。如果輸入和輸出具有不同的維度,可以再增加一個矩陣 ,使得 和 具有相同的維度。而 的維度可以通過0值填充調節。
在卷積網路的架構設計中,一種有趣的想法是會使用到1×1的過濾矩陣,實際上,對於單通道的圖像而言,1×1的過濾矩陣,意義不大,但是,對於多通道的圖像而言,1×1的過濾矩陣能夠有效減少圖像卷積之後的通道數量。
根據卷積和池化的基本知識,隨著神經網路層數的增加,圖像的通道數量會逐漸增加,採用1×1的過濾矩陣卷積之後,可以有效減少圖像的通道數量,一個簡單的示例,如下所示:
假設有一個6×6×32的圖片,使用1×1×32的過濾矩陣進行卷積運算,整個運算過程將會遍歷36個單元格,並計算過濾矩陣所覆蓋區域的元素積之和,將其應用到ReLu非線性函數,會得到一個輸出值。此計算過程中,可能會用到多個1×1×32的過濾器,那麼,通過以上計算會得到一個 6×6×過濾器數量 的矩陣。
構建卷積神經網路時,有時會很難決定過濾器的大小,而Inception網路的引入,卻能很好的解決這個問題。
Inception網路的作用就是代替人工確定選擇卷積層的過濾器類型。如下圖所示,對於一個多通道圖像,可以使用不同的過濾矩陣或者池化層,得到不同的輸出,將這些輸出堆積起來。
有了如上圖所示的Inception塊,最終輸出為32+32+64+128=256,而Inception模塊的輸入為28×28×192,其整個計算成本,以5×5的過濾矩陣為例,其乘法的計算次數為:28×28×32×5×5×192,整個計算次數超過了1.2億次。而如果使用如下所示的優化計算方法,則可以有效減少計算量。
如果利用1×1的過濾器,將輸入矩陣的通道減少至16,則可以有效減少計算量,如下所示:
如上圖所示的價格中,整個網路的運算次數為:28×28×192×16+28×28×32×5×5×16=1240萬,整個計算成本降低至原來的十分之一。而,通過1×1×192過濾器卷積得到的這個網路層被稱之為瓶頸層。
如上,所示,可以給每一個非1×1的卷積層之前,加入一個1×1的瓶頸層,就可以構建一個基本的inception模塊了,如下圖所示:
而一個inception網路就是多個Inception模塊連接起來,如下圖所示:
事實上,以上網路中,還存在一些分支,如編號1所示,這些分支就是全連接層,而全連接層之後就是一個softmax層用於預測。又如分支2所示,包含一些隱藏層(編號3),通過全連接層和softmax進行預測。這些分支結構能夠確保,即使是隱藏層和中間層也參與了特徵計算,並且也能夠預測圖片的分類。這種做法能夠有效避免網路過擬合。
對於計算機視覺領域而言,神經網路的訓練可能需要大量的數據,但是當數據量有限時,可以通過數據增強來實現數據量的擴充,以提高系統的魯棒性,具體的數據增強方法如下所示:
除了以上三種數據增強的方法外,更多的數據增強方法和實現可以參考 圖像數據增強
數據增強可以利用計算機多線程實現,一個線程用來實現載入數據,實現數據增強,其他線程可以訓練這些數據以加快整體的運算速度。
E. 卷積神經網路CNN(Convolutional Neural Network)
上圖計算過程為,首先我們可以將右邊進行卷積的可以稱為過濾器也可以叫做核,覆蓋到左邊第一個區域,然後分別按照對應位置相乘再相加,3*1+1*1+2*1+0*0+0*0+0*0+1*(-1)+8*(-1)+2*(-1)=-5;
按照上述的計算方法逐步按右移一個步長(步長可以設定為1,2,...等),然後按往下移,逐漸計算相應的值,得出最終的值。
如上圖顯示,對於第一個圖像矩陣對應的圖,一邊是白色,一邊是黑色,那麼中間就會存在一個垂直的邊緣,我們可以選擇一個垂直邊緣檢測過濾器,如乘法右邊的矩陣,那麼兩者做卷積後得出的圖會顯示如等號右邊的結果矩陣對應的灰度圖中間會有一個白色的中間帶,也就是檢測出來的邊緣,那為什麼感覺中間邊緣帶會比較寬呢?而不是很細的一個局域呢?原因是我們輸入的圖像只有6*6,過於小了,如果我們選擇輸出更大的尺寸的圖,那麼結果來說就是相對的一個細的邊緣檢測帶,也就將我們的垂直邊緣特徵提取出來了。
上述都是人工選擇過濾器的參數,隨著神經網路的發展我們可以利用反向傳播演算法來學習過濾器的參數
我們可以將卷積的顧慮器的數值變成一個參數,通過反向傳播演算法去學習,這樣學到的過濾器或者說卷積核就能夠識別到很多的特徵,而不是依靠手工選擇過濾器。
- padding 操作,卷積經常會出現兩個問題:
1.每經過一次卷積圖像都會縮小,如果卷積層很多的話,後面的圖像就縮的很小了;
2.邊緣像素利用次數只有一次,很明顯少於位於中間的像素,因此會損失邊緣圖像信息。
為了解決上述的問題,我們可以在圖像邊緣填充像素,也就是 padding 操作了。
如果我們設置在圖像邊緣填充的像素數為p,那麼經過卷積後的圖像是:(n+2p-f+1)x(n+2p-f+1).
如何去選擇p呢
通常有兩種選擇:
-Valid:也就是說不填充操作(no padding),因此如果我們有nxn的圖像,fxf的過濾器,那麼我們進行卷積nxn fxf=(n-f+1)x(n-f+1)的輸出圖像;
-Same:也就是填充後是輸出圖像的大小的與輸入相同,同樣就有(n+2p)x(n+2p) fxf=nxn,那麼可以算,n+2p-f+1=n,得到p=(f-1)/2。
通常對於過濾器的選擇有一個默認的准則就是選擇過濾器的尺寸是奇數的過濾器。
- 卷積步長設置(Strided COnvolution)
卷積步長也就是我們進行卷積操作時,過濾器每次移動的步長,上面我們介紹的卷積操作步長默認都是1,也就是說每次移動過濾器時我們是向右移動一格,或者向下移動一格。
但是我們可以對卷積進行步長的設置,也就是我們能夠對卷積移動的格數進行設置。同樣假如我們的圖像是nxn,過濾器是fxf,padding設置是p,步長strided設置為s,那麼我們進行卷積操作後輸出的圖像為((n+2p-f)/s+1)x((n+2p-f)/s+1),那麼這樣就會出現一個問題,如果計算結果不是整數怎麼辦?
一般是選擇向下取整,也就是說明,只有當我們的過濾器完全在圖像上能夠覆蓋時才對它進行計算,這是一個慣例。
實際上上述所述的操作在嚴格數學角度來說不是卷積的定義,卷積的定義上我們計算的時候在移動步長之前也就是對應元素相乘之前是需要對卷積核或者說我們的過濾器進行鏡像操作的,經過鏡像操作後再把對應元素進行相乘這才是嚴格意義上的卷積操作,在數學角度上來說這個操作不算嚴格的卷積操作應該是屬於互相關操作,但是在深度學習領域中,大家按照慣例都省略了反轉操作,也把這個操作叫做卷積操作
我們知道彩色圖像有RGB三個通道,因此對於輸入來說是一個三維的輸入,那麼對三維輸入的圖像如何進行卷積操作呢?
例子,如上圖我們輸入圖像假設為6×6×3,3代表有RGB三個通道channel,或者可以叫depth深度,過濾器的選擇為3×3×3,其中需要規定的是,顧慮器的channel必須與輸入圖像的channel相同,長寬沒有限制,那麼計算過程是,我們將過濾器的立體覆蓋在輸入,這樣對應的27個數對應相乘後相加得到一個數,對應到我們的輸出,因此這樣的方式進行卷積後我們得出的輸出層為4×4×1。如果我們有多個過濾器,比如我們分別用兩個過濾器一個提取垂直特徵,一個提取水平特徵,那麼輸出圖4×4×2 。也就是代表我們輸出的深度或者說通道與過濾器的個數是相等的。
第l層的卷積標記如下:
加入我們的過濾器是3×3×3規格的,如果我們設定10個過濾器,那麼需要學習的參數總數為每個過濾器為27個參數然後加上一個偏差bias那麼每個過濾器的參數為28個,所以十個過濾器的參數為280個。從這里也就可以看出,不管我們輸入的圖片大小是多大,我們都只需要計算這些參數,因此參數共享也就很容易理解了。
為了縮減模型的大小,提高計算速度,同時提高所提取特徵的魯棒性,我們經常會使用池化層。池化層的計算方式與卷積類似,只是我們需要對每一個通道都進行池化操作。
池化的方式一般有兩種:Max Pooling和Average Pooling。
上面為Max Pooling,那麼計算方法與卷積類似,首先設定超參數比如過濾器的大小與步長,然後覆蓋到對應格子上面,用最大值取代其值作為輸出的結果,例如上圖為過濾器選擇2×2,步長選擇為2,因此輸出就是2×2的維度,每個輸出格子都是過濾器對應維度上輸入的最大值。如果為平均池化,那麼就是選擇其間的平均值作為輸出的值。
因此從上面的過程我們看到,通過池化操作能夠縮小模型,同時能讓特徵值更加明顯,也就提高了提取特徵的魯棒性。
F. 卷積神經網路(CNN)基礎
在七月初七情人節,牛郎織女相見的一天,我終於學習了CNN(來自CS231n),感覺感觸良多,所以趕快記下來,別忘了,最後祝大家情人節快樂5555555.正題開始!
CNN一共有卷積層(CONV)、ReLU層(ReLU)、池化層(Pooling)、全連接層(FC(Full Connection))下面是各個層的詳細解釋。
卷積,尤其是圖像的卷積,需要一個濾波器,用濾波器對整個圖像進行遍歷,我們假設有一個32*32*3的原始圖像A,濾波器的尺寸為5*5*3,用w表示,濾波器中的數據就是CNN的參數的一部分,那麼在使用濾波器w對A進行濾波的話,可以用下面的式子表示:
其中x為原始圖像的5*5*3的一部分,b是偏置項置為1。在對A進行濾波之後,產生的是一個28*28*1的數據。那麼假設我們存在6個濾波器,這六個濾波器之間彼此是獨立的,也就是他們內部的數據是不同的且沒有相關性的。可以理解為一個濾波器查找整幅圖像的垂直邊緣,一個查找水平邊緣,一個查找紅色,一個查找黑色這樣。那麼我就可以產生6個28*28*1的數據,將它們組合到一起就可以產生28*28*6的數據,這就是卷積層主要做的工作。
CNN可以看作一系列的卷積層和ReLU層對原始數據結構進行處理的神經網路,處理的過程可以用下面這幅圖表示
特別要注意的是濾波器的深度一定要與上一層傳來的數據的深度相同,就像上圖的第二個卷積層在處理傳來的28*28*6的數據時要使用5*5*6的濾波器.
濾波器在圖像上不斷移動對圖像濾波,自然存在步長的問題,在上面我們舉的例子都是步長為1的情況,如果步長為3的話,32*32*3的圖像經過5*5*3的濾波器卷積得到的大小是(32-5)/3+1=10, 註:步長不能為2因為(32-5)/2+1=14.5是小數。
所以當圖像大小是N,濾波器尺寸為F時,步長S,那麼卷積後大小為(N-F)/S+1
我們從上面的圖中可以看到圖像的長和寬在逐漸的減小,在經過超過5層之後極可能只剩下1*1的空間尺度,這樣是十分不好的,而且也不利於我們接下來的計算,所以我們想讓卷積層處理完之後圖像在空間尺度上大小不變,所以我們引入了pad the border的操作。pad其實就是在圖像周圍補0,擴大圖像的尺寸,使得卷積後圖像大小不變。在CNN中,主要存在4個超參數,濾波器個數K,濾波器大小F,pad大小P和步長S,其中P是整數,當P=1時,對原始數據的操作如圖所示:
那麼在pad操作後卷積後的圖像大小為:(N-F+2*P)/S+1
而要想讓卷積層處理後圖像空間尺度不變,P的值可以設為P=(F-1)/2
卷積層輸入W 1 *H 1 *D 1 大小的數據,輸出W 2 *H 2 *D 2 的數據,此時的卷積層共有4個超參數:
K:濾波器個數
P:pad屬性值
S:濾波器每次移動的步長
F:濾波器尺寸
此時輸出的大小可以用輸入和超參計算得到:
W 2 =(W 1 -F+2P)/S+1
H 2 =(H 1 -F+2P)/S+1
D 2 =D 1
1*1的濾波器也是有意義的,它在深度方向做卷積,例如1*1*64的濾波器對56*56*64的數據卷積得到56*56的數據
F通常是奇數,這樣可以綜合考慮上下左右四個方向的數據。
卷積層從神經元的角度看待可以有兩個性質: 參數共享和局域連接 。對待一個濾波器,例如5*5*3的一個濾波器,對32*32*3的數據卷積得到28*28的數據,可以看作存在28*28個神經元,每個對原圖像5*5*3的區域進行計算,這28*28個神經元由於使用同一個濾波器,所以參數相同,我們稱這一特性為 參數共享 。
針對不同的濾波器,我們可以看到他們會看到同一區域的圖像,相當於在深度方向存在多個神經元,他們看著相同區域叫做 局域連接
參數共享減少了參數的數量,防止了過擬合
局域連接為查找不同特徵更豐富的表現圖像提供了可能。
卷積就像是對原圖像的另一種表達。
激活函數,對於每一個維度經過ReLU函數輸出即可。不改變數據的空間尺度。
通過pad操作,輸出圖像在控制項上並沒有變化,但是深度發生了變化,越來越龐大的數據給計算帶來了困難,也出現了冗餘的特徵,所以需要進行池化操作,池化不改變深度,只改變長寬,主要有最大值和均值兩種方法,一般的池化濾波器大小F為2步長為2,對於最大值池化可以用下面的圖像清晰的表示:
卷積層輸入W 1 *H 1 *D 1 大小的數據,輸出W 2 *H 2 *D 2 的數據,此時的卷積層共有2個超參數:
S:濾波器每次移動的步長
F:濾波器尺寸
此時輸出的大小可以用輸入和超參計算得到:
W 2 =(W 1 -F)/S+1
H 2 =(H 1 -F)/S+1
D 2 =D 1
將最後一層(CONV、ReLU或Pool)處理後的數據輸入全連接層,對於W 2 *H 2 *D 2 數據,我們將其展成1*1*W 2 *H 2 *D 2 大小的數據,輸入層共有W 2 *H 2 *D 2 個神經元,最後根據問題確定輸出層的規模,輸出層可以用softmax表示。也就是說,全連接層就是一個常見的BP神經網路。而這個網路也是參數最多的部分,是接下來想要去掉的部分。完整的神經網路可以用下面的圖表示:
[(CONV-ReLU)*N-POOL?]*M-(FC-RELU)*K,SoftMax
1.更小的濾波器與更深的網路
2.只有CONV層而去掉池化與全鏈接
最早的CNN,用於識別郵編,結構為:
CONV-POOL-CONV-POOL-CONV-FC
濾波器大小5*5,步長為1,池化層2*2,步長為2
2012年由於GPU技術所限,原始AlexNet為兩個GPU分開計算,這里介紹合起來的結構。
輸入圖像為227*227*3
1.首次使用ReLU
2.使用Norm layers,現在已經拋棄,因為效果不大
3.數據經過預處理(例如大小變化,顏色變化等)
4.失活比率0.5
5.batch size 128
6.SGD Momentum 參數0.9(SGD和Momentum見我的其他文章)
7.學習速率 0.01,准確率不在提升時減少10倍,1-2次後達到收斂
8.L2權重減少0.0005
9.錯誤率15.4%
改進自AlexNet,主要改變:
1.CONV1的濾波器從11*11步長S=4改為7*7步長為2.
2.CONV3,4,5濾波器數量有384,384,256改為512,1024,512(濾波器數量為2的n次冪有利於計算機計算可以提高效率)
錯誤率:14.8%後繼續改進至11.2%
當前最好的最易用的CNN網路,所有卷積層濾波器的大小均為3*3,步長為1,pad=1,池化層為2*2的最大值池化,S=2。
主要參數來自全連接層,這也是想要去掉FC的原因。
具有高度的統一性和線性的組合,易於理解,十分方便有VGG-16,VGG-19等多種結構。
錯誤率7.3%
完全移除FC層,參數只有500萬,使用Inception模塊(不太理解,有時間繼續看)
准確率6.67%
准確率3.6%
擁有極深的網路結構,且越深准確率越高。是傳統CNN不具備的特點,傳統CNN並非越深越准確。需要訓練時間較長但是快於VGG
1.每個卷積層使用Batch Normalization
2.Xavier/2初始化
3.SGD+Momentum(0.9)
4.Learning rate:0.1,准確率不變減小10倍(因為Batch Normalization所以比AlexNet大)
5.mini-batch size 256
6.Weight decay of 0.00001
7.不適用失活(因為Batch Normalization)
具體的梯度過程學完ResNet再說吧。