Ⅰ 卷積神經網路(Convolutional Neural Networks, CNN)——更有效率地提取特徵
卷積神經網路(Convolutional Neural Networks, CNN)——更有效率地提取特徵
圖像識別問題本質上就是分類問題,比如我們要區分貓和狗,那麼我們就需要構建一個模型,將照片丟進去後,模型能輸出貓或者狗的概率有多大。在做圖像識別時首要的就是要提取圖片的特徵,那麼如何提取圖片的特徵呢?前面講到了前向全連接網路,我們可以嘗試用前向全連接網路提取。假設圖片的像素是100*100,如果如片是彩色的,每個像素都有RGB三種顏色的數值。因此,一張圖片是有一個三維向量構成的,一維是長100,一維是寬100,還有一維是R、G、B 3個通道(channels)。把這個三維向量拉直作為一個一維向量,長度就是100*100*3。
我們在區分一張圖片時,我們觀察的往往是圖片的局部的、最重要的特徵。 比如圖片上是一隻鳥,我們可能通過嘴巴、眼睛、爪子等就可以判斷出是一隻鳥了。因此,輸入層的每一個神經元沒有必要看圖片的全局,只需要看一個局部就行了。
在兩張不同的圖片上,同一個特徵區域可能處於不同位置。 比如鳥嘴的局部特徵區域在下面這兩張圖上就處在不同的位置上。那麼如何才能讓兩個不同的神經元在看到這兩個不同的感受野時,能產生一致的特徵值呢?
對上面的內容進行一個總結:
(1)我們設置一個局部感受野,假設感受野的大小為W*H*C,其中W表示感受野的寬度,H表示感受野的高度,C表示感受野的通道數。那麼對應的神經元的參數的個數就為:W*H*C個權值加1個偏置。在卷積神經網路中,我們稱這樣一個神經元為一個 濾波器(filter) 。
(3)我們通過滑動的方式讓感受野鋪滿整個圖片,假設圖片的尺寸是W1*H1*C,滑動步長為S,零填充的數量為P。假設感受野的個數是W2*H2,其中,
(4)我們讓所有感受野的觀測濾波器參數進行共享,即相當於一個濾波器通過滑動掃描的方式掃描了所有感受野。
(5)我們設置多個濾波器,假設濾波器的個數為K,這K個濾波器都通過滑動掃描的方式掃過整個圖片。此時參數的個數為:(W*H*C+1)*K。
(6)由於每個濾波器每經過一個感受野都會進行一次計算輸出一個值,所以輸出的維度為:W2*H2*K。我們將這個輸出稱為特徵圖,所以特徵圖寬度為W2,高度為H2,通道數C2=K。
舉個例子: 假設某個圖片的大小是100*100*3,設置濾波器的大小為3*3*3,濾波器的個數為64,設置步長S=1,設置零填充的數量為P=0。那麼卷積神經網路的參數為, 相比前向全連接 個參數,參數的個數縮小了幾個數量級。
輸出特徵圖的寬度和高度均為, 輸出特徵圖的通道數為, 所以輸出特徵圖的維度為98*98*64。
如果在上面輸出的基礎上再疊加一層卷積神經網路,濾波器的設置寬和高可以不變,但是通道數不再是3了,而是變成64了,因為輸入特徵圖的通道數已經變64了。假設濾波器的大小為3*3*64,濾波器的個數為32,設置步長S=1,設置零填充的數量為P=0。可以計算出來,新的輸出特徵圖的維度是96*96*32。
以上就是卷積神經網路(CNN)的解析。但是CNN一般不是單獨用的,因為一般提取圖片的特徵是為了分類,還需要進一步處理,常見的形式如下圖所示。
Ⅱ 用於圖像分割的CNN
姓名:閆偉 學號:15020150038
【嵌牛導讀】:在計算機視覺領域,圖像分割指的是為圖像中的每個像素分配一個標簽的任務,它也可以被看作是dense prediction task,對圖像中每個像素進行分類。和使用矩形候選框的目標檢測不同,圖像分割需要精確到像素級位置,因此它在醫學分析、衛星圖像物體檢測、虹膜識別和自動駕駛汽車等任務中起著非常重要的作用。
【嵌牛鼻子】:圖像分割 CNN 語義分割
【嵌牛提問】:如何利用CNN對圖像進行分割?
【嵌牛正文】:
隨著深度學習的不斷發展,近年來圖像分割技術也在速度和准確率上迎來了一次次突破。現在,我們能在幾分之一秒內完成分割,同時保證極高的准確性。在這篇文章中,我們將介紹一些用於圖像分割的主要技術及其背後的簡單思路。我們將從最基礎的語義分割(semantic segmentation)開始,慢慢進階到更復雜的實例分割(instance segmentation)。
目標檢測、語義分割和實例分割
語義分割
語義圖像分割是為圖像中的每個像素分配語義類別標簽的任務,它不分割對象實例。現在,處理這類任務的主流方法是FCN及其衍生,所以我們先從FCN看起。
全卷積網路(FCN)
FCN架構
創建FCN的方法很簡單,我們只需把CNN里的所有全連接層替換成寬高1×1的卷積層,這時卷積層的filter數量等於全連接層的神經元(輸出)數量,所有層都是卷積層,故稱全卷積網路。之所以要這么做,是因為每個像素的空間位置對於分割來說都很重要,而卷積層能分類全連接層無法處理的單個像素。作為處理結果,神經網路較高層中的位置會對應於它們路徑連接的圖像中的位置,即它們的感受野。
如上圖所示,FCN的架構非常簡單,主要由編碼器CNN(以VGG為例)構成,只不過其中和分類網路對應的最後三層被改成了(4096,1,1)(4096,1,1)(N+1,1,1)的卷積層(N表示類別數量)。編碼器後是一個解碼器網路,它只包含一個反向的卷積層(也稱為轉置卷積transposed convolution或反卷積deconvolution)。它的輸出與輸入圖像具有相同的空間維度,並具有N+1個通道,每個通道預測一個類別。
反向的卷積操作
仍以VGG為例,由於前面采樣部分過大,有時候會導致後面進行反向卷積操作得到的結果解析度較低,會出現細節丟失等問題。為此,FCN的解決方法是疊加第三、四、五層池化層的特徵,以生成更精準的邊界分割。如下圖所示:
需要注意的一點是,在進行上采樣之前,所有池化特徵都會先通過(N+1,1,1)這個卷積層。
FCN分割效果
U-NET
U-NET架構
U-NET常被用於生物醫學圖像分割,它遵循了FCN的編碼器-解碼器結構,不使用任何全連接層。如上圖所示,常規情況下,U-NET的編碼器是一個包含10個卷積層的CNN,中間包含最大池化層(紅色箭頭)。它的解碼器會對feature map進行多次上采樣和卷積,目的是為了提取更高效、更抽象的特徵。得到heatmap後,U-NET最後再用1×1的卷積層做分類,也就是說解碼器一共有13層,整個架構總共由23層可學習的卷積層組成。
為什麼要做上采樣?
答:池化層會丟失圖像信息和降低圖像解析度且是不可逆的操作,對圖像分割任務有一些影響。上采樣可以補足一些圖片的信息,但是信息補充的肯定不完全,所以還需要與左邊的解析度比較高的圖片相連接起來(直接復制過來再裁剪到與上采樣圖片一樣大小),這就相當於在高解析度和更抽象特徵當中做一個折衷,因為隨著卷積次數增多,提取的特徵也更加有效,更加抽象。—— jianyuchen23
SEGNET
SegNet架構
SegNet的全稱是「用於圖像分割的深度卷積編碼器-解碼器架構」,事實上,大多數語義分割方法都遵循這種基本架構,它們的編碼器都是用VGG16,解碼器都仿照U-NET——多次上采樣後再卷積。但是,SegNet有自己獨到的特點:
上采樣是不可學習的
解碼器使用和編碼器相同的卷積(filter大小和相應層的通道數量)
SegNet中的上采樣是一種反向最大池化操作。為了補足圖像信息,U-NET會對編碼階段的特徵做通道降維,再把它和特徵反向卷積後得到上采樣進行相加,這一過程需要學習。而SegNet採用的方法是記錄下編碼階段的最大池化index,比如在某層移動2×2的最大池化窗口時最高值像素的位置,然後把這個index用於解碼階段的上采樣。空白的值用0填充:
SegNet上采樣
在這個稀疏feature map進行正常卷積後,我們就能得到密集feature map。因此相比較FCN,SegNet的內存利用率更高,計算效率也更高。
需要注意的是,一般來說,解碼器每一層的輸入通道數和feature map大小都與其對應的編碼器相同,但第一層不是。編碼器的第一層都3個輸入通道(RGB),但解碼器第一層有更多通道,這是為了給每個類別生成分割掩膜。
用SegNet進行道路場景分割
實例分割
所謂實例分割,指的就是結合了語義分割和分類的任務。它在本質上更復雜,因為為了區分同一類的不同實例,我們往往需要為每個獨立對象創建單獨的、縮小的掩膜,然後再把它的大小調整為輸入圖像中對象的大小。
下面是實例分割的一些常用方法。
DEEPMASK
DeepMask架構
DeepMask是FAIR於2015年提出的一種實例分割方法,輸入一張圖片後,它能為子圖像塊(image patch)中的對象生成56×56的分割掩膜,並以掩膜為中心進行分類。對於圖像的子圖像塊,它有兩個約束:
子圖像塊中必須包含一個大致居中的對象
這個對象必須被完整包含在子圖像塊中,且在給定的比例范圍內
由於DeepMask一次只能為子圖像塊分割一個對象,當它處理包含復雜、重復對象的圖像時,它會在多個位置以多個比例密集應用。鑒於以上兩個約束條件,這是可以理解的,也是必要的。
整個模型由VGG-A構成,它保留了兩個全連接層,但刪去了最後一個最大池化層,共有8個卷積層和4個池化層。模型輸出的下采樣因子為16,共有2個輸出,一是子圖像塊對應物體的一個掩膜,二是這個子圖像塊包含一個物體的得分。
DeepMask分割效果
Multi-task Network Cascades(MNC)
MNC架構,右上為簡化原理圖
MNC不直接進行實例分割,它把這個任務分成了三個更小、更簡單的子任務:
區分實例。這個子任務的目標是為每個實例預測候選框和候選框是否包含對象的概率;
估計掩膜。這個子任務的目標是預測對象的像素級掩膜;
對對象進行分類。這個子任務的目標是為每個掩膜級實例預測類別標簽。
這三個子任務不是並行執行的,它們要按照順序一個個完成,這也是MNC的全稱「多任務網路級聯」的原因。模型用移除了所有全連接層的VGG-16處理輸入圖像,生成feature map,作為三個子任務的共用數據。
子任務1:預測實例候選框
首先,神經網路以窗口的形式提取對象實例,這些候選框不包含分類預測信息,但有一個包含/不包含對象的概率。這是個全卷積的子網路,結構類似RPN。
子任務2:估計實例掩膜
基於子任務1返回的候選框預測,模型再用ROI pooling從共享卷積特徵中提取該候選框的特徵,之後是兩個全連接層(fc),第一個fc負責把維度降到256, 第二個fc負責回歸像素級的掩膜。掩膜的預定義解析度是M×M,這和DeepMask中使用的預測方法有些類似,但不同的是MNC只從幾個候選框中回歸掩膜,計算成本大大降低。
子任務3:對實例進行分類
現在模型有了子任務1給出的候選框預測,也有了子任務2用ROI pooling提取的feature map,之後就是基於掩膜和候選框預測實例類別。
這是兩條並行路徑。在基於掩膜的路徑中,ROI提取的feature map被子任務2預測的掩膜「覆蓋」,使模型更關注預測掩膜的前景特徵,計算乘積後,將特徵輸入兩路4096維的fc層。在基於候選框的路徑中,用ROI pooling提取的特徵被直接傳遞到4096維的fc層(圖中未畫出),目的是為了解決特徵大幅被掩模級通道「覆蓋」的情況(如目標對象很大)。之後,基於掩膜和基於候選框的路徑被連接起來,緊接著是N+1類的Softmax分類器,其中N類是物體,1類是背景。
MNC分割效果
即便是這么復雜的架構,整個網路也是可以端到端訓練的。
INSTANCEFCN
InstanceFCN是FCN的改進版,它不僅在語義分割任務上表現出色,在實例分割上也有不錯的結果。之前我們提到過,FCN的每個輸出像素是一個類別的分類器,那麼InstanceFCN的每個輸出像素就是實例相對位置的分類器。例如,下圖被分為9塊區域,在其中的第6個得分圖中,每個像素就是對象是否在實例右側的分類器。
試想一下,如果圖像中只有一個實例,分割過程會很簡單;如果有多個重疊實例,那麼我們就得先區分實例,然後再進行分割。相比FCN,InstanceFCN的最大改進是引入相對位置,它在輸入圖像上生成k2實例敏感分數圖,每個分數圖對應於特定的相對位置,這就實現了相同位置不同語義的預測。
為了從這些分數圖上生成圖像實例,InstanceFCN在這組分數圖上用了一個m×m的滑動窗口。在這個滑動窗中,每一個m/k×m/k的子窗口直接從相應的分數圖中同樣的子窗口復制那一部分數值。之後這組子窗口按照相對位置拼起來就得到了m×m的結果。 這一部分被稱為實例組合模塊(instance assembling mole) 。
模型的架構包括在輸入圖像上用VGG-16做特徵提取。在輸出的feature map頂部,有兩個全卷積分支:一個用來估計分割實例(如上所述),另一個用來對實例進行評分。
InstanceFCN架構
如上圖所示,對於第一個分支,模型先採用一個512維的1×1卷積層轉換特徵,然後用3x3的卷積層生成一組k2實例敏感分數圖。這個實例組合模塊負責在解析度為m×m(m=21)的滑動窗中預測分割掩膜。
對於第二個分支,模型先採用一個512維的3×3卷積層,後面跟隨一個1x1的卷積層。這個1x1的卷積層是逐像素的邏輯回歸,用於分類以像素為中心的m×m滑動窗口中的對象是/不是實例。因此,這個分支的輸出是對象分數圖,其中一個分數對應於生成一個實例的一個滑動窗口,所以它對不同的對象類別會「視而不見」。
InstanceFCN分割效果
FCIS
正如InstanceFCN是對FCN的改進,完全卷積實例感知語義分割(FCIS)也是在InstanceFCN基礎上做出的進一步優化。上節我們說道,InstanceFCN預測分割掩膜的解析度都是m×m,而且沒法將對象分類為不同類別。FCIS解決了這兩個問題,它既能預測不同解析度的掩膜,也能預測不同的對象類別。
FCIS實例敏感分數圖
給定ROI,首先用InstanceFCN的實例組合模塊生成上述分數圖。對於ROI中的每個像素,有兩個任務(所以要生成兩個分數圖):
檢測:它是否在某相對位置的對象檢測候選框內,是(detection+),否(detection-)
分割:它是否在對象實例的邊界內,是(segmentation+),否(segmentation-)
基於上述任務,這時出現了三種情況:
內部得分高,外部得分低:detection+,segmentation+(像素點位於ROI中的目標部分)
內部得分低,外部得分高:detection+,segmentation-(像素點位於ROI中的背景部分)
兩個得分都很低:detection-,segmentation-(像素點不在ROI中)
對於檢測,我們可以用取最大值把前兩種情況(detection+)和情況3(detection-)區分開。整個ROI的得分是求取最大值得到分數圖的所有值的平均數,之後再通過一個softmax分類器。對於分割,softmax可以區分情況1(segmentation+)和其他情況(segmentation-)。ROI的前景掩膜是每個類別每個像素分割分數的合並。
FCIS架構
FCIS分割效果
MASK R-CNN
MASK R-CNN是目標檢測模型Faster R-CNN的進階版,它在後者候選框提取的基礎上添加了一個並行的分支網路,用預測分割掩膜。這個分支網路是個共享feature map的FCN,它為每個ROI提供Km2 維的輸出,其中K對應類別個數,即輸出K個掩膜,m對應池化解析度。這樣的設計允許網路為每個類別生成掩膜,避免了不同類實例之間因重疊產生混淆。此外,分類分支是直接在掩膜上分類,所以分割和分類是分離的。
Mask R-CNN架構中用於預測掩膜的分支
關注輸入圖像的空間結構是准確預測掩膜的前提,而這種像素到像素的操作需要ROI特徵的完全對齊。在目標檢測任務中,一些模型會用RoIPool提取這些特徵,但它們不總是嚴格對齊的,因為ROI的維度不僅可以是積分,也可以是浮點數。RoIPool通過將它們四捨五入到最接近的整數來量化這些維度,不僅如此,量化的RoI還被進一步細分為量化的空間區間,在該區間上執行合並。雖然這些量化對分類問題沒什麼影響,但如果把它們用於像素級對齊,分割掩膜預測會出現巨大偏差。
RoIAlign: 虛線網格表示feature map,實線表示RoI(有2×2個bin,每個bin中4個采樣點)
考慮到實例分割要求像素級別的精準,MASK R-CNN引入了一種新的方法來提取特徵,稱為RoIAlign。它背後的想法是很簡單:既然錯位是由量化引起的,那就避免所有量化。RoIAlign不會對維度做任何約減,它引入了一個插值過程,先通過雙線性插值到14×14,再池化到7×7,很大程度上解決了由直接池化采樣造成的Misalignment對齊問題。需要注意的是,使用RoIAlign提取的RoI特徵具有固定的空間維度,這點和RoIPool一樣。
小結
以上就是現在常用的語義分割、實例分割模型,它們基本上都是FCN的變體,把編碼器作為簡單的特徵提取器,重點放在解碼器創新上。此外,一些研究人員也嘗試過用其他方法來解決實例分割問題,比如上面提到的MASK R-CNN就是改造目標檢測模型的成果,總而言之,FCN還是解決這類任務的重要基石。
譯者的話:以上只是簡短的關鍵提煉,如果讀者希望了解這些模型的具體細節,可以參考文末推薦的幾篇中文論文解讀,點擊閱讀原文獲取超鏈接。
參考文獻
[1] J. Long, E. Shelhamer, and T. D ar rell. Fully convolutional networks for semantic segmentation. In CVPR, 2015. (paper)
[2] O. Ronneberger, P. Fischer, and T. Brox, 「U-net: Convolutional networks for biomedical image segmentation,」 in MICCAI, pp. 234–241, Springer, 2015. (paper)
[3] Badrinarayanan, V., Kendall, A., & Cipolla, R. (2017). SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation. IEEE Transactions on Pattern Analysis and Machine Intelligence, 39, 2481-2495. (paper)
[4] P. O. Pinheiro, R. Collobert, and P. Dollar. Learning to segment object candidates. In NIPS, 2015. (paper)
[5] Dai, J., He, K., Sun, J. Instance-aware semantic segmentation via multi-task network cascades. In CVPR., 2016. (paper)
[6] J. Dai, K. He, Y. Li, S. Ren, and J. Sun. Instance-sensitive fully convolutional networks. In ECCV, 2016. (paper)
[7] Y. Li, H. Qi, J. Dai, X. Ji, and Y. Wei. Fully convolutional instance-aware semantic segmentation. In CVPR, 2017. (paper)
[8] K He, G Gkioxari, P Dollár, R Girshick. Mask R-CNN. In ICCV, 2017. (paper)
編譯參考
[1] jianyuchen23—— U-Net論文詳解
[2] DelphiFan』s Blog—— 語義分割論文-SegNet
[3] Elaine_Bao—— 物體檢測與分割系列 DeepMask
[4] AHU-WangXiao—— Instance-aware Semantic Segmentation via Multi-task Network Cascades
[5] Tina』s Blog—— InstanceFCN:Instance-sensitive Fully Convolutional Networks
[6] 技術挖掘者—— Mask R-CNN詳解
Ⅲ 為什麼全連接神經網路在圖像識別中不如卷積神經網路
輸入數據是n*n的像素矩陣,再使用全連接神經網路,那麼參數的個數會是指數級的增長,需要訓練的數據太多。
而CNN的話,可以通過共享同一個參數,來提取特定方向上的特徵,所以訓練量將比全連接神經網路小了很多。
Ⅳ CNN原理解析
然後通過CNN的可視化可知,CNN識別物體是通過從局部到整體到實現的,CNN識別了局部的特徵之後,以及局部特徵的相對應的位置,就可以拼湊起來,對整體進行識別。
CNN是由卷積層,采樣層和全連接層構成的,大致過程是這樣的:
對於一個輸入的圖片,只考慮一個通道的話,為一個二維矩陣,以下圖為例,一個5*5的圖像,經過一個3*3的filter,得到了一個3*3的結果,運算的過程是這樣的:藍色框中的3*3的矩陣和filter進行運算,得到了結果矩陣中的那個藍色的4,運算的方式就是每個相同位置的值相乘,然後把九個數加起來即可。然後卷積核右移一個單位,與紅框中的九個數進行運算,得到結果中的紅色的3,依次這么右移和下移計算即可得到最終的結果,
下面是一個動圖,可以更直觀反映:
實際上,輸入的圖片一般為RGB格式,即三通道,那麼一次需要三個卷積核,
卷積的計算公式:輸入一個圖片後,結果卷積,輸出的結果與原圖片和卷積核的大小存在一定的聯系,先介紹幾個概念:
下面給出公式:
其中:
實際上,僅僅是這樣的一個簡單的操作,可以讓我們的效率大大提高,其優點如下:
參考:
卷積神經網路(CNN)入門講解
卷積神經網路(Convolutional Neural Networks,CNN)
Ⅳ 神經網路:卷積神經網路(CNN)
神經網路 最早是由心理學家和神經學家提出的,旨在尋求開發和測試神經的計算模擬。
粗略地說, 神經網路 是一組連接的 輸入/輸出單元 ,其中每個連接都與一個 權 相關聯。在學習階段,通過調整權值,使得神經網路的預測准確性逐步提高。由於單元之間的連接,神經網路學習又稱 連接者學習。
神經網路是以模擬人腦神經元的數學模型為基礎而建立的,它由一系列神經元組成,單元之間彼此連接。從信息處理角度看,神經元可以看作是一個多輸入單輸出的信息處理單元,根據神經元的特性和功能,可以把神經元抽象成一個簡單的數學模型。
神經網路有三個要素: 拓撲結構、連接方式、學習規則
神經網路的拓撲結構 :神經網路的單元通常按照層次排列,根據網路的層次數,可以將神經網路分為單層神經網路、兩層神經網路、三層神經網路等。結構簡單的神經網路,在學習時收斂的速度快,但准確度低。
神經網路的層數和每層的單元數由問題的復雜程度而定。問題越復雜,神經網路的層數就越多。例如,兩層神經網路常用來解決線性問題,而多層網路就可以解決多元非線性問題
神經網路的連接 :包括層次之間的連接和每一層內部的連接,連接的強度用權來表示。
根據層次之間的連接方式,分為:
1)前饋式網路:連接是單向的,上層單元的輸出是下層單元的輸入,如反向傳播網路,Kohonen網路
2)反饋式網路:除了單項的連接外,還把最後一層單元的輸出作為第一層單元的輸入,如Hopfield網路
根據連接的范圍,分為:
1)全連接神經網路:每個單元和相鄰層上的所有單元相連
2)局部連接網路:每個單元只和相鄰層上的部分單元相連
神經網路的學習
根據學習方法分:
感知器:有監督的學習方法,訓練樣本的類別是已知的,並在學習的過程中指導模型的訓練
認知器:無監督的學習方法,訓練樣本類別未知,各單元通過競爭學習。
根據學習時間分:
離線網路:學習過程和使用過程是獨立的
在線網路:學習過程和使用過程是同時進行的
根據學習規則分:
相關學習網路:根據連接間的激活水平改變權系數
糾錯學習網路:根據輸出單元的外部反饋改變權系數
自組織學習網路:對輸入進行自適應地學習
摘自《數學之美》對人工神經網路的通俗理解:
神經網路種類很多,常用的有如下四種:
1)Hopfield網路,典型的反饋網路,結構單層,有相同的單元組成
2)反向傳播網路,前饋網路,結構多層,採用最小均方差的糾錯學習規則,常用於語言識別和分類等問題
3)Kohonen網路:典型的自組織網路,由輸入層和輸出層構成,全連接
4)ART網路:自組織網路
深度神經網路:
Convolutional Neural Networks(CNN)卷積神經網路
Recurrent neural Network(RNN)循環神經網路
Deep Belief Networks(DBN)深度信念網路
深度學習是指多層神經網路上運用各種機器學習演算法解決圖像,文本等各種問題的演算法集合。深度學習從大類上可以歸入神經網路,不過在具體實現上有許多變化。
深度學習的核心是特徵學習,旨在通過分層網路獲取分層次的特徵信息,從而解決以往需要人工設計特徵的重要難題。
Machine Learning vs. Deep Learning
神經網路(主要是感知器)經常用於 分類
神經網路的分類知識體現在網路連接上,被隱式地存儲在連接的權值中。
神經網路的學習就是通過迭代演算法,對權值逐步修改的優化過程,學習的目標就是通過改變權值使訓練集的樣本都能被正確分類。
神經網路特別適用於下列情況的分類問題:
1) 數據量比較小,缺少足夠的樣本建立模型
2) 數據的結構難以用傳統的統計方法來描述
3) 分類模型難以表示為傳統的統計模型
缺點:
1) 需要很長的訓練時間,因而對於有足夠長訓練時間的應用更合適。
2) 需要大量的參數,這些通常主要靠經驗確定,如網路拓撲或「結構」。
3) 可解釋性差 。該特點使得神經網路在數據挖掘的初期並不看好。
優點:
1) 分類的准確度高
2)並行分布處理能力強
3)分布存儲及學習能力高
4)對噪音數據有很強的魯棒性和容錯能力
最流行的基於神經網路的分類演算法是80年代提出的 後向傳播演算法 。後向傳播演算法在多路前饋神經網路上學習。
定義網路拓撲
在開始訓練之前,用戶必須說明輸入層的單元數、隱藏層數(如果多於一層)、每一隱藏層的單元數和輸出層的單元數,以確定網路拓撲。
對訓練樣本中每個屬性的值進行規格化將有助於加快學習過程。通常,對輸入值規格化,使得它們落入0.0和1.0之間。
離散值屬性可以重新編碼,使得每個域值一個輸入單元。例如,如果屬性A的定義域為(a0,a1,a2),則可以分配三個輸入單元表示A。即,我們可以用I0 ,I1 ,I2作為輸入單元。每個單元初始化為0。如果A = a0,則I0置為1;如果A = a1,I1置1;如此下去。
一個輸出單元可以用來表示兩個類(值1代表一個類,而值0代表另一個)。如果多於兩個類,則每個類使用一個輸出單元。
隱藏層單元數設多少個「最好」 ,沒有明確的規則。
網路設計是一個實驗過程,並可能影響准確性。權的初值也可能影響准確性。如果某個經過訓練的網路的准確率太低,則通常需要採用不同的網路拓撲或使用不同的初始權值,重復進行訓練。
後向傳播演算法學習過程:
迭代地處理一組訓練樣本,將每個樣本的網路預測與實際的類標號比較。
每次迭代後,修改權值,使得網路預測和實際類之間的均方差最小。
這種修改「後向」進行。即,由輸出層,經由每個隱藏層,到第一個隱藏層(因此稱作後向傳播)。盡管不能保證,一般地,權將最終收斂,學習過程停止。
演算法終止條件:訓練集中被正確分類的樣本達到一定的比例,或者權系數趨近穩定。
後向傳播演算法分為如下幾步:
1) 初始化權
網路的權通常被初始化為很小的隨機數(例如,范圍從-1.0到1.0,或從-0.5到0.5)。
每個單元都設有一個偏置(bias),偏置也被初始化為小隨機數。
2) 向前傳播輸入
對於每一個樣本X,重復下面兩步:
向前傳播輸入,向後傳播誤差
計算各層每個單元的輸入和輸出。輸入層:輸出=輸入=樣本X的屬性;即,對於單元j,Oj = Ij = Xj。隱藏層和輸出層:輸入=前一層的輸出的線性組合,即,對於單元j, Ij =wij Oi + θj,輸出=
3) 向後傳播誤差
計算各層每個單元的誤差。
輸出層單元j,誤差:
Oj是單元j的實際輸出,而Tj是j的真正輸出。
隱藏層單元j,誤差:
wjk是由j到下一層中單元k的連接的權,Errk是單元k的誤差
更新 權 和 偏差 ,以反映傳播的誤差。
權由下式更新:
其中,△wij是權wij的改變。l是學習率,通常取0和1之間的值。
偏置由下式更新:
其中,△θj是偏置θj的改變。
Example
人類視覺原理:
深度學習的許多研究成果,離不開對大腦認知原理的研究,尤其是視覺原理的研究。1981 年的諾貝爾醫學獎,頒發給了 David Hubel(出生於加拿大的美國神經生物學家) 和Torsten Wiesel,以及Roger Sperry。前兩位的主要貢獻,是「發現了視覺系統的信息處理」, 可視皮層是分級的 。
人類的視覺原理如下:從原始信號攝入開始(瞳孔攝入像素Pixels),接著做初步處理(大腦皮層某些細胞發現邊緣和方向),然後抽象(大腦判定,眼前的物體的形狀,是圓形的),然後進一步抽象(大腦進一步判定該物體是只氣球)。
對於不同的物體,人類視覺也是通過這樣逐層分級,來進行認知的:
在最底層特徵基本上是類似的,就是各種邊緣,越往上,越能提取出此類物體的一些特徵(輪子、眼睛、軀乾等),到最上層,不同的高級特徵最終組合成相應的圖像,從而能夠讓人類准確的區分不同的物體。
可以很自然的想到:可以不可以模仿人類大腦的這個特點,構造多層的神經網路,較低層的識別初級的圖像特徵,若干底層特徵組成更上一層特徵,最終通過多個層級的組合,最終在頂層做出分類呢?答案是肯定的,這也是許多深度學習演算法(包括CNN)的靈感來源。
卷積神經網路是一種多層神經網路,擅長處理圖像特別是大圖像的相關機器學習問題。卷積網路通過一系列方法,成功將數據量龐大的圖像識別問題不斷降維,最終使其能夠被訓練。
CNN最早由Yann LeCun提出並應用在手寫字體識別上。LeCun提出的網路稱為LeNet,其網路結構如下:
這是一個最典型的卷積網路,由 卷積層、池化層、全連接層 組成。其中卷積層與池化層配合,組成多個卷積組,逐層提取特徵,最終通過若干個全連接層完成分類。
CNN通過卷積來模擬特徵區分,並且通過卷積的權值共享及池化,來降低網路參數的數量級,最後通過傳統神經網路完成分類等任務。
降低參數量級:如果使用傳統神經網路方式,對一張圖片進行分類,那麼,把圖片的每個像素都連接到隱藏層節點上,對於一張1000x1000像素的圖片,如果有1M隱藏層單元,一共有10^12個參數,這顯然是不能接受的。
但是在CNN里,可以大大減少參數個數,基於以下兩個假設:
1)最底層特徵都是局部性的,也就是說,用10x10這樣大小的過濾器就能表示邊緣等底層特徵
2)圖像上不同小片段,以及不同圖像上的小片段的特徵是類似的,也就是說,能用同樣的一組分類器來描述各種各樣不同的圖像
基於以上兩個假設,就能把第一層網路結構簡化
用100個10x10的小過濾器,就能夠描述整幅圖片上的底層特徵。
卷積運算的定義如下圖所示:
如上圖所示,一個5x5的圖像,用一個3x3的 卷積核 :
101
010
101
來對圖像進行卷積操作(可以理解為有一個滑動窗口,把卷積核與對應的圖像像素做乘積然後求和),得到了3x3的卷積結果。
這個過程可以理解為使用一個過濾器(卷積核)來過濾圖像的各個小區域,從而得到這些小區域的特徵值。在實際訓練過程中, 卷積核的值是在學習過程中學到的。
在具體應用中,往往有多個卷積核,可以認為, 每個卷積核代表了一種圖像模式 ,如果某個圖像塊與此卷積核卷積出的值大,則認為此圖像塊十分接近於此卷積核。如果設計了6個卷積核,可以理解為這個圖像上有6種底層紋理模式,也就是用6種基礎模式就能描繪出一副圖像。以下就是24種不同的卷積核的示例:
池化 的過程如下圖所示:
可以看到,原始圖片是20x20的,對其進行采樣,采樣窗口為10x10,最終將其采樣成為一個2x2大小的特徵圖。
之所以這么做,是因為即使做完了卷積,圖像仍然很大(因為卷積核比較小),所以為了降低數據維度,就進行采樣。
即使減少了許多數據,特徵的統計屬性仍能夠描述圖像,而且由於降低了數據維度,有效地避免了過擬合。
在實際應用中,分為最大值采樣(Max-Pooling)與平均值采樣(Mean-Pooling)。
LeNet網路結構:
注意,上圖中S2與C3的連接方式並不是全連接,而是部分連接。最後,通過全連接層C5、F6得到10個輸出,對應10個數字的概率。
卷積神經網路的訓練過程與傳統神經網路類似,也是參照了反向傳播演算法
第一階段,向前傳播階段:
a)從樣本集中取一個樣本(X,Yp),將X輸入網路;
b)計算相應的實際輸出Op
第二階段,向後傳播階段
a)計算實際輸出Op與相應的理想輸出Yp的差;
b)按極小化誤差的方法反向傳播調整權矩陣。
Ⅵ 從R-CNN到Faster R-CNN
論文: 《Rich feature hierarchies for accurate object detection and semantic segmentation》
發表年份:2013
RCNN(Regions with CNN features)是將CNN用到目標檢測的一個里程碑,藉助CNN良好的特徵提取和分類性能,通過RegionProposal方法實現目標檢測問題的轉化。
Region proposal是一類傳統的候選區域生成方法,論文使用 selective search 生成大約2k個候選區域(先用分割手段將圖片完全分割成小圖,再通過一些合並規則,將小圖均勻的合並,經過若干次合並,直到合並成整張原圖),然後將proposal的圖片進行歸一化(大小為217*217)用於CNN的輸入。
對每個Region proposal使用CNN提取出一個4096維的特徵向量
3.1 CNN提取的特徵輸入到SVM分類器中,對region proposal進行分類,與 ground-truth box的IoU大於0.5的為正樣本,其餘為負樣本。論文中每個圖片正樣本個數為32負樣本個數為96。得到所有region proposals的對於每一類的分數,再使用貪心的非極大值抑制方法對每一個SVM分類器類去除相交的多餘的框。
3.2 使用一個線性回歸器對bounding box進行修正,proposal bounding box的大小位置與真實框的轉換關系如下:
綜上,整個網路結構如下:
R-CNN在當年無論是在學術界還是工業界都是具有創造性的,但是現在來看RCNN主要存在下面三個問題:
1)多個候選區域對應的圖像需要預先提取,佔用較大的磁碟空間;
2)針對傳統CNN需要固定尺寸(217*217)的輸入圖像,crop/warp(歸一化)產生物體截斷或拉伸,喪失或者改變了圖片本身的信息;
3)每一個ProposalRegion都需要進入CNN網路計算,上千個Region存在大量的范圍重疊,重復的CNN特徵提取導致巨大的計算浪費。
論文: 《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》
發表年份:2015
既然CNN特徵提取如此耗時,為什麼還要對每個Region proposal進行特徵提取,而不是整體進行特徵提取,然後在分類之前做一次Region的截取呢,於是就誕生了SPP-Net。
1.解決了CNN需要固定大小輸入的變換後導致圖片信息丟失或者變化的問題
2.對於一張圖,只需要進行一次的特徵提取運算,避免了R-CNN中特徵重復計算的問題
CNN為什麼需要固定大小的輸入?
R-CNN中會對圖片縮放成217*217的固定大小,從而導致物體發生形變(如下圖的上部分所示)。與前面不同,SPP-Net是加在最後一個卷積層的輸出的後面,使得不同輸入尺寸的圖像在經過前面的卷積池化過程後,再經過SPP-net,得到相同大小的feature map,最後再經過全連接層進行分類
以AlexNet為例,經CNN得到conv5輸出的任意尺寸的feature map,圖中256-d是conv5卷積核的數量。將最後一個池化層pool5替換成SPP layer,將feature map劃分成不同大小的網格,分別是`4x4`,`2x2`,`1x1`,每個網格中經過max pooling,從而得到4x4+2x2+1x1=21個特徵值,最後將這21個特徵值平鋪成一個特徵向量作為全連接層的輸入,這種方式就是 空間金字塔池化 。
與R-CNN不同,SPP-Net中是將整張圖片進行一次特徵提取,得到整張圖片的feature map,然後對feature map中的候選區域(RoIs)經過空間金字塔池化,提取出固定長度的特徵向量進入全連接層。
原圖候選區域與特徵圖上的RoIs的轉換流程:
綜上,整個網路結構如下圖。SPP-Net相比R-CNN做了很多優化,但現在來看依然存在一些問題,主要如下:
論文: 《Fast R-CNN》
發表年份:2015
Fast R-CNN是對R-CNN的一個提升版本,相比R-CNN,訓練速度提升9倍,測試速度提升213倍,mAP由66%提升到66.9%
主要改進點如下:
多任務損失函數(Multi-task Loss):
Fast R-CNN將分類和邊框回歸合並,通過多任務Loss層進一步整合深度網路,統一了訓練過程。分為兩個損失函數:分類損失和回歸損失。分類採用softmax代替SVM進行分類,共輸出N(類別)+1(背景)類。softmax由於引入了類間競爭,所以分類效果優於SVM,SVM在R-CNN中用於二分類。回歸損失輸出的是4*N(類別),4表示的是(x,y,w,h分別表示候選框的中心坐標和寬、高)。
SVD對全連接層進行分解:
由於一張圖像約產生2000個RoIs,將近一半多的時間用在全連接層計算,為了提高運算速度,使用 SVD(奇異值分解) 對全連接層進行變換來提高運算速度。一個大的矩陣可以近似分解為三個小矩陣的乘積,分解後的矩陣的元素數目遠小於原始矩陣的元素數目,從而達到減少計算量的目的。通過對全連接層的權值矩陣進行SVD分解,使得處理一張圖像的速度明顯提升。
論文: 《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》
發表年份:2016
SPP-Net和Fast R-CNN都有一個非常耗時的候選框選取的過程,提取候選框最常用的SelectiveSearch方法,提取一副圖像大概需要2s的時間,改進的EdgeBoxes演算法將效率提高到了0.2s,但是還是比較耗時。
Fast R-CNN中引入Region Proposal Network(RPN)替代Selective Search,同時引入anchor box應對目標形狀的變化問題(anchor就是位置和大小固定的box,可以理解成事先設置好的固定的proposal)
Region Proposal Network:
RPN的核心思想是候選框的提取不在原圖上做,而是在feature map上做,這意味著相比原圖更少的計算量。在Faster R-CNN中,RPN是單獨的分支,通過RPN提取候選框並合並到深度網路中。
多尺度先驗框:
RPN網路的特點在於通過滑動窗口的方式實現候選框的提取,每個滑動窗口位置生成9個候選窗口(不同尺度、不同寬高),提取對應9個候選窗口(anchor)的特徵,用於目標分類和邊框回歸,與FastRCNN類似。
anchor的生成規則有兩個:調整寬高比和放大。如下圖所示,假設base_size為16,按照1:2,1:1,2:1三種比例進行變換生成下圖上部分三種anchor;第二種是將寬高進行三種倍數放大,2^3=8,2^4=16,2^5=32倍的放大,如16x16的區域變成(16*8)*(16*8)=128*128的區域,(16*16)*(16*16)=256*256的區域,(16*32)*(16*32)=512*512的區域。
訓練過程中,涉及到的候選框選取,選取依據如下:
從模型訓練的角度來看,通過使用共享特徵交替訓練的方式,達到接近實時的性能,交替訓練方式為:
Faster R-CNN實現了端到端的檢測,並且幾乎達到了效果上的最優,有些基於Faster R-CNN的變種准確度已經刷到了87%以上。速度方面還有優化的餘地,比如Yolo系列(Yolo v1/v2/v3/v4)。對於目標檢測,仍處於一個探索和高度發展的階段,還不斷有更優的模型產生。
Ⅶ CNN網路簡介
卷積神經網路簡介(Convolutional Neural Networks,簡稱CNN)
卷積神經網路是近年發展起來,並引起廣泛重視的一種高效識別方法。20世紀60年代,Hubel和Wiesel在研究貓腦皮層中用於局部敏感和方向選擇的神經元時發現其獨特的網路結構可以有效地降低反饋神經網路的復雜性,繼而提出了卷積神經網路(Convolutional
Neural
Networks-簡稱CNN)。現在,CNN已經成為眾多科學領域的研究熱點之一,特別是在模式分類領域,由於該網路避免了對圖像的復雜前期預處理,可以直接輸入原始圖像,因而得到了更為廣泛的應用。
K.Fukushima在1980年提出的新識別機是卷積神經網路的第一個實現網路。隨後,更多的科研工作者對該網路進行了改進。其中,具有代表性的研究成果是Alexander和Taylor提出的「改進認知機」,該方法綜合了各種改進方法的優點並避免了耗時的誤差反向傳播。
一般地,CNN的基本結構包括兩層,其一為特徵提取層,每個神經元的輸入與前一層的局部接受域相連,並提取該局部的特徵。一旦該局部特徵被提取後,它與其它特徵間的位置關系也隨之確定下來;其二是特徵映射層,網路的每個計算層由多個特徵映射組成,每個特徵映射是一個平面,平面上所有神經元的權值相等。特徵映射結構採用影響函數核小的sigmoid函數作為卷積網路的激活函數,使得特徵映射具有位移不變性。此外,由於一個映射面上的神經元共享權值,因而減少了網路自由參數的個數。卷積神經網路中的每一個卷積層都緊跟著一個用來求局部平均與二次提取的計算層,這種特有的兩次特徵提取結構減小了特徵解析度。
CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由於CNN的特徵檢測層通過訓練數據進行學習,所以在使用CNN時,避免了顯示的特徵抽取,而隱式地從訓練數據中進行學習;再者由於同一特徵映射面上的神經元權值相同,所以網路可以並行學習,這也是卷積網路相對於神經元彼此相連網路的一大優勢。卷積神經網路以其局部權值共享的特殊結構在語音識別和圖像處理方面有著獨特的優越性,其布局更接近於實際的生物神經網路,權值共享降低了網路的復雜性,特別是多維輸入向量的圖像可以直接輸入網路這一特點避免了特徵提取和分類過程中數據重建的復雜度。
1. 神經網路
首先介紹神經網路,這一步的詳細可以參考資源1。簡要介紹下。神經網路的每個單元如下:
其對應的公式如下:
其中,該單元也可以被稱作是Logistic回歸模型。當將多個單元組合起來並具有分層結構時,就形成了神經網路模型。下圖展示了一個具有一個隱含層的神經網路。
其對應的公式如下:
比較類似的,可以拓展到有2,3,4,5,…個隱含層。
神經網路的訓練方法也同Logistic類似,不過由於其多層性,還需要利用鏈式求導法則對隱含層的節點進行求導,即梯度下降+鏈式求導法則,專業名稱為反向傳播。關於訓練演算法,本文暫不涉及。
2 卷積神經網路
在圖像處理中,往往把圖像表示為像素的向量,比如一個1000×1000的圖像,可以表示為一個1000000的向量。在上一節中提到的神經網路中,如果隱含層數目與輸入層一樣,即也是1000000時,那麼輸入層到隱含層的參數數據為1000000×1000000=10^12,這樣就太多了,基本沒法訓練。所以圖像處理要想練成神經網路大法,必先減少參數加快速度。就跟辟邪劍譜似的,普通人練得很挫,一旦自宮後內力變強劍法變快,就變的很牛了。
2.1 局部感知
卷積神經網路有兩種神器可以降低參數數目,第一種神器叫做局部感知野。一般認為人對外界的認知是從局部到全局的,而圖像的空間聯系也是局部的像素聯系較為緊密,而距離較遠的像素相關性則較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然後在更高層將局部的信息綜合起來就得到了全局的信息。網路部分連通的思想,也是受啟發於生物學裡面的視覺系統結構。視覺皮層的神經元就是局部接受信息的(即這些神經元只響應某些特定區域的刺激)。如下圖所示:左圖為全連接,右圖為局部連接。
在上右圖中,假如每個神經元只和10×10個像素值相連,那麼權值數據為1000000×100個參數,減少為原來的千分之一。而那10×10個像素值對應的10×10個參數,其實就相當於卷積操作。
2.2 參數共享
但其實這樣的話參數仍然過多,那麼就啟動第二級神器,即權值共享。在上面的局部連接中,每個神經元都對應100個參數,一共1000000個神經元,如果這1000000個神經元的100個參數都是相等的,那麼參數數目就變為100了。
怎麼理解權值共享呢?我們可以這100個參數(也就是卷積操作)看成是提取特徵的方式,該方式與位置無關。這其中隱含的原理則是:圖像的一部分的統計特性與其他部分是一樣的。這也意味著我們在這一部分學習的特徵也能用在另一部分上,所以對於這個圖像上的所有位置,我們都能使用同樣的學習特徵。
更直觀一些,當從一個大尺寸圖像中隨機選取一小塊,比如說 8×8 作為樣本,並且從這個小塊樣本中學習到了一些特徵,這時我們可以把從這個
8×8 樣本中學習到的特徵作為探測器,應用到這個圖像的任意地方中去。特別是,我們可以用從 8×8
樣本中所學習到的特徵跟原本的大尺寸圖像作卷積,從而對這個大尺寸圖像上的任一位置獲得一個不同特徵的激活值。
如下圖所示,展示了一個33的卷積核在55的圖像上做卷積的過程。每個卷積都是一種特徵提取方式,就像一個篩子,將圖像中符合條件(激活值越大越符合條件)的部分篩選出來。
2.3 多卷積核
上面所述只有100個參數時,表明只有1個100*100的卷積核,顯然,特徵提取是不充分的,我們可以添加多個卷積核,比如32個卷積核,可以學習32種特徵。在有多個卷積核時,如下圖所示:
上圖右,不同顏色表明不同的卷積核。每個卷積核都會將圖像生成為另一幅圖像。比如兩個卷積核就可以將生成兩幅圖像,這兩幅圖像可以看做是一張圖像的不同的通道。如下圖所示,下圖有個小錯誤,即將w1改為w0,w2改為w1即可。下文中仍以w1和w2稱呼它們。
下圖展示了在四個通道上的卷積操作,有兩個卷積核,生成兩個通道。其中需要注意的是,四個通道上每個通道對應一個卷積核,先將w2忽略,只看w1,那麼在w1的某位置(i,j)處的值,是由四個通道上(i,j)處的卷積結果相加然後再取激活函數值得到的。
所以,在上圖由4個通道卷積得到2個通道的過程中,參數的數目為4×2×2×2個,其中4表示4個通道,第一個2表示生成2個通道,最後的2×2表示卷積核大小。
2.4 Down-pooling
在通過卷積獲得了特徵 (features)
之後,下一步我們希望利用這些特徵去做分類。理論上講,人們可以用所有提取得到的特徵去訓練分類器,例如 softmax
分類器,但這樣做面臨計算量的挑戰。例如:對於一個 96X96
像素的圖像,假設我們已經學習得到了400個定義在8X8輸入上的特徵,每一個特徵和圖像卷積都會得到一個 (96 − 8 + 1) × (96 − 8+ 1) = 7921 維的卷積特徵,由於有 400 個特徵,所以每個樣例 (example) 都會得到一個 892 × 400 =3,168,400 維的卷積特徵向量。學習一個擁有超過 3 百萬特徵輸入的分類器十分不便,並且容易出現過擬合 (over-fitting)。
為了解決這個問題,首先回憶一下,我們之所以決定使用卷積後的特徵是因為圖像具有一種「靜態性」的屬性,這也就意味著在一個圖像區域有用的特徵極有可能在另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特徵進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定特徵的平均值(或最大值)。這些概要統計特徵不僅具有低得多的維度 (相比使用所有提取得到的特徵),同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池(pooling),有時也稱為平均池化或者最大池化 (取決於計算池化的方法)。
至此,卷積神經網路的基本結構和原理已經闡述完畢。
2.5 多層卷積
在實際應用中,往往使用多層卷積,然後再使用全連接層進行訓練,多層卷積的目的是一層卷積學到的特徵往往是局部的,層數越高,學到的特徵就越全局化。
3 ImageNet-2010網路結構
ImageNetLSVRC是一個圖片分類的比賽,其訓練集包括127W+張圖片,驗證集有5W張圖片,測試集有15W張圖片。本文截取2010年AlexKrizhevsky的CNN結構進行說明,該結構在2010年取得冠軍,top-5錯誤率為15.3%。值得一提的是,在今年的ImageNetLSVRC比賽中,取得冠軍的GoogNet已經達到了top-5錯誤率6.67%。可見,深度學習的提升空間還很巨大。
下圖即為Alex的CNN結構圖。需要注意的是,該模型採用了2-GPU並行結構,即第1、2、4、5卷積層都是將模型參數分為2部分進行訓練的。在這里,更進一步,並行結構分為數據並行與模型並行。數據並行是指在不同的GPU上,模型結構相同,但將訓練數據進行切分,分別訓練得到不同的模型,然後再將模型進行融合。而模型並行則是,將若干層的模型參數進行切分,不同的GPU上使用相同的數據進行訓練,得到的結果直接連接作為下一層的輸入。
上圖模型的基本參數為:
輸入:224×224大小的圖片,3通道
第一層卷積:5×5大小的卷積核96個,每個GPU上48個。
第一層max-pooling:2×2的核。
第二層卷積:3×3卷積核256個,每個GPU上128個。
第二層max-pooling:2×2的核。
第三層卷積:與上一層是全連接,3*3的卷積核384個。分到兩個GPU上個192個。
第四層卷積:3×3的卷積核384個,兩個GPU各192個。該層與上一層連接沒有經過pooling層。
第五層卷積:3×3的卷積核256個,兩個GPU上個128個。
第五層max-pooling:2×2的核。
第一層全連接:4096維,將第五層max-pooling的輸出連接成為一個一維向量,作為該層的輸入。
第二層全連接:4096維
Softmax層:輸出為1000,輸出的每一維都是圖片屬於該類別的概率。
4 DeepID網路結構
DeepID網路結構是香港中文大學的Sun
Yi開發出來用來學習人臉特徵的卷積神經網路。每張輸入的人臉被表示為160維的向量,學習到的向量經過其他模型進行分類,在人臉驗證試驗上得到了97.45%的正確率,更進一步的,原作者改進了CNN,又得到了99.15%的正確率。
如下圖所示,該結構與ImageNet的具體參數類似,所以只解釋一下不同的部分吧。
上圖中的結構,在最後只有一層全連接層,然後就是softmax層了。論文中就是以該全連接層作為圖像的表示。在全連接層,以第四層卷積和第三層max-pooling的輸出作為全連接層的輸入,這樣可以學習到局部的和全局的特徵。
Ⅷ CNN、RNN、DNN的一般解釋
CNN(卷積神經網路)、RNN(循環神經網路)、DNN(深度神經網路)的內部網路結構有什麼區別?
轉自知乎 科言君 的回答
神經網路技術起源於上世紀五、六十年代,當時叫 感知機 (perceptron),擁有輸入層、輸出層和一個隱含層。輸入的特徵向量通過隱含層變換達到輸出層,在輸出層得到分類結果。早期感知機的推動者是Rosenblatt。 (扯一個不相關的:由於計算技術的落後,當時感知器傳輸函數是用線拉動變阻器改變電阻的方法機械實現的,腦補一下科學家們扯著密密麻麻的導線的樣子…)
但是,Rosenblatt的單層感知機有一個嚴重得不能再嚴重的問題,即它對稍復雜一些的函數都無能為力(比如最為典型的「異或」操作)。連異或都不能擬合,你還能指望這貨有什麼實際用途么o(╯□╰)o
隨著數學的發展,這個缺點直到上世紀八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)發明的 多層感知機 (multilayerperceptron)克服。多層感知機,顧名思義,就是有多個隱含層的感知機(廢話……)。好好,我們看一下多層感知機的結構:
圖1 上下層神經元全部相連的神經網路——多層感知機
多層感知機可以擺脫早期離散傳輸函數的束縛,使用sigmoid或tanh等連續函數模擬神經元對激勵的響應,在訓練演算法上則使用Werbos發明的反向傳播BP演算法。對,這貨就是我們現在所說的 神經網路 NN ——神經網路聽起來不知道比感知機高端到哪裡去了!這再次告訴我們起一個好聽的名字對於研(zhuang)究(bi)很重要!
多層感知機解決了之前無法模擬異或邏輯的缺陷,同時更多的層數也讓網路更能夠刻畫現實世界中的復雜情形。相信年輕如Hinton當時一定是春風得意。
多層感知機給我們帶來的啟示是, 神經網路的層數直接決定了它對現實的刻畫能力 ——利用每層更少的神經元擬合更加復雜的函數[1]。
(Bengio如是說:functions that can be compactly
represented by a depth k architecture might require an exponential number of
computational elements to be represented by a depth k − 1 architecture.)
即便大牛們早就預料到神經網路需要變得更深,但是有一個夢魘總是縈繞左右。隨著神經網路層數的加深, 優化函數越來越容易陷入局部最優解 ,並且這個「陷阱」越來越偏離真正的全局最優。利用有限數據訓練的深層網路,性能還不如較淺層網路。同時,另一個不可忽略的問題是隨著網路層數增加, 「梯度消失」現象更加嚴重 。具體來說,我們常常使用sigmoid作為神經元的輸入輸出函數。對於幅度為1的信號,在BP反向傳播梯度時,每傳遞一層,梯度衰減為原來的0.25。層數一多,梯度指數衰減後低層基本上接受不到有效的訓練信號。
2006年,Hinton利用預訓練方法緩解了局部最優解問題,將隱含層推動到了7層[2],神經網路真正意義上有了「深度」,由此揭開了深度學習的熱潮。這里的「深度」並沒有固定的定義——在語音識別中4層網路就能夠被認為是「較深的」,而在圖像識別中20層以上的網路屢見不鮮。為了克服梯度消失,ReLU、maxout等傳輸函數代替了sigmoid,形成了如今DNN的基本形式。單從結構上來說, 全連接的 DNN 和圖 1 的多層感知機是沒有任何區別的 。
值得一提的是,今年出現的高速公路網路(highway network)和深度殘差學習(deep resial learning)進一步避免了梯度消失,網路層數達到了前所未有的一百多層(深度殘差學習:152層)[3,4]!具體結構題主可自行搜索了解。如果你之前在懷疑是不是有很多方法打上了「深度學習」的噱頭,這個結果真是深得讓人心服口服。
圖2 縮減版的深度殘差學習網路,僅有34 層,終極版有152 層,自行感受一下
如圖1所示,我們看到 全連接 DNN 的結構里下層神經元和所有上層神經元都能夠形成連接 ,帶來的潛在問題是 參數數量的膨脹 。假設輸入的是一幅像素為1K*1K的圖像,隱含層有1M個節點,光這一層就有10^12個權重需要訓練,這不僅容易過擬合,而且極容易陷入局部最優。另外,圖像中有固有的局部模式(比如輪廓、邊界,人的眼睛、鼻子、嘴等)可以利用,顯然應該將圖像處理中的概念和神經網路技術相結合。此時我們可以祭出題主所說的卷積神經網路CNN。對於CNN來說,並不是所有上下層神經元都能直接相連,而是 通過「卷積核」作為中介。同一個卷積核在所有圖像內是共享的,圖像通過卷積操作後仍然保留原先的位置關系。 兩層之間的卷積傳輸的示意圖如下:
圖3 卷積神經網路隱含層(摘自Theano 教程)
通過一個例子簡單說明卷積神經網路的結構。假設圖3中m-1=1是輸入層,我們需要識別一幅彩色圖像,這幅圖像具有四個通道ARGB(透明度和紅綠藍,對應了四幅相同大小的圖像),假設卷積核大小為100*100,共使用100個卷積核w1到w100(從直覺來看,每個卷積核應該學習到不同的結構特徵)。用w1在ARGB圖像上進行卷積操作,可以得到隱含層的第一幅圖像;這幅隱含層圖像左上角第一個像素是四幅輸入圖像左上角100*100區域內像素的加權求和,以此類推。同理,算上其他卷積核,隱含層對應100幅「圖像」。每幅圖像對是對原始圖像中不同特徵的響應。按照這樣的結構繼續傳遞下去。CNN中還有max-pooling等操作進一步提高魯棒性。
圖4 一個典型的卷積神經網路結構,注意到最後一層實際上是一個全連接層(摘自Theano 教程)
在這個例子里,我們注意到 輸入層到隱含層的參數瞬間降低到了 100*100*100=10^6 個 !這使得我們能夠用已有的訓練數據得到良好的模型。題主所說的適用於圖像識別,正是由於 CNN 模型限制參數了個數並挖掘了局部結構的這個特點 。順著同樣的思路,利用語音語譜結構中的局部信息,CNN照樣能應用在語音識別中。
全連接的DNN還存在著另一個問題——無法對時間序列上的變化進行建模。然而, 樣本出現的時間順序對於自然語言處理、語音識別、手寫體識別等應用非常重要 。對了適應這種需求,就出現了題主所說的另一種神經網路結構——循環神經網路RNN。
在普通的全連接網路或CNN中,每層神經元的信號只能向上一層傳播,樣本的處理在各個時刻獨立,因此又被成為前向神經網路(Feed-forward Neural Networks)。而在 RNN 中,神經元的輸出可以在下一個時間戳直接作用到自身 ,即第i層神經元在m時刻的輸入,除了(i-1)層神經元在該時刻的輸出外,還包括其自身在(m-1)時刻的輸出!表示成圖就是這樣的:
圖5 RNN 網路結構
我們可以看到在隱含層節點之間增加了互連。為了分析方便,我們常將RNN在時間上進行展開,得到如圖6所示的結構:
圖6 RNN 在時間上進行展開
Cool, ( t+1 )時刻網路的最終結果O(t+1) 是該時刻輸入和所有歷史共同作用的結果 !這就達到了對時間序列建模的目的。
不知題主是否發現,RNN可以看成一個在時間上傳遞的神經網路,它的深度是時間的長度!正如我們上面所說, 「梯度消失」現象又要出現了,只不過這次發生在時間軸上 。對於t時刻來說,它產生的梯度在時間軸上向歷史傳播幾層之後就消失了,根本就無法影響太遙遠的過去。因此,之前說「所有歷史」共同作用只是理想的情況,在實際中,這種影響也就只能維持若干個時間戳。
為了解決時間上的梯度消失,機器學習領域發展出了 長短時記憶單元 LSTM ,通過門的開關實現時間上記憶功能,並防止梯度消失 ,一個LSTM單元長這個樣子:
圖7 LSTM 的模樣
除了題主疑惑的三種網路,和我之前提到的深度殘差學習、LSTM外,深度學習還有許多其他的結構。舉個例子,RNN既然能繼承歷史信息,是不是也能吸收點未來的信息呢?因為在序列信號分析中,如果我能預知未來,對識別一定也是有所幫助的。因此就有了 雙向 RNN 、雙向 LSTM ,同時利用歷史和未來的信息。
圖8 雙向RNN
事實上, 不論是那種網路,他們在實際應用中常常都混合著使用,比如 CNN 和RNN 在上層輸出之前往往會接上全連接層,很難說某個網路到底屬於哪個類別。 不難想像隨著深度學習熱度的延續,更靈活的組合方式、更多的網路結構將被發展出來。盡管看起來千變萬化,但研究者們的出發點肯定都是為了解決特定的問題。題主如果想進行這方面的研究,不妨仔細分析一下這些結構各自的特點以及它們達成目標的手段。入門的話可以參考:
Ng寫的Ufldl: UFLDL教程 - Ufldl
也可以看Theano內自帶的教程,例子非常具體: Deep Learning Tutorials
歡迎大家繼續推薦補充。
當然啦,如果題主只是想湊個熱鬧時髦一把,或者大概了解一下方便以後把妹使,這樣看看也就罷了吧。
參考文獻:
[1]
Bengio Y. Learning Deep
Architectures for AI[J]. Foundations & Trends® in Machine Learning, 2009,
2(1):1-127.
[2]
Hinton G E, Salakhutdinov R R.
Recing the Dimensionality of Data with Neural Networks[J]. Science, 2006,
313(5786):504-507.
[3]
He K, Zhang X, Ren S, Sun J. Deep
Resial Learning for Image Recognition. arXiv:1512.03385, 2015.
[4]
Srivastava R K, Greff K,
Schmidhuber J. Highway networks. arXiv:1505.00387, 2015.
Ⅸ 卷積神經網路(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再說吧。