文章目錄
- 引言
- 為什麼進行執行個體分析
- 經典網絡
- LeNet-5
- AlexNet
- VGG-16
- 殘差網絡(ResNets)
- 殘差塊(Residual block)
- 殘差網絡為什麼有用
- 網絡中的網絡以及1x1卷積
- Inception網絡簡介
- 完整的inception網絡
- 遷移學習
- 資料擴充
- 參考
引言
本文是吳恩達深度學習第四課:卷積神經網絡。本次課程将會告訴大家如何構造卷積神經網絡并應用到圖像資料上。從中你會學到如何建構一個卷積神經網絡、如何應用卷積神經網絡到圖像識别和目标檢測上、學習如何使用神經風格轉換去生成藝術作品、能将這些算法應用到更廣泛的圖像應用上,比如2D、3D資料和視訊。
第四課有以下四個部分,本文是第一部分。
- 卷積神經網絡基礎
- 深度卷積模型:執行個體分析
- 目标檢測
- 特殊應用:人臉識别&神經風格轉換
為什麼進行執行個體分析
上篇文章中我們了解了卷積網絡的基本構件,如卷積層、池化層以及全連接配接層這些元件。
如果把這些元件組合起來,形成有效的卷積神經網絡一直都廣受研究,受到啟發的最好方法就是取看一些執行個體。
我們會看幾個經典的網絡和殘差網絡(它可以訓練一個深達152層的神經網絡)。
經典網絡
LeNet-5
出自論文 Gradient-Based Learning Applied to Document RecognitionLeNet-5可以識别這樣一個灰色手寫數字。 它的結構是這樣的,先是 個 的過濾器,步長為1;然後是一個平均池化,在這篇論文的那個時代,平均池化還是比較常用的,現在一般用最大池化。
注意這裡,會讓尺寸縮小一半。
根據公式。
它輸出了的矩陣。這裡的因為用了個過濾器。
最後連接配接到FC(全連接配接層)中,這個FC中有120個節點,它的輸入次元是。
然後再連接配接一個84個節點的FC,最後連接配接一個類似softmax的節點得到10個輸出。
這個網絡隻有6萬個參數,而如今的網絡一般有千萬到億萬級别的參數。
我們從這個網絡可以看出一些規律,比如随着網絡的加深,圖像的寬度和高度都在縮小,通道數在增多。
這個網絡還有一種結構經常被用到,就是一個或多個卷積層後面跟着一個池化層,然後又是若幹個卷積層跟着池化層,接着是全連接配接層,最後是輸出。
AlexNet
出自ImageNet Classification with Deep Convolutional Neural Networks
AlexNet以(實際上是)的圖像作為輸入,
第一層用96個步長為的過濾器。
後面的結構直接貼出來了。
最終的輸出是目标可能是1000類中的哪一類。
這個網絡與LeNet-5很相似,但是更大。LeNet-5有6萬個參數,而AlexNet大約有6千萬個(60M)參數。
AlexNet比LeNet-5要好的一點是AlexNet使用了ReLU作為激活函數,而AlexNet使用的是Tanh。
VGG-16
VGG-16結構更簡單,更關注的是卷積層。
首先是,步長為的過濾器,padding參數為same。然後用一個,步長為的過濾器建構最大池化層。
輸入是一個的圖像,接着是連續兩個卷積層,都是64個步長為1的過濾器。這裡的表示連續個的意思。這裡padding參數為same,是以得到了同樣大小的輸出,
接着是64個,步長為的最大池化層,得到的輸出大小為。
完整結構是下面這樣的:
VGG-16中的16說的是該網絡有16層帶權重的層。該網絡共有1億3千8百分個參數,但是結構簡單,組成有規律。
有幾組卷積層,然後是池化層,用池化層來降低高和寬。
而過濾器的大小由變成了,再到,最後到就不繼續增大了。
殘差網絡(ResNets)
來自 Deep Residual Learning for Image Recognition
非常深的網絡通常是很難訓練的,因為存在梯度消失和梯度爆炸的問題。
本節你将學到跳躍連接配接(skip connection),它能讓你從某一層中得到激活然後迅速回報給另一層,甚至是更深層。
我們可以利用跳躍連接配接建構能夠訓練深度網絡的ResNets,有時深度能超過100層。
殘差塊(Residual block)
殘差網絡由殘差塊構成的,
這是一個兩層神經網絡,在層進行激活,然後在層再次進行激活,兩層之後得到。
首先是,經過線性計算再通過非線性激活(ReLU)得到。
換句話說,資訊流從到,要經過上面所有步驟,稱為主要路徑(main path)。
而在殘差網絡中有一點變化,直接把拷貝到神經網絡的深層。
如紫線所示,稱為捷徑(short cut),在ReLU計算前加上。
最後通過來計算,也就是産生了一個殘差塊。
插入的時機是在紅框框出網絡層中的單元線性激活之後,計算ReLU之前,就如公式所描述的。
是以建構一個ResNet網絡就是通過很多這樣的殘差塊,堆疊到一起,形成一個深度神經網絡。
把下面這個普通神經網絡(plain network)改成殘差網絡的方法是加上所有的跳躍連接配接。
如下圖所示,每兩層加一個捷徑,構成殘差塊:
是以上圖就有5個殘差塊。
如果使用梯度下降法訓練一個普通網絡,你會發現随着層數的增加,訓練誤差先是減少然後會增多。
而殘差網絡會随着網絡的加深,訓練誤差一直減少。
這種方式确實能幫助解決梯度消失和梯度爆炸的問題,讓我們再訓練更深網絡的同時,又能保證良好的性能。
殘差網絡為什麼有用
假設你有一個很深的神經網絡,輸出是。然後你想增加兩層,得到輸出。
這兩層做一個殘差塊,假設這個網絡使用ReLU作為激活函數,并且所有的激活值都。
由上節可知,的計算公式。把展開:
如果使用L2正則化或權重衰減,會壓縮的值。這裡假設。
然後上式就等于,因為假設所有的激活值都,且激活函數是ReLU,是以結果就位。
結果表明,殘差塊學習這個恒等式函數()很簡單,這意味着,即使給神經網絡增加了這兩層,它的效率也并不比更簡單的神經網絡差。
是以給大型網絡增加兩層,不論是把殘差塊添加到神經網絡的中間還是末端位置,都不會影響網絡的表現。
我們的目标不僅僅是保持網絡效率,而要提升它的效率。如果這些隐藏層單元學到一些有用資訊,那麼它可能比學習恒等函數表現得更加好。
而不含有殘差塊的普通網絡,當網絡加深時,它就很難選擇參數來學習,即便是恒等函數也很難,這也是為什麼有更多層的普通網絡會使你的結果更糟而不是更好。
殘差網絡有效的主要原因是這些額外的層學習起恒等函數非常簡單,幾乎總能保證它不會影響總體的表現,甚至很多時候還可以提升網絡的表現。
另外一個值得探讨的細節是,假設與具有相同次元,是以ResNets使用了很多padding為same的卷積,進而實作了這個跳躍連接配接。
如果輸入和輸出有不同的次元,假設的次元是,而的次元是,那麼你再增加一個次元的矩陣,可以由網絡通過學習得到。
網絡中的網絡以及1x1卷積
在設計卷積網絡結構時,其中有一種很有用的想法是用的卷積,
上面箭頭所指的是的卷積,把原圖和卷積,這裡就是把原圖元素值都擴大兩倍。
看起來似乎沒啥用,但這隻是一通道的例子。如果有一個的矩陣,那麼和以個的過濾器做卷積會更有意義。
這裡卷積所實作的功能是,周遊這36個單元,計算左邊的32個數字和過濾器中的32個數字的内積,然後将一個ReLU作用于它。
以這36個位置中的一個為例,比如這個立方體中的這一面,将立方體中的這36個數乘以卷積中的這一條,最後會得到一個實數,就是其中的一個輸出值(假設在下圖右邊輸出矩陣中的綠點)。
你可以這樣了解這個中的32個數,類似于你有一個神經元,接收一個32次元的輸入向量,和32個權重相乘,然後代入ReLU函數,就得到對應的輸出值。
通常,如果你不止有1個過濾器,而有多個過濾器,最終會得到的輸出量,這裡的是過濾器數量。
是以的過濾器本質上是一個全連接配接神經網絡,它接收32個數的輸入,然後輸出過濾器個數的輸出值。然後對這36個位置中的每一個都進行相同的操作。
最終得到的輸出矩陣。
這個想法被稱為卷積,有時也被稱為網絡中的網絡。
舉一個卷積有應用價值的例子。
假設你有一個的立方體,如果你想縮小它的高度和寬度,你可以使用一層池化層。但這裡我們想縮小通道數。我們要怎麼做才能縮小到呢。
那麼你可以使用32個的過濾器,每個過濾器的大小是。
但由于你使用了32個過濾器,得到的輸出将會是的立方體,是以這是一種可以讓你縮小通道數的方法。
而池化層隻可以用來縮小高度和寬度。
如果你想保持通道數不變也是可以的(這裡使用192個的過濾器即可),卷積隻是添加了非線性函數,讓網絡學習到更加複雜的函數。
Inception網絡簡介
Inception網絡的作用是,它可以幫助我們确定卷積層中的過濾器大小,甚至可以确定是否需要建立卷積層或池化層。
假設有一個的輸入層,首先如果使用的卷積層,那麼輸出就會是的一個結果。假設輸出為。
接下來如果使用的過濾器,那麼輸出是。
然後我們把第二輸出堆疊到第一個上面,為了比對次元,我們使用padding為same的卷積,是以輸出依然是。
假設再堆疊一個的卷積輸出。
此時可能你不想用卷積了,那使用最大池化操作,也得到另一個輸出堆疊上去。
這就是inception子產品,你可以輸入某個量并且獲得一個輸出。
把輸出最後一個次元加起來,,是以你有一個inception子產品,輸入是,
輸出是。
這個網絡的一個特點是,你不用去設定一個卷積核的大小,或決定是否需要池化,而是由網絡自行确定這些參數。你可以給網絡添加這些參數的所有可能的值,然後把這些輸出連接配接起來,讓網絡自己學習它需要什麼樣的參數、使用什麼樣的過濾器組合。
但是這裡會出現一個問題:計算成本問題。我們看一下上面這個卷積的計算成本是多少。
使用32個same的卷積,得到的輸出。
我們來計算一下成本,有32個卷積,每一個卷積的大小是。因為輸出大小為,是以你需要計算這麼多的數。
每一個要做的乘法數是,是以做乘法的總數是:
(這裡的M是百萬的意思,120M是1.2億)。
接下來我們來看一下另一種結構,它同樣接受的輸入,并且輸出大小為。
先用16個的卷積,得到的輸出大小為。
然後用32個的卷積得到最終輸出。
在這種方法中,我們先将這個較大的輸入減少成一個較小的中間值,然後再變成最終輸出大小。
現在我們再來看一下這次的計算成本。
我們用16個的卷積,它生成的計算成本是
。
那麼第二個運算的成本,
是以總的成本是12.4M次乘法,就是1240次乘法。這種方法的成本大約是第一種方法的1/10。
完整的inception網絡
在上小節中我們已經看到了inception網絡的基礎子產品,在這小節我們将學習如何将這些子產品組合起來,以建構你自己的inception網絡。
Inception子產品會将前一層的輸出作為它的輸入,我們上小節分析過的例子是,先通過一個的層,再通過一個的層。
然後為了減少的卷積層的運算量,你也可以做相同的操作。
然後或許你想直接通過一個的卷積層,
最後還有一個池化層,
為了能在最後将這些輸出都連接配接起來,我們會使用same類型的padding來池化,使得輸出的高和寬不變。這樣才能将它與其他輸出連接配接起來。
要注意的一點是,如果你進行的是最大池化,即使使用了same padding,,步長為1,它的輸出這裡将會是,它的通道數或者說深度與輸入相同。
是以看起來有很多通道,是以這裡需要再加(32個)的卷積來将通道數減少。
最後的最後,将這些塊全部連接配接起來,把這些塊的通道數都加起來,最後得到一個的輸出。
這就是一個Inception子產品,Inception網絡所做的就是将這些子產品組合到一起。
Inception網絡中有很多個Inception子產品,任意放大一個子產品都是我們上面看到過的那種。
在論文中這裡其實還有一些分支,這些有什麼用呢。在網絡的最後幾層通常是全連接配接層,之後是一個softmax層。
這些分支所做的就是通過隐藏層,來作出輸出,其實這就是一個softmax輸出。
它確定了即使是隐藏單元和中間層,也參與了特征計算,也能預測圖檔的分類。
這在Inception網絡中可以防止發生過拟合。
我們已經學習了不少的神經網絡結構,下面我們來學習如何使用這些算法。
很多深度學習的研究者都把自己的成果作為開源項目放到Github之類的網站上,是以當你想實作某篇論文中的算法前,建議你先去搜尋一下有沒有開源的實作。
遷移學習
我們之前已經讨論過遷移學習,在計算機視覺研究社群,有很多資料集,比如ImageNet。
并且有大量的計算機視覺研究者已經能使用這些資料集訓練過他們的算法了,有時候這些訓練過程需要花費好幾周,并且需要很多GPU。并且經過了痛苦的優化階段。
遷移學習告訴你,你可以直接使用别人花費時間和精力做出來的開源權重參數,把它當做一個很好的初始化,用在你自己的網絡上。用遷移學習把公共的資料集的知識,遷移到你自己的問題上。
我們來舉個例子看要怎麼做。
還是貓分類器,假設你的貓叫Tigger和Misty或其他名字,是以你有一個三分類問題。識别一張圖中究竟是Tigger還是Misty或者都不是。現在你可能沒有足夠多的Tigger或Misty的照片,這樣你的訓練集很小。這是你能做什麼呢,建議你從網上下載下傳一些開源神經網絡的應用。
你不僅要把代碼下下來,還要把權重下載下傳下來。
有許多訓練好的網絡都可以下載下傳,就來ImageNet資料集來說,它有1000個類别。
是以這個網絡會有一個Softmax單元,輸出1000個中可能的類别。你可以去掉這個Softmax層,然後建立你自己的Softmax單元,來輸出Tigger/Misty/其他。
然後建議你當機前面這些層的參數。
隻訓練自己softmax層的參數,通過别人訓練好的權重,可以讓你哪怕在很小的資料集上也可能得到很好的效果。
很多機器學習架構支援這種做法,可以讓你選擇是否訓練某些相關層的權重。
如果你的資料集很小可以這麼做,要是有一個更大的資料集要怎麼辦。
根據經驗,這種情況你可以當機更少的層,然後訓練後面的層。
有一個規律是,你的資料集越大,你需要當機的層數就越少。
如果你有一個非常大的資料集,還是可以用開源網絡的權重作為初始化來訓練整個網絡。
資料擴充
現在大多數的計算機視覺任務都需要很多的資料,是以資料增強是經常使用的一種技巧。
在計算機視覺中,最簡單的資料增強方法就是鏡像翻轉。
另一個是随機裁剪,其實它并不是一個完美的方法。如果你随機裁剪下來的剛好是看起來不像貓的部分。如下圖紅框所示。
但是實際上随機裁剪效果還不錯。
還有其他方式,像旋轉、剪切圖像、局部扭曲等等。
第二種經常使用的類型是色彩轉換。
可以給一張圖檔的RGB增加或減少不同的值,得到色彩不一的圖像。這種方式其實是模拟陽光效果,有時暗淡有時明亮。
你可能有存儲好的資料,如果你的資料集不大,那麼無所謂。
如果你的資料集特别大,那麼你可能會使用CPU線程,它不停的從硬碟中讀取資料,你可以用CPU線程來實作扭曲。 可以是随機裁剪、顔色轉換或鏡像。