吴恩达老师深度学习视频课笔记:深度卷积网络
????????Why look at case studies?:過去幾年,計算機視覺研究中的大量研究都集中在如何把卷積層、池化層以及全連接層這些基本構件組合起來形成有效的卷積神經網絡。找感覺最好的方法之一就是去看一些案例,就像很多人通過看別人的代碼來學習編程一樣。實際上,在計算機視覺中表現良好的神經網絡框架往往也適用于其它任務。也就是說,如果有人已經訓練或者計算出擅長識別貓、狗、人的神經網絡或者神經網絡框架,而你的計算機視覺任務是構建一個自動駕駛汽車,你完全可以借鑒別人的神經網絡框架來解決自己的問題。經典網絡(classic networks)包括:LeNet-5、AlexNet、VGG。ResNet又稱殘差網絡是一個152層的神經網絡。Inception。
????????經典網絡:LeNet-5、AlexNet、VGGNet.
????????LeNet-5:假設有一張32*32*1的圖像,如下圖所示,LeNet-5可以識別圖像中的手寫數字。LeNet-5是針對灰度圖訓練的。第一層使用6個5*5的過濾器,步幅為1,padding為0,輸出結果為28*28*6,然后進行平均池化操作,過濾器的寬度為2,步幅為2,輸出是一個14*14*6的矩陣。接下來是卷積層,用一組16個5*5的過濾器,步幅為1,padding為0,輸出為10*10*16的矩陣,然后又是池化層,過濾器的寬度為2,步幅為2,輸出為5*5*16的矩陣。下一層是全連接層,在全連接層中有400(5*5*16)個節點,每個節點有120個神經元,接下來又是一個全連接層,有84個神經元,然后得到最后的輸出預測y’的值,y’有10個可能的值,對應識別0--9這10個數字。在現在的版本中,使用softmax函數輸出10種分類結果。
????????AlexNet:首先用一張227*227*3的圖像作為輸入,如下圖所示,第一層使用96個11*11的過濾器,步幅為4,輸出為55*55*96,然后用一個3*3的過濾器構建最大池化層,步幅為2,輸出為27*27*96;接著再執行5*5的卷積,采用same padding,輸出為27*27*256,然后在進行最大池化,過濾器為3*3,步幅為2,輸出為13*13*256;再執行一次與上一步相同的卷積,相同的padding,輸出為13*13*384,再作一次3*3相同卷積,輸出為13*13*384,再作一次同樣的操作,輸出為13*13*256,最后再進行一次最大池化,輸出為6*6*256即9216個單元;然后是兩個全連接層,神經元數分別為4096,4096;最后使用softmax函數輸出識別的結果,看它究竟是1000個可能對象中的哪一個。
????????VGG-16:VGG也叫VGG-16網絡,它沒有那么多超參數,卷積層過濾器為3*3,步幅為1,采用same padding,池化層采用最大池化,f為2*2,步幅為2*2,VGG-16簡化了神經網絡結構。假設224*224*3作為輸入,如下圖所示,在最開始的2個卷積層,用64個3*3的過濾器進行卷積,輸出為224*224*64,接下來池化層,輸出為112*112*64;然后又是2次卷積層,使用128個過濾器,輸出為112*112*128,然后進行池化,輸出為56*56*128;然后又是3個卷積層,使用256個過濾器,輸出為56*56*256,然后進行池化,輸出為28*28*256;然后再進行3次卷積,在池化;在進行3次卷積,在池化,將最后得到的7*7*512的特征圖進行全連接操作,得到4096個單元,然后進行softmax激活,輸出從1000個對象中識別的結果。VGG-16的這個數字16,是指在這個網絡中包含16個有權值的層。
????????殘差網絡(Residual Networks, ResNets):非常非常深的網絡是很難訓練的,因為存在梯度消失和梯度爆炸問題。跳遠連接(skip connections),它可從某一網絡層獲取激活,然后迅速反饋給另外一層,甚至是神經網絡的更深層。我們可以利用跳遠連接構建ResNets,它使我們可以訓練非常深的網絡,有時深度能夠超過100層。ResNets是由殘差塊(residual block)構建的。所謂殘差塊,如下圖所示,這是一個兩層神經網絡,在L層進行激活,得到a[l+1],再次進行激活得到a[l+2]。計算過程從a[l]開始,首先進行線性激活得到z[l+1],然后通過ReLU非線性激活得到a[l+1];接著再次進行線性激活得到z[l+2],最后通過ReLU非線性激活得到a[l+2]。換句話說,信息流從a[l]到a[l+2],需要經過以上所有步驟。在殘差網絡中有一點變化,我們將a[l]直接快進拷貝到神經網絡的深層,在應用ReLU非線性激活前加上a[l],這是一條捷徑(shortcut),a[l]的信息直接到達神經網絡的深層,不再沿著主路徑傳遞,等式a[l+2]=g(z[l+2])變為a[l+2]=g(z[l+2]+a[l]),也就是加上的這個a[l]產生了一個殘差塊。a[l]插入的時機是在線性激活之后ReLU激活之前。有時候,除了shartcut,還有另一個術語”跳遠連接(skip connection)”,就是指a[l]跳過一層或者好幾層,從而將信息傳遞到神經網絡的更深層。使用殘差塊能夠訓練更深的神經網絡。所以構建一個ResNet網絡就是通過將很多這樣的殘差塊堆積在一起形成一個深度神經網絡。
????????Residual Network:如下圖,原始是一個普通網絡(plain network),把它變成ResNet的方法是加上所有跳遠連接,每兩層增加一個捷徑,構成一個殘差塊。5個殘差塊連接在一起,構成一個殘差網絡。如果我們使用標準優化算法訓練一個普通網絡,比如梯度下降等其它熱門優化算法,如果沒有多余的殘差,憑經驗,你會發現隨著網絡深度的加深,訓練誤差會先減少然后增多;而理論上,隨著網絡深度的加深,應該訓練得越來越好才對,也就是說,理論上網絡深度越深越好,但實際上,如果沒有殘差網絡,對于一個普通網絡來說,深度越深意味著用優化算法越難訓練。而實際上,隨著網絡深度的加深,訓練誤差會越來越多。但是有了ResNets就不一樣了,即使網絡再深,訓練誤差也會減少,就算訓練深達100層的網絡也不例外。
????????Why ResNets work:一個網絡深度越深,它在訓練集上訓練網絡的能力會有所減弱,這也是有時候我們不希望加深網絡的原因。而事實并非如此,至少在訓練ResNet網絡時并不完全如此。假設有一個大型神經網絡,如下圖所示,其輸入為X,輸出激活值a[l]。如果你想增加這個神經網絡的深度,再給這個網絡額外添加兩層,最后輸出為a[l+2],可以把這兩層看作一個ResNet塊,即殘差塊。假設在整個網絡中使用ReLU激活函數,所以激活值都大于等于0.a[l+2]=g(z[l+2]+a[l])=g(w[l+2]*a[l+1]+b[l+2]+a[l])=g(a[l])=a[l],(如果假設w[l+2]=0,b[l+2]=0,g(a[l])是應用于非負數的ReLU函數)。結果表明,殘差塊學習這個恒等式函數(identity function)殘差塊并不難。因為跳遠連接(skip connection)使我們很容易得出a[l+2]=a[l]。這意味著,即使給神經網絡增加了這兩層,它的效率也并不遜色于更簡單的神經網絡,因為學習恒等式函數對它來說很簡單。盡管它多了兩層,也只是把a[l]的值賦給a[l+2].所以,給大型神經網絡增加兩層,不論是把殘差塊添加到神經網絡的中間還是末端位置都不會影響網絡的表現。當然,我們的目標不僅僅是保持網絡效率,還要提升它的效率,想象一下,如果這些隱層單元學到一些有用信息,那么它可能比學習恒等式函數表現的更好,而這些不含有殘差塊或跳遠連接的深度普通網絡情況就不一樣了,當網絡不斷加深時,就算是選擇用來學習恒等式函數的參數都很困難,所以很多層最后的表現不但沒有好反而更糟。殘差網絡起作用的主要原因就是這些殘差塊學習恒等式函數非常容易。
????????將ResNet用于圖像識別:如下圖,這是一個普通網絡,輸入是一張圖像,它有很多卷積層,最后輸出一個Softmax;如果把它轉換成ResNet,只需要添加跳遠連接。這個網絡有很多層3*3卷積,而且它們大多都是相同的,這就是添加等維特征向量的原因,所有這些都是卷積層而不是全連接層,因為它們是相等的卷積,維度得以保留。ResNet類似于其它很多網絡,也會有很多卷積層,其中偶爾會有池化層或類似于池化層的層。
????????Network in Network and 1*1 convolutions:如下圖,filter為1*1*1,值為2,輸入是一張6*6*1的圖像,然后做卷積,結果相當于把這個圖像中的值乘以2;如果是一張6*6*32的圖像,使用的filter為1*1*32,然后應用ReLU,輸出結果為6*6*1,如果有n個filter,則輸出結果為6*6*n。因此,在這里,1*1卷積可以理解為這32個神經元都應用了一個全連接神經網絡,全連接層的作用是輸入32個數字和filter數量,標記為nc[l+1],在36個positions上重復此過程,輸出結果為6*6*filter數量。1*1卷積有時也被稱為network in network。
????????谷歌Inception網絡簡介:Inception網絡的作用就是用來確定在構建卷積層時該如何決定filter的大小及要不要添加pooling層。如下圖,輸入層為28*28*192,而Inception網絡或Inception層的作用就是代替人工確定卷積層中的filtersize,或確定是否需要創建卷積層或池化層。如果使用1*1filter做卷積,假設輸出為28*28*64;如果使用3*3的filter,輸出是28*28*128;然后把第二個輸出值堆積到第一個輸出值上;如果使用5*5的filter,輸出是28*28*32;如果使用池化操作,這里池化后輸出是28*28*32;依次把上面這些輸出堆積起來。有了這樣的Inception模塊,你就可以輸入某個量,作為輸出,它累加了所有數字,這里的最終輸出為32+32+128+64=256。Inception模塊的輸入為28*28*129,輸出為28*28*256.這就是Inception網絡的核心內容?;舅枷胧荌nception網絡不需要人為決定使用哪個filter,或者是否需要pooling,而是由網絡自行確定這些參數,你可以給網絡添加這些參數的所有可能值,然后把這些輸出連起來,讓網絡自己學習它需要什么樣的參數,采用哪些filter組合。
????????Inception模塊中計算成本問題:如下圖,已上圖中的5*5 filter為例,輸入為28*28*192,輸出為28*28*32,它有32個filter,因為輸出有32個channels,每個filter的size為5*5*192,那么總的乘法運算次數為(28*28*32)*(5*5*192)結果等于1.2億次,即使用現代計算機乘以1.2億次乘法運算,成本也是相當高的。假設使用1*1的filter,為了降低計算成本,我們用計算成本除以因子10,結果它從1.2億減少到原來的十分之一。
????????還有另外一種架構,如下圖,其輸入為28*28*192,輸出為28*28*32,先使用16個1*1*192的filter,輸出中間結果為28*28*16,然后在使用32個5*5*16的filter,最終輸出結果為28*28*32。最終的輸入和輸出和之前相同。但我們要做的就是把左邊的大的輸入層,壓縮成這個較小的中間層,有時被稱為瓶頸層(bottleneck layer),這個計算成本為(28*28*16)*(1*1*192)約為240萬,第二個卷積層的計算成本為(28*28*32)*(5*5*16)約為1000萬,這兩層的計算成本之和是1240萬。與之前的值做比較,計算成本從1.2億降到了1240萬,原來的十分之一。所進行的加法運算次數與乘法的運算的次數近似相等,所以只統計了乘法運算的次數。可以通過使用1*1的filter來構建瓶頸層從而大大降低計算成本。事實證明,只要合理構建瓶頸層,你既可以顯著縮小表示層規模,又不會降低網絡性能,從而大量節省了計算。
????????總結,如果你在構建神經網絡層的時候,不想決定pooling層使用1*1,3*3還是5*5的filter,那Inception模塊就是最好的選擇。我們可以應用各種類型的filter,只需把輸出連接起來。可以使用1*1的filter來降低計算成本。
????????Inception網絡:如下圖,這就是一個Inception模塊。而Inception網絡所要做的就是將這些模塊都組合到一起。
????下圖是一個Inception網絡,圖中每一個紅框其實都是一個Inception模塊,綠色框的最后一層為softmax用來作預測。這個特別的網絡叫做GoogLeNet。Inception網絡無非是很多Inception模塊一環接一環,最后組成了網絡。
????????使用開源的實現方案:事實證明很多神經網絡難以復制,因為一些參數調整的細節問題。如果你看到一篇研究論文,想應用它的成果,你應該考慮做一件事,在網絡上尋找一個開源的實現。因為你如果想得到作者的實現,通常要比你從頭開始實現快的多。
????????遷移學習:如果你要做一個計算機視覺的應用,相比于從頭訓練權重,或者說從隨機初始化權重開始,不如你下載別人已訓練好的網絡結構的權重,你通常能夠進展的相當快。用這個作為預訓練,然后轉換到你感興趣的任務上。計算機視覺的研究社區,非常喜歡把許多數據集上傳到網上,比如ImageNet,MS COCO或者Pascal類型的數據集。你可以下載花費了別人幾周甚至幾個月而做出來的開源的權重參數,把它當作一個很好的初始化用在自己的神經網絡上。用遷移學習把公共的數據集的知識遷移到你自己的問題上。如下圖,假如說你要建立一個貓的檢測器用來檢測你自己的寵物貓,Tigger,Misty或者Neither,忽略兩只貓同時出現在一種圖的情況。你現在可能沒有Tigger和Misty的大量圖像,所以你的訓練集會很小。此時可以從網上下載一些神經網絡的開源實現,不僅把代碼下載下來也要把權重(weights)下載下來。有許多訓練好的網絡你都可以下載,例如ImageNet,它有1000個不同的類別,因此這個網絡會有一個Softmax單元,它可以輸出1000個可能類別之一。你可以去掉這個Softmax層,創建你自己的Softmax單元用來輸出Tigger,Misty,Neither三個類別。就網絡而言,建議你把所有的層都看作是凍結的(frozen)。你凍結的網絡中包含所有層的參數,你只需要訓練和你的Softmax層有關的參數。這個Softmax層有三個可能的輸出。通過使用其他人預訓練的權重,你很可能得到很好的性能,即使只有一個小的數據集。幸運的是,大多數深度學習框架都支持這種操作,事實上,取決于用的框架。如果你的數據越多,你可以凍結越少的層,訓練越多的層。這個理念就是,如果你有一個更大的訓練集,也許有足夠多的數據,那么不要單單訓練一個Softmax單元,而是考慮訓練中等大小的網絡,包含你最終要用的網絡的后面幾層。最后,如果你有大量數據,你應該做的就是用開源的網絡和它的權重把整個當作初始化然后訓練整個網絡。
????????數據增強(data augmentation):大部分的計算機視覺任務使用很多的數據,數據增強是經常使用的一種技巧來提高計算機視覺系統的表現。在當下,計算機視覺的主要問題是沒有辦法得到充足的數據。計算機視覺中常見的數據增強方法,如下圖:(1)、垂直鏡像對稱(mirroring on the vertical axis);(2)、隨機裁剪(random cropping)。理論上,你還可以使用旋轉(rotation)、剪切(shearing)、局部扭曲(local warping)。
????????第二種經常使用的方法是色彩轉換(color shifting),如下圖,給R、G、B三通道加上不同的失真值(different distorition)。對R、G、B有不同的采樣方式,其中一種影響顏色扭曲的算法叫PCA即主成分分析,有時候被稱作PCA顏色增強。
????????計算機視覺現狀:深度學習已經成功地應用于計算機視覺、自然語言處理、語言識別、在線廣告、物流還有許多其它問題。
????? ? GitHub:https://github.com/fengbingchun/NN_Test??
總結
以上是生活随笔為你收集整理的吴恩达老师深度学习视频课笔记:深度卷积网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LLVM简介
- 下一篇: 吴恩达老师深度学习视频课笔记:目标检测