卷積神經網絡簡介
傳統的BP神經網絡與DNN(深度神經網絡)不同層神經元的連接方式是“全連接”,也就是這一次層的一個神經元的輸入,會接受上一次每一個神經元的輸出,這種方式即為“全連接神經網絡”。這樣的連接方式有一個的缺點:因為權值與偏置等參數量大,導緻訓練收斂十分緩慢。特别是對于圖像這樣的訓練數據,動不動就是數以百萬的像素,理論上雖然可以收斂,但你可能得等上N年才有結果,而且它的泛化性也會變差。例如一張黑白的 28×28 的手寫數字圖片,輸入層的神經元就有784個,如下圖所示:
若在中間隻使用一層隐藏層,我們設定hidden layer有15層,此時參數 w 就有 784×15=11760 多個;若輸入的是28×28 帶有顔色的RGB 格式的手寫數字圖片,輸入神經元就有28×28×3=2352 個。這很容易看出使用全連接神經網絡處理圖像中的需要訓練參數過多的問題。而在卷積神經網絡(Convolutional Neural Network,CNN)中,卷積層的神經元隻與前一層的部分神經元節點相連,即它的神經元間的連 接是非全連接的,且同一層中某些神經元之間的連接的權重 w 和偏移 b 是共享的(即相同的),這樣大量地減少了需要訓練參數的數量。
全卷積神經網絡輸出的特征圖如同昆蟲的複眼,每個grid為一隻眼睛,每隻眼睛所看到的東西不一樣,但是每隻眼睛的視野範圍相同(即,每隻眼睛的感受野大小相同), 每隻眼睛單獨工作,互不影響。然後每隻眼睛會判斷:1、它看到了什麼物體(類别);2、這個物體有什麼特點(屬性,可選項)。
一張圖像,我們實際上并不需要讓每個神經元都接受整個圖片的信息,而是讓不同區域的神經元對應一整張圖片的不同局部,最後隻要再把局部信息整合到一起就可以了。這樣就相當于在神經元最初的輸入層實現了一次降維。
局部感知即卷積核的局部感受野,指的是卷積核所覆蓋的像素面積,由于每個卷積核所覆蓋的面積僅是很少的一部分,是局部特征,即為局部感知。CNN是一個從局部到整體的過程(局部到整體的實現是在全連通層)。下圖是全連接層和卷積層的對比。
傳統的神經網絡的參數量巨大,例如對1000X1000像素的圖片做一次全連接操作,需要(1000X1000)10的6次方個參數。這可以說是卷積神經網絡的最重要也是它牛逼之處,剛剛我們說到全連接神經網絡最大的問題就是權值參數太多,而卷積神經網絡的卷積層,不同神經元的權值是共享的,這使得整個神經網絡的參數大大減小,提高了整個網絡的訓練性能。
降采樣是卷積神經網絡的另一重要概念,通常也稱之為池化(Pooling)。簡單理解可以看作是對圖像的一次“有損壓縮”,因為在實際的訓練中,我們并不需要對圖像中的每一個細節都進行特征提取和訓練,所以池化的作用就是更進一步的信息抽象和特征提取,當然也會減小數據的處理量。最常見的方式有最大值(Max)池化、最小值(Min)池化、平均值(Average)池化。池化的好處是降低了圖像的分辨率,整個網絡也不容易過拟合。最大值池化如圖所示。
CNN由輸入和輸出層以及多個隐藏層組成,隐藏層可分為卷積層,池化層、RELU層和全連通層,如下圖:
當然中間還可以使用一些其他的功能層:
輸入層(Input Layer)是将原始數據或者其他算法預處理後的數據輸入到卷積神經網絡,數據沒有明确定義,可以是數字圖像,可以是音頻識别領域經過傅裡葉變換的二維波形數據,也可以是自然語言處理中一維表示的句子向量。輸入層的作用是将輸入數據送入卷積神經網絡進行特征提取,然後獲得我們想要的結果。同時根據計算能力差異,機器存儲能力差異和模型參數多少可以控制輸入不同數量的數據。
在CNN的輸入層中,(圖片)數據輸入的格式 與 全連接神經網絡的輸入格式(一維向量)不太一樣。CNN的輸入層的輸入格式保留了圖片 本身的結構。對于黑白的 28×28 的圖片,CNN的輸入是一個 28×28 的的二維神經元。
而對于RGB格式的28×28圖片,CNN的輸入則是一個 3×28×28 的三維神經元(RGB中的每一個顔色通道都有一個 28×28 的矩陣)。
卷積層可以說是 CNN 架構中最重要的步驟之一。基本而言,卷積是一種線性的、平移不變性的運算,其由在輸入信号上執行局部加權的組合構成。根據所選擇的權重集合(即所選擇的點擴散函數(point spread function))的不同,也将揭示出輸入信号的不同性質。在頻率域中,與點擴散函數關聯的是調制函數——說明了輸入的頻率組分通過縮放和相移進行調制的方式。因此,選擇合适的核(kernel)對獲取輸入信号中所包含的最顯著和最重要的信息而言至關重要,這能讓模型對該信号的内容做出更好的推斷。
在卷積層中有幾個重要的概念:
假設輸入的是一個 28×28 的的二維神經元,我們定義5×5 的 一個 local receptive fields(感受視野),即 隐藏層的神經元與輸入 層的5×5個神經元相連,這個5*5的區域就稱之為Local Receptive Fields,如下圖所示:
可類似看作:隐藏層中的神經元具有一個固定大小的感受視野去感受上一層的部分特征。在全連接神經網絡中,隐藏層中的神經元的感受 視野足夠大乃至可以看到上一層的所有特征。而在卷積神經網絡中,隐藏層中的神經元的感受視野比較小,隻能看到上一次的部分特征,上一層的其他特征可以通過平移感受視野來得到同一層的其他神經元,由同一層其他神經元來看:
設移動的步長為1:從左到右掃描,每次移動 1 格,掃描完之後,再向下移動一格,再次從左到右掃描。具體過程請看:
可看出 卷積層的神經元是隻與前一層的部分神經元節點相連,每一條相連的線對應一個權重w。一個感受視野帶有一個卷積核,我們将感受視野中的權重w矩陣稱為卷積核将感受視野對輸入的掃描間隔稱為步長(stride); 當步長比較大時(stride>1),為了掃描到邊緣的一些特征,感受視野可能會“出界”,這時需要對邊界擴充(pad),邊界擴充可以設為0 或其他值。卷積核的大小由用戶來定義,即定義的感受視野的大小;卷積核的權重矩陣的值,便是卷積神經網絡的參數,為了有一個偏移項,卷積核可附帶一個偏移項b ,它們的初值可以随機來生成,可通過訓練進行變化。因此感受視野(5X5)掃描時可以計算出下一層神經元的值為:
對下一層的所有神經元來說,它們從不同的位置去探測了上一層神經元的特征。我們将通過一個帶有卷積核的感受視野掃描生成的下一層神經元矩陣稱為一個feature map (特征映射圖),如下圖的右邊便是一個 feature map:
在同一個feature map上的神經元使用的卷積核是相同的,因此這些神經元 shared weights,共享卷積核中的權值和附帶的偏移。一個 feature map對應一個卷積核,若我們使用 3 個不同的卷積核,可以輸出3個feature map:(感受視野:5×5,布長stride:1)
因此在CNN的卷積層,我們需要訓練的參數大大地減少到了 (5×5 1)×3=78個。假設輸入的是 28×28 的RGB圖片,即輸入的是一個 3×28×28 的二維神經元,這時卷積核的大小不隻用長和寬來表示,還有深度, 感受視野也對應的有了深度,如下圖所示:
由圖可知:感受視野:3×2×2 ; 卷積核:3×2×2 ,深度為3;下一層的神經元的值為:
。卷積核的深度和感受視野的深度相同,都由輸入數據來決定,長寬可由自己來設定,數目也可以由自己來設定,一個卷積核依然對應一個 feature map。
總結一下,卷積層的優點在于局部連接(有助于減少參數量)和權值共享。我們分别來舉例說明一下:
激活層(Activation Layer)負責對卷積層抽取的特診進行激活,由于卷積操作是把輸入圖像和卷積核進行相應的線性變換,需要引入激活層(非線性函數)對其進行非線性映射。激活層由非線性函數組成,常見的如sigmoid、tanh、relu。最常用的激活函數是Relu,又叫線性整流器。公式表達為:
當輸入經過卷積層時,若感受視野比較小,步長stride比較小,得到的feature map (特征圖)還是比較大,可以通過池化層來對每一個 feature map進行降維操作,輸出的深度還是不變的,依然為 feature map 的個數。
池化層也有一個“池化視野(filter)”來對feature map矩陣進行掃描,對“池化視野”中的矩陣值進行計算,一般有兩種計算方式:
其中“池化視野”filter: 2×2;步長stride:2。最後可将 3 個 24×24 的 feature map 下采樣得到 3 個 24×24 的特征矩陣:
結一下,池化層優點有:
全連接層(Full Connected Layer)就是一個線性特征映射的過程,将多維的特征輸入映射為二維的特征輸出,高維表示樣本批次,低位常常對應任務目标(例如分類就對應每一個類别的概率)。全連接層主要對特征進行重新拟合,減少特征信息的丢失;輸出層主要準備做好最後目标結果的輸出。
由于網絡中存在級聯的非線性運算,所以多層架構是高度非線性的。除了整流非線性,歸一化(normalization)是 CNN 架構中有重要作用的又一種非線性處理模塊。
Batch Normalization(批量歸一化)實現了在神經網絡層的中間進行預處理的操作,即在上一層的輸入歸一化處理後再進入網絡的下一層,這樣可有效地防止“梯度彌散”,加速網絡訓練。
Batch Normalization具體的算法如下圖所示:
每次訓練時,取batch_size大小的樣本進行訓練,在BN層中,将一個神經元看作一個特征,batch_size個樣本在某個特征維度會有batch_size個值,然後在每個神經元維度上的進行這些樣本的均值和方差,通過公式得到,再通過參數和進行線性映射得到每個神經元對應的輸出。在BN層中,可以看出每一個神經元維度上,都會有一個參數和,它們同權重一樣可以通過訓練進行優化。
在卷積神經網絡中進行批量歸一化時,一般對未進行ReLu激活的 feature map進行批量歸一化,輸出後再作為激勵層的輸入,可達到調整激勵函數偏導的作用。一種做法是将feature map中的神經元作為特征維度,參數和的數量和則等于 2×fmapwidth×fmaplength×fmapnum2×fmapwidth×fmaplength×fmapnum,這樣做的話參數的數量會變得很多;另一種做法是把一個feature map看做一個特征維度,一個feature map上的神經元共享這個feature map的參數和,參數和的數量和則等于 2×fmapnum2×fmapnum,計算均值和方差則在batch_size個訓練樣本在每一個feature map維度上的均值和方差。注:fmapnumfmapnum指的是一個樣本的feature map數量,feature map 跟神經元一樣也有一定的排列順序。
Batch Normalization 算法的訓練過程和測試過程的區别:在訓練過程中,我們每次都會将 batch_size 數目大小的訓練樣本放入到CNN網絡中進行訓練,在BN層中自然可以得到計算輸出所需要的均值和方差。而在測試過程中,我們往往隻會向CNN網絡中輸入一個測試樣本,這是在BN層計算的均值和方差會均為 0,因為隻有一個樣本輸入,因此BN層的輸入也會出現很大的問題,從而導緻CNN網絡輸出的錯誤。所以在測試過程中,我們需要借助訓練集中所有樣本在BN層歸一化時每個維度上的均值和方差,當然為了計算方便,我們可以在 batch_num 次訓練過程中,将每一次在BN層歸一化時每個維度上的均值和方差進行相加,最後再進行求一次均值即可。
近鄰歸一化(Local Response Normalization)的歸一化方法主要發生在不同的相鄰的卷積核(經過ReLu之後)的輸出之間,即輸入是發生在不同的經過ReLu之後的 feature map 中。
LRN的公式如下:
其中:
與BN的區别:BN依據mini batch的數據,近鄰歸一僅需要自己來決定,BN訓練中有學習參數;BN歸一化主要發生在不同的樣本之間,LRN歸 一化主要發生在不同的卷積核的輸出之間。
在一些應用中,需要對圖片進行切割,獨立地對某一部分區域進行單獨學習。這樣可以對特定部分進行通過調整 感受視野進行力度更大的學習。
融合層可以對切分層進行融合,也可以對不同大小的卷積核學習到的特征進行融合。例如在GoogleLeNet中,使用多種分辨率的卷積核對目标特征進行學習,通過 padding 使得每一個 feature map 的長寬都一緻,之後再 将多個 feature map 在深度上拼接在一起:
融合的方法有幾種,一種是特征矩陣之間的拼接級聯,另一種是在特征矩陣進行運算 ( ,−,x,max,conv)。
卷積神經網絡很擅長處理圖像。而視頻是圖像的疊加,所以同樣擅長處理視頻内容。下面給大家列一些比較成熟的應用:
圖像分類是比較基礎的應用,他可以節省大量的人工成本,将圖像進行有效的分類。對于一些特定領域的圖片,分類的準确率可以達到 95% ,已經算是一個可用性很高的應用了。
典型場景:圖像搜索…
可以在圖像中定位目标,并确定目标的位置及大小。
典型場景:自動駕駛、安防、醫療…
簡單理解就是一個像素級的分類。
他可以對前景和背景進行像素級的區分、再高級一點還可以識别出目标并且對目标進行分類。
典型場景:美圖秀秀、視頻後期加工、圖像生成…
人臉識别已經是一個非常普及的應用了,在很多領域都有廣泛的應用。
典型場景:安防、金融、生活…
骨骼識别是可以識别身體的關鍵骨骼,以及追蹤骨骼的動作。
典型場景:安防、電影、圖像視頻生成、遊戲…
CNN最早由LeCun 在1998年《Gradient-based learning applied to document recognition》中提出,并提出了一個目标檢測的模型:LeNet-5,随後在2012年ImageNet競賽上,基于CNN網絡的AlexNet取得了第一,且正确率超出第二近10%,取得了曆史性的突破。CNN開始大放異彩,VGG Net,Google Net,ResNet等,都是基于CNN網絡的一些傑出的工作。
非常經典的網絡結構,具體不介紹了,直接貼個結構圖:
可以看出來,這是一個識别字母的神經網絡。首先經過一次卷積濾波處理,得到了C1(卷積層 Feature map),然後又經過了一次下采樣(池化)處理得到了S2(下采樣層),之後又是一次卷積濾波得到C3卷積層,依次處理至途中的C5位全連接層,至此卷積的過程結束,被抽象的特征輸入至傳統的全連接神經網絡,之後就又是熟悉的節奏了。
2012 年 AlexNet 在 ImageNet 2012 圖像識别挑戰賽上一鳴驚人,證明了學習到的特征可以超越手工特征,結構如下:
該網絡有以下的創新:
之前使用的 tanh 和 sigmoid 激活函數都存在飽和區。改用無飽和的 ReLU ,收斂速度可以達到數倍于 tanh !
2個 GPU 協同,最直接的作用是加快了訓練速度。作者嘗試将網絡改為單GPU,同時保證參數數量不變,速度略遜于雙 GPUs 。
實驗證明,重疊池化可以更好地抑制過拟合,使準确率提高約0.4%和0.3%。
最簡單的抑制過拟合技術,就是 label-preserving transformations 。簡單來說,就是讓圖像進行各種不影響目标本質的變換,擴大數據量。
dropout是一種防止過拟合的正則化技術,具體做法是,對每個隐藏層的輸入進行一個概率判決,比如我們設置概率為0.5(通常命名為keep_prob),根據0.5,随機生成一個跟隐藏層神經元個數相同的向量,true:false的比例是1:1(因為keep_prob=0.5),與隐藏層的神經元進行相乘,那麼會有一半隐藏層的神經元被舍棄,不參與訓練。重複叠代上訴操作。
如果我們有多個不同的模型合作進行預測,那麼泛化誤差将會有效降低。問題是,訓練多個模型的計算成本很高昂。Dropout 為我們提供了新思路:讓這些模型分享相同的權重系數,但神經元的輸出結果不盡相同。具體而言,是讓 hidden neuron 的輸出有50%的概率被置零。這樣,每次反向傳播時,參考的 loss 都是由不同模型計算得到的。總的來說,Dropout 技術打破了神經元之間的依賴性,強迫網絡學習更魯棒的神經元連接。我們隻在全連接層使用,因為全連接層的連接非常多。在測試階段不采用 Dropout 。Dropout 會延長收斂時間,但能有效抑制過拟合。
AlexNet 取得了很不錯的成績,但問題在于這個過程太過于經驗化,我們沒辦法借鑒太多經驗設計其他網絡(這并不代表 AlexNet 不行,相反,更是很偉大的突破)。而 VGG 就提出可以通過重複使用簡單的基礎塊來構建深度模型。
VGG 塊的組成規律是:連續使用多個相同的 padding 為 1,kernel size 為 3×3 的卷積層後,接上一個 stride 為 2,kernel 為 2×2 的最大池化層。卷積層保持輸入的尺寸不變,而池化層則對其減半。
AlexNet和 VGGNet的對比如下圖所示:
NiN 是網絡中的網絡,使用的窗口形狀為 11×11, 5×5, 3×3,每個 NiN 塊後接一個 stride 2,窗口 3×3 的最大池化層。最大的不同時 NiN 去掉了 AlexNet 的最後 3 個全連接層,用輸出通道數等于标簽類别數的 NiN 塊,然後用全局平均池化并直接用于分類,可以顯著減小模型參數尺寸,緩解過拟合,但是訓練時間一般要增加。
GoogLeNet 在 2014 年的 ImageNet 圖像識别挑戰賽中大放異彩,吸收了 NiN 中網絡串聯網絡的思想,并做了很大改進。這個model證明了一件事:用更多的卷積,更深的層次可以得到更好的結構。(當然,它并沒有證明淺的層次不能達到這樣的效果)
GoogLeNet 中的基礎卷積塊叫做 Inception,結構如下圖所示:
可以看到一個 Inception 塊中有 4 條并行的線路,我們可以自定義每層輸出的通道數,借此來控制模型複雜度。注:卷積部分使用了 5 個 block,每個 block 之間使用 stride 2 的 3×3 最大池化層來減小輸出寬度
理論上來說,我們不斷添加層,模型精度應該越來越高,但是實際情況并非如此,甚至可能變得更差了。為了解決這個問題,何恺明等人提出了殘差網絡 ResNet,奪得了 2015 年 ImageNet 冠軍。
我們先來看看殘差塊的設計:
這個思路非常深刻影響了未來的神經網絡設計,為了能夠讓 f(x)-x 和 x 相加,可能需要引入 1×1 的卷積層來變化尺寸。
DenseNet 可以看作是 ResNet 的發展創新,對比如下:
DenseNet 主要通過 dense block(确定輸入和輸入如何連接)和 transititon layer(控制通道數量)構成。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!