引言
本文將進一步探討有關卷積神經網絡的更多細節,註:以下文章中部分內容較為複雜,為了保證其簡明性,部分內容詳細解釋的研究文獻會標註在後。
步幅和填充
讓我們看回之前的轉換層,在第一部分中我們提到過過濾器、接受場。現在,我們可以通過改變2個主要參數來校正每一層的行為。在選擇過濾器大小之後,我們也必須選擇「步幅」和「填充」。
步幅控制著過濾器如何進行卷積。在第一部分中我們有提到一個例子,過濾器圍繞輸入體量通過一次移動一個單位進行卷積。過濾器移動的總量即步幅。步長通常以一個方法進行設置使輸出量是一個整數,而不是一個分數。讓我們看看一個例子,想像一個7×7輸入體量,一個3×3過濾器(出於簡化角度考慮忽略第三維度),另外還有一個步幅1。這個就是我們習慣的情況。
是不是和之前的一樣?你還可以嘗試猜測下當步幅增加到2,輸出量會發生什麼情況。
因此,正如你所看到的那樣,接受場正在以2個單位進行移動,同時輸出量也會減少。注意如果我們試圖將我們的步幅設置為3,那麼其在間距和確保接受場適合的輸入量兩個方面會出現問題。通常情況下,如果程式設計師希望接受場重疊更少以及更小的空間尺寸的話,他們通常會增加步幅。
現在我們來接著關注填充,在正式開始之前,讓我們設想一個場景。當你將三個5×5×3的過濾器應用到一個32×32×3的輸入體量中時會發生什麼?
注意空間維度會降低。當我們持續應用卷積層時,體量的大小將減少得比我們想的快。在我們神經網絡的早期層中,我們要保存儘可能多的原始輸入信息,以便我們可以提取這些低階特徵。我們想要應用同樣的卷積層,但我們想將輸出量保持在32 x 32 x 3。要做到這個,我們可以將大小為2的零填充(zero padding)應用到該層。零填充(zero padding)在邊界周圍填充了值為零的輸入量。如果我們考慮大小為2的零填充(zero padding),那麼這將導致在一個36×36×3輸入量。
如果有1的步幅並且將零填充(zero padding)的大小設置為
K是過濾器大小,輸入和輸出量將會一直保持同樣的空間維度
對於任何給定的卷積層輸出大小的計算公式
O是輸出大小,K是過濾器大小,P是填充,S是步幅。
選擇超參數
我們怎麼確定需要用多少層、多少卷積層、過濾器的大小是什麼,或者步幅和填充的值?這些都是重要的問題,並且沒有一套所有的研究人員都在使用的標準。這是因為神經網絡在很大程度上取決於你所擁有的數據類型。數據大小因為圖像的複雜性、圖像處理任務的類型以及更多因素而千差萬別。當你看著自己的數據集時,選擇超參數的一種方式是發現在一個適當的範圍創造圖像抽象的正確組合。
修正線性單元(ReLU)層
在每個卷積層後,習慣在其後馬上添加一個非線性層(或激活層)。這一層的目的是將非線性引入系統,基本上是在卷積層進行線性運算(只是元素的乘法和累加)。在過去都是像tanh 或者sigmoid的線性算法,但研究人員發現ReLU層效果更好,因為網絡訓練速度能加快很多(因為計算效率)且精度沒有顯著差異。它也有助於緩解消失的梯度問題,這是因為網絡訓練較低層的速度非常緩慢,梯度通過不同的層級指數下降。ReLU層的採用的函數f(x)= max(0,x)所有值的輸入量。基本上,這一層將所有的負激活變成了0。這一層提高了模型的非線性特性,且整體網絡不影響卷積層的接受場。感興趣的還可以參看深度學習之父Geoffrey Hinton的論文Geoffrey Hinton
池化層(Pooling Layers)
經過一些ReLU層之後,程式設計師可以選擇池化層,它也被稱為下採樣層。在這一類別中,也有幾種層可供選擇,但maxpooling(最大池化層)是最受歡迎的。它需要一個過濾器(通常大小2x2)和一個相同的步幅長度,然後將其應用在過濾器卷積周邊每一個分區的輸入和輸出的最大量處。
池層的其他選項(pooling layers)還有是平均池(average pooling)和 L2-norm pooling。這層背後的原因是一旦我們知道一個特定的特性是其原始輸入量(將有一個高激活值),那麼其確切位置不重要的。可以想像,這一層大大降低了輸入體積的空間維度(長度和寬度的變化,但不是深度)。這樣做有兩個主要目的,首先是參數或權重的量減少了75%,從而降低了計算成本。其次,它能夠控制過度擬合。這個術語是指當一個模型針對訓練例子如此調整的話,它是不能夠概括驗證和測試集的。過度擬合的特徵是有一個模型能得到100%或99%的訓練集,但只有50%的測試數據。
降層(Dropout Layers)
降層在神經網絡中有一個十分特別的功能。在上一節中,我們討論了過度擬合的問題。在訓練之後,網絡的權重被調整到給定的訓練樣本上,這樣的話當給定新的樣本時神經網絡的表現並不好。降層這個理念在自然中過分單純的。
降層通過在前向傳播過程中將其設置為零在該層中隨機「拋棄」一些激活,就是這麼簡單。在這個過程中這樣做有什麼好處呢?在某種程度上,它迫使網絡變成「多餘」的。即使一些激活在過程中被拋棄,神經網絡也應該能夠對特定樣本提供正確的分類或者輸出。它確保網絡對於訓練數據不會過於「合適」,從而有助於緩解過度擬合的問題。重要的一個這一層只在訓練過程中使用,而不是在測試中。
網絡層網絡
網絡層網絡指的是一個使用1 x 1大小的過濾器的卷積層。現在,第一眼你可能會想知道為什麼這種類型的層會有幫助,因為接受場通常是大於他們映射空間的。然而,我們必須記住這些1x1卷積跨度有一定的深度,所以我們可以認為它是一個1 x 1 x N的卷積,其中N是該層中過濾器應用的數量。實際上這層是執行一個N-D 元素級的相乘,其中N是輸入量成層深度。
分類,定位,檢測,分割
在這節中我們使用第一部分曾提到過的例子,來看一下圖像分類任務。圖像分類任務是將輸入圖像識別並輸入一系列的圖像類別的過程,然而當我們將對象定位作為任務時,我們的工作不僅是得到一個分類標籤,另外還需要劃定一個對象在圖像中的範圍。
同樣還有對象檢測任務,需要將圖像中所有對象進行圖像定位任務。因此,在圖像中將會有多個劃定範圍還有多個分類標籤。
最後,還有對象分割任務,對象分割任務指的是輸出一個類的標籤,以及輸入圖像中的每一個對象的輪廓。
遷移學習(Transfer Learning)
目前在深度社區的一個常見的誤解是:沒有谷歌那樣的數據量的話,不可能建立一個有效的深度學習模型。雖然數據確實是創建神經網絡的一個重要組成部分,但是遷移學習的理念能夠有助於減少數據的需求。遷移學習是經過一個預先訓練的模型(網絡的權重和參數已通過一個大數據集或者別人訓練),並且用你自己的數據集進行「微調」的過程。這個理念就是預先訓練的模型將作為一個特徵提取器,將網絡的最後一層刪除並用自己的分類器替換它(取決於您的問題空間)。然後凍結所有其他層的權重,並正常訓練網絡(凍結層意味著在梯度下降/優化過程中能夠不改變權重)。
讓我們來弄清楚為什麼這樣會有用,舉例來說我們在ImageNet上的預先訓練模型(ImageNet是一個數據集,包含超過1000類的1400萬幅圖像)。當我們考慮網絡的低層時,我們知道他們會檢測到邊緣和曲線等特徵。現在除非你有一個非常獨特的問題空間和數據集,你的網絡也會需要檢測曲線和邊緣。與其通過一個隨機初始化的權重來訓練整個網絡,我們可以使用預先訓練的(並凍結)模型的權重,並專注於更重要的(更高的)層級的訓練。如果你的數據集與ImageNet等完全不同,那麼你就要多培養你的層並凍結一些低級層。
PS : 本文由雷鋒網(公眾號:雷鋒網)獨家編譯,未經許可拒絕轉載!
via Adit Deshpande
雷鋒網原創文章,未經授權禁止轉載。詳情見轉載須知。