摘要:神經網絡的補充前篇后篇數據預處理權重初始化經典神經網絡搞明白后,我們接下來看看他的變種,也是本系列的主角卷積神經網絡。卷積神經網絡一個普通的卷積神經網絡由各種層按順序堆疊而成,這些層主要分三類卷積層池化層和全連接層。
【DL-CV】神經網絡的補充<前篇---后篇>【DL-CV】數據預處理&權重初始化
經典神經網絡搞明白后,我們接下來看看他的變種,也是本系列的主角——卷積神經網絡(Convolutional Neural Network/CNN)。
以往全連接層組成的神經網絡有一個很氣人的缺點就是對付大圖像效果不好:圖像尺寸一大,因為權重(形狀上的)大小與圖像尺寸有關系,參數量激增,導致效率低下。相比,卷積神經網絡就沒有這種煩人的特性了,他大大降低了網絡中的參數量,而且能通過增加層數(加到數十層)提高性能,非常勝任圖像識別的任務。
一個普通的卷積神經網絡由各種層按順序堆疊而成,這些層主要分三類:卷積層、池化層和全連接層。有時激活函數也算一層,它逐元素進行激活函數操作。而且為了更好的理解如何組裝這個網絡,我們先詳細介紹這幾種層的原理
卷積層注:以下例子輸入數據,輸出數據,卷積核的截面都是正方形(寬度和高度相等)
有一張 32x32 的圖像,我們保持輸入圖像數據的三維結構,則輸入是一個 32x32x3 的三維數組。我們有一個5x5x3的卷積核(kernel)/濾波器(filter),讓這個卷積核在寬度和高度上滑過整個數據空間,在每個位置,計算卷積核和數據的部分區域(兩者重合的部分)的內積獲得一個值,這個值加上偏置值b后經過激活函數作為輸出的激活值。當卷積核完成這個操作后,會得到一個由激活值組成的二維的特征映射圖(feature map,簡稱特征圖)。
如上圖左,如果步長為1(每次移動一個像素),會得到一張 28x28x1 的特征圖,有28x28個神經元。關于神經元:
每個神經元只與輸入數據的局部區域連接,該局部區域稱為該神經元的感受野(receptive field)。感受野的大小(寬高)也就是卷積核的大小(寬高),通常為正方形(寬高相等);而卷積核的深度是和輸入數據的深度相等的。上圖的感受野大小是5x5。
同一個特征圖上的神經元都公用一套權重,也就是那個卷積核。這稱為參數共享,是卷積層的特性,卷積層中的神經元通過參數共享(而不像普通網絡中每個神經元都有自己的一組參數)大大減低參數量。
在一個卷積層中,通常會有多個卷積核,每個卷積核都生成一個特征圖,將這些特征圖在深度方向堆疊起來就得到輸出數據,作為下一個卷積層的輸入或進入池化層。
卷積核的理解:
卷積核就是卷積層的參數,是我們要訓練的參數。
筆者對卷積核一個直觀的理解是,訓練好的卷積核相當于特征提取器,他對整個圖進行掃描,并在每個位置留下激活值(相當于該位置擁有某特征的可能性),這些激活值組成的特征圖就相當于某特征分布的概率圖。一個卷積核對應一種特征,使用多個卷積核提取圖像的多個特征后,可以喂給下一層卷積層讓下一層的卷積核提取更深一層的特征(淺層特征間的關系與組合),直到最后可以得到輸入圖像各種類別的可能性。
下面回到卷積層,注意到在卷積層中,有幾個超參數影響著輸出數據的尺寸(至于參數設定,文章最后):
卷積核的大小(F):影響著輸出數據的寬高
卷積核數量(K):影響著輸出數據的深度,卷積核數量與輸出數據的深度在數值上相等
步長(S):影響著輸出數據的寬高,步長越大,輸出數據的寬高越小
零填充(P):零填充指在輸入數據的寬和高兩個維度上用零填充指定寬度。如輸入數據大小為32x32x3,填充為2,則輸入數據大小變為34x34x3。零填充很重要,如果只進行卷積而不使用零填充,那么輸出數據的尺寸會不斷縮小,導致特征丟失
知道這些參數后,根據輸入數據的尺寸W1 ? H1 ? D1,我們有公式計算輸出數據的尺寸W2 ? H2 ? D2:
寬:$W_2 = {(W_1-F+2P)over S}+1$
高:$H_2 = {(H_1-F+2P)over S}+1$
深度:$D_2=K$
其中$(W_1-F+2P)$與$S$、$(H_1-F+2P)$與$S$必須是整除關系,否則意味著卷積核會超出輸入數據的邊界(步長為一肯定沒問題,大于一其他參數就要小心設置了)
每個卷積核有 F ? F ? D1個權重,K 個卷積核,卷積層共有F ? F ? D1 ? K 個權重和K 個偏置值
$$$$
卷積操作的矩陣實現實際應用中,我們很少像上圖一樣在高維數組中迭代點積,因為這樣正向反向傳播都不好做,我們喜歡的還是慣用的矩陣操作。好消息是這是可行的,卷積運算本質上就是在卷積核和輸入數據的局部區域間做點積,利用這一點我們可以把卷積操作轉化為矩陣乘法:
把每個卷積核都展開成行向量(每個深度切片都展開成一行,拼起來獲得一大行)作為卷積核矩陣的一行,獲得矩陣W
把卷積操作的每個點積區域展開成列向量(每個深度切片都展開成一列,拼起來獲得一大列)作為輸入矩陣的一列,獲得矩陣X
這樣卷積操作就相當于X*W這個矩陣乘法了,輸出矩陣X*W的每一行對應某個卷積核獲得的特征圖的展開(輸出數據每個深度切片的展開)
這里只簡單介紹實現,帶圖的詳細說明請看此文章,很不錯
池化層在連續的卷積層之間會周期性地插入一個池化層,它的作用是逐漸降低數據體的空間尺寸(數據降采樣),這樣的話就能減少網絡中參數的數量,使得計算資源耗費變少,也能有效控制過擬合。
池化操作的對象是每一個特征圖,也就是輸入數據的每個深度切片。這里介紹常用的最大池化,對于每一個切片,會有一個掃描空間在寬度和高度上滑過整個切片,在每個位置選出空間內的最大值作為輸出。如上圖,輸入4x4x4的數據,使用最大池化,空間大小2x2,步長為2,則輸出2x2x4的數據。
根據輸入數據的尺寸W1 ? H1 ? D1,空間大小F和步長S,我們有公式計算輸出數據的尺寸W2 ? H2 ? D2:
寬:$W_2 = {(W_1-F)over S}+1$
高:$H_2 = {(H_1-F)over S}+1$
深度:$D_2=D_1$
池化層很少使用零填充
在實際使用中,最大池化通常采用$F=2,S=2$(無重疊,普通池化);較少用的有$F=3,S=2$(有重疊,重疊池化)
除了最大池化外,還有平均池化、隨機池化、lp池化等,這里就不深入了,交給讀者自行了解。在圖像識別這一塊,通常經驗性的使用最大池化(性能好,反向傳播也容易)。
另:一些學者認為可以不使用池化層,轉而使用較大步長的卷積層來代替池化層實現數據尺寸的降低。一些發現也認為在訓練一個良好的生成模型(如變化自編碼器,生成性對抗網絡)時,棄用池化層也是很重要的。這樣看來的話,未來的卷積網絡可能會向無池化層的方向發展
全連接層卷積神經網絡的最后一部分是全連接層組成的網絡(也就是前面講的普通的神經網絡)。圖像數據經過多層卷積層和池化層后,會得到足夠小的特征數據,把特征數據的每個切片展開成向量并拼成一個大向量,便可作為全連接層的輸入,最后輸出類別得分。
全連接層轉化為卷積層任何全連接層都可以被轉化為卷積層。只要把卷積核的尺寸改成和輸入數據尺寸一致就能實現全連接了。
舉個栗子,如上圖,如果最后池化層輸出數據大小為 4x4xD,我們要將其接入一個K = 4096 (神經元個數)的全連接層,則需要4096個尺寸為4x4xD的卷積核,卷積后的到1x1x4096的輸出就對應著那個全連接層中的4096個神經元的值。如果第二個全連接層K=1000,則另需要1000個尺寸為1x1x4096的卷積核,卷積后得到1x1x1000的輸出對應著第二個全連接層中的1000個神經元,如此類推。
這種轉化參數量是沒有改變的,看似沒有好處,但是在下面的情況,這種轉化能使計算高效化
現在有一張大尺寸圖像,我們有一個浮窗,讓浮窗在寬和高上滑過整張圖片,在每個位置浮窗圍住的子圖像將作為卷積神經網絡的輸入,然后網絡輸出該子圖像的評分數據。現在重點來了:
如果這是個原版的卷積神經網絡(帶全連接層),因為網絡中的全連接層上改變了原先數據的維度,導致一次只能輸出某個子圖像的評分數據(向量)。整個過程就需要迭代多次網絡才行
如果這是個改版的卷積神經網絡(全連接層改成卷積層),因為浮窗行為與卷積層的共性,加之沒有全連接層,數據會維持三維結構;只需一次正向傳播便能得到所有評分數據
相比之下,改版的卷積神經網絡更高效,它在每個子圖像的計算中共享了計算資源。
另:這種帶浮窗的設定,就是目標檢測的實現方法,通常在一個大圖像上,在不同的位置會有不同類別的物體,浮窗在每個位置都進行一次識別,就能在一張圖中分辨出多個物體,所謂目標檢測。
組裝卷積神經網絡介紹完各種層的原理后,最后介紹如何用這些層組成一個完整的卷積神經網絡,并解析各層參數的選用
通常卷積層有以下結構:
輸入→→[ [卷積層→→激活函數層]*N →→池化層 ]*M →→[全連接層→→激活函數層]*K→→全連接層→→輸出
池化層是可以不用的,全連接層可以轉化為卷積層。*K、*N、*M 指重復若干次,其中N >=0,通常N<=3;M>=0;K>=0,通常K<3。N越大意味著池化前有更多的卷積層,這個思路適用于更大更深的網絡,因為在執行具有破壞性的池化操作前,多重的卷積層可以從輸入數據中學習到更多的復雜特征。
輸入層:圖像的尺寸應該能被2整除多次,如32,64,96,224等。以方便池化操作
卷積層:
卷積核數量應該為2n ,如64,128,512......
卷積核尺寸推薦選較小的(如3x3,5x5),對應步長使用1。更大的卷積核尺寸(如7x7),通常只用在第一個面對原始圖像的卷積層上
使用零填充,如果步長為1,填充大小 $P =(F-1)/2$ 便能維持輸入輸出的寬高一致
池化層:
通常使用最大池化,并使用2x2空間,步長為2($F=2,S=2$)
較少用的有3x3空間,步長為2,重疊池化($F=3,S=2$)
更大的空間極少用,池化效果太強,容易導致特征丟失
全連接層:就不多說了,就是普通的mlp
本文完:介紹了普通卷積神經網絡的結構。在實際使用上,卷積神經網絡因其不同的結構又細分成不同網絡(如AlexNet,VGGNet,ResNet等),它們都是卷積神經網絡的一種,這些以后再深入
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19796.html
摘要:神經網絡的補充前篇后篇數據預處理權重初始化經典神經網絡搞明白后,我們接下來看看他的變種,也是本系列的主角卷積神經網絡。卷積神經網絡一個普通的卷積神經網絡由各種層按順序堆疊而成,這些層主要分三類卷積層池化層和全連接層。 【DL-CV】神經網絡的補充【DL-CV】數據預處理&權重初始化 經典神經網絡搞明白后,我們接下來看看他的變種,也是本系列的主角——卷積神經網絡(Convolution...
摘要:靚文推薦以上介紹的就是最原始最開始的,也叫,年提出的。在經過多年的改進后也有幾個延伸版本了如使用了的版本,借鑒了的版本,這里也不再細講,只推薦幾篇我認為比較好的靚文各層的詳細設定及其延伸版本更多自尋 咕了一個多月后終于重新變成人,今天我們就來談談 咕咕net(GoogLeNet) 的結構,在下次咕咕(大表哥2)之前掙扎一下。 GoogLeNet初始的想法很簡單,大力出奇跡,即通過增...
摘要:靚文推薦以上介紹的就是最原始最開始的,也叫,年提出的。在經過多年的改進后也有幾個延伸版本了如使用了的版本,借鑒了的版本,這里也不再細講,只推薦幾篇我認為比較好的靚文各層的詳細設定及其延伸版本更多自尋 咕了一個多月后終于重新變成人,今天我們就來談談 咕咕net(GoogLeNet) 的結構,在下次咕咕(大表哥2)之前掙扎一下。 GoogLeNet初始的想法很簡單,大力出奇跡,即通過增...
閱讀 2365·2023-04-25 20:07
閱讀 3303·2021-11-25 09:43
閱讀 3662·2021-11-16 11:44
閱讀 2529·2021-11-08 13:14
閱讀 3177·2021-10-19 11:46
閱讀 895·2021-09-28 09:36
閱讀 2975·2021-09-22 10:56
閱讀 2374·2021-09-10 10:51