手把手教你理解卷积神经网络
摘要:?卷積神經網絡是一種識別和理解圖像的神經網絡。本文將從不同的層次來介紹卷積神經網絡。
? ??手把手教你理解卷積神經網絡(一)
? ? ? ? ?本文將繼續為你介紹關于卷積神經網絡的知識。為了保持文章的簡潔性和全面性我將為你提供研究論文的鏈接,里邊會有更為詳細的解釋。
確定寬度和填充(Stride and Padding)
讓我們看看轉換層,還記得濾波器、接受域和卷積嗎?現在我們可以改變兩個主要參數來修改每層的運行狀態。在選擇濾波器大小之后,還要選擇寬度和填充。
用寬度來控制濾波器如何在輸入量的上下范圍內進行卷積。例如,一個7*7的輸入量,一個3*3的濾波器(忽略第三維度的簡單性),寬度為1。
?
看看你是否能盡力猜出隨著寬度增加到2,輸出量會發生什么變化。
?
因此,正如你所看到的那樣,接受域現在在兩個單元之間來回變換,并且輸出體積也縮小了。請注意,如果我們試圖將寬度調整為3,那么我們就有間隔的問題了,還要確保接受域適合輸入量。通常來說,開發者如果希望接受域重疊較少,并且希望有較小的空間維度,則會增大寬度。
讓我們看看填充部分,但是在開始之前,讓我們考慮一個場景。當你把三個5*5*3的濾波器應用到一個32*32*3的輸入量時會發生什么呢?輸出量會是28*28*3。注意,空間維度減少了。當我們保持應用轉換層時,輸出量的大小將比我們想象的減少的快。在我們網絡的前面的那些層中,我們想盡可能多地保存原始輸入量的信息,這樣我們就可以提取那些低級的特性了。這樣說吧,我們想應用同樣的轉換層,但想要的輸出量要保持在32 x 32 x 3。要做到這一點,我們可以對該層應用一個大小為2的零填充。零填充在邊界上以零為輸入的量。如果我們考慮兩個中的一個零填充,那么這將會導致一個36*36*3的輸入量。
?
如果你有一個為1的寬度,并且你把零填充的大小設置為:
當濾波器的大小為K時,輸入量和輸出量將始終具有相同的空間維度。
對于任何給定的轉換層的輸出量的計算公式是:
上面的公式中,O是輸出的高度/長度,W是輸入的高度/長度,K是濾波器的大小,P是填充,S是寬度。
選擇參數(Choosing Hyperparameters)
我們如何知道用了多少層,有多少轉換層,濾波器的大小是多少,或者寬度和填充是什么值呢?這些問題我們都不知曉,因為網絡將在很大程度上依賴于你的數據類型。數據可以根據大小、圖像的復雜度、圖像處理任務的類型以及更多的不同因素而變化。當看著你的數據集時,一個考慮如何選擇參數的方式是在一個適當的規模找到正確的創建圖像抽象的組合。
ReLU (被調整的線性單元)層
在每個轉換層的后面,就是常規的應用非線性層(或激活層)。這一層的目的是非線性地引入一個系統,這個系統基本上是在轉換層一直計算線性操作(只是元素方式的乘法和加法運算)。
在之前,一直用的是非線性函數,如tanh和sigmoid,但研究人員發現ReLU層的效率遠遠更好,這是因為在對精度沒有產生顯著不同的情況下,網絡能訓練的更快(因為計算效率更高)。它也有助于緩和消失梯度的麻煩,這是一個問題,因為較低層的網絡訓練是非常緩慢的,因為在這些層里梯度呈指數級別的下降層(解釋這個問題可能超出了本文的范圍,點擊這里和這里來查看具體的解釋和描述)。ReLU層調用函數f(x)= max(0,x)來提供輸入量的所有值。基本上來說,這一層剛好改變所有的負激活為0。這一層在不影響轉換層的接受域的情況下,提高了模型和整個網絡的非線性的屬性。
池化層(Pooling Layers)
經過一些ReLU層,開發者可以選擇應用一個池化層,它也被稱為縮減采樣層。在這一類別中,也有其它幾個層的選擇,與最大池化(maxpooling)一起是最受歡迎的。這基本上需要一個濾波器(通常大小為2*2)和相同尺寸的寬度。然后將其應用于輸入量和在每個有濾波器卷積的子區域中輸出的最大數量。
?
池化層的其他選項是平均池化和L2-norm池化。這個層背后的直觀理解是,一旦我們知道一個特定的特征是在原始輸入量中(將會有一個高激活值),它的確切位置并不像它相對于其它特征的位置那么重要。可以想象,這一層極大地減少了輸入量的空間維度(長度和寬度的變化,而不是深度)。這有兩個主要目的。首先,參數或權重的數量減少了75%,從而降低了計算的成本。其次,它將控制過度擬合,這指的是當一個模型被調整到訓練樣本時,它不能很好地為驗證和測試集進行標準化。過度擬合的表現是,有一個模型,在訓練集上得到100%或99%的表現,但在測試數據上只有50%。
Dropout Layers
現在,Dropout Layers在神經網絡中有一個非常特殊的功能。在上一節中,我們討論了過度擬合的問題,訓練結束后,網絡的權重被調整到了已給的訓練樣本,當提供了新的訓練樣本時網絡就執行的不那么好了。Dropout的想法在本質上是過于簡單化的。這一層“刪除”一個隨機激活集,通過將它們設置為零。即使某些激活被刪除了,網絡也應該能夠為特定的樣本提供正確的分類或輸出。它確保網絡變得不“適合”訓練數據,從而有助于緩解過度擬合的問題。一個重要的注意事項是,這一層僅用于訓練期間,而不是在測試期間使用。
網絡層的網絡(Network in Network Layers)
網絡層的網絡指的是一個應用1 x 1大小的濾波器的轉換層。首先,既然接受域通常要比它們映射到的空間大,你可能想知道為什么層的類型會有幫助。然而,我們必須記住,這些1x1卷積的跨度是有一定深度的,所以可以認為它是一個1 x 1 x N的卷積,其中N是濾波器在這一層中應用的數量。
分類、定位、檢查、分割(Classification, Localization, Detection, Segmentation)
當我們執行一個類似于對象本地化這樣的任務時,不僅僅是生成一個類標簽,還包括一個用來描述對象在圖片中位置的包圍盒(bounding box)。
?
我們也有對象檢測的任務,需要對圖像中的所有對象進行定位。因此,將有多個包圍盒和多個類標簽。
最后,我們還進行了對象分割,其中的任務是輸出一個類標簽以及一個輸入圖像中每個對象的輪廓。
?
遷移學習(Transfer Learning)
現在,在深度學習社區的一個常見的誤解是:沒有超大的數據量,你不可能創建有效的深度學習模型。數據固然是創建網絡的關鍵部分,但也不是決定部分,遷移學習的思想有助于減少數據需求。遷移學習是接受預訓練模型(由其他人在大數據集上訓練過的網絡的權重和參數)并用自己的數據集對模型進行“微調”的過程。這個想法是這個預先訓練的模型將作為一個特征提取器。你將刪除網絡的最后一層,并用自己的分類器來代替。然后凍結所有其它層的權重,并正常地訓練網絡(凍結這些層意味著在梯度下降/優化過程中不改變權重)。
我們正在探討的是預訓練模型在ImageNet上訓練(ImageNet是一個數據集,在1000以上個類里包含1400萬幅圖像)。當考慮網絡上那些較低的層時,我們知道它們將檢測到像邊緣和曲線這樣的特征。現在,除非你有一個非常獨特的問題空間和數據集,你的網絡也將需要檢測曲線和邊緣。與其通過一個隨機的權重初始化值來訓練整個網絡,我們可以使用預訓練模型的權重,并致力于在更重要的層(更高的層)上進行訓練。如果你的數據集與ImageNet完全不同,那么你就要訓練更多的層并凍結兩個較低的層。
數據擴展技術(Data Augmentation Techniques)
現在,我們可能對數據在卷積神經網絡中的重要性沒什么感覺了,因此讓我們談論一下讓你的數據集變大的方法,僅僅是用兩個簡單的變換。正如我們前面提到過的,當計算機用一個圖像作為輸入時,它將輸入一個像素值的數組。假設整個圖像被左移1個像素。對你和我來說,這個變化是潛移默化的。然而,對于一個計算機來說,這一改變可能相當地重要,因為圖像的分類或標簽不會改變,而數組改變了。以改變數組表示的方式改變訓練數據的方法,同時保持標簽相同,稱為數據擴展技術。這是一種人工擴展數據集的方法。人們使用的一些流行的擴展是灰度、水平翻轉、垂直翻轉、隨作物、色恐慌、平移、旋轉等等。通過將其中的兩個轉換應用到訓練數據中,你就可以輕松地將訓練樣本的數量擴大一倍或三倍。
?以上為譯文。
文章原標題《A Beginner's Guide to Understanding Convolutional Neural Networks》,
譯者:Mags,審校:袁虎。
原文鏈接
干貨好文,請關注掃描以下二維碼:
總結
以上是生活随笔為你收集整理的手把手教你理解卷积神经网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac 神兵利器(三) 使用Intell
- 下一篇: 阿里云Quick BI——让人人都成为分