1. 程式人生 > >DeepLearning.ai筆記:(4-2)-- 深度卷積網路例項探究(Deep convolutional models:case studies)

DeepLearning.ai筆記:(4-2)-- 深度卷積網路例項探究(Deep convolutional models:case studies)


title: ‘DeepLearning.ai筆記:(4-2)-- 深度卷積網路例項探究(Deep convolutional models:case studies)’
id: dl-ai-4-2
tags:

  • dl.ai
    categories:
  • AI
  • Deep Learning
    date: 2018-10-09 17:17:04

首發於個人部落格:fangzh.top,歡迎來訪
本週主要講了深度卷積網路的一些模型:LeNet,AlexNet,VGGNet,ResNet,Inception,1×1卷積,遷移學習等。

經典的卷積網路

經典的卷及網路有三種:LeNet、AlexNet、VGGNet。

LeNet-5

LeNet-5主要是單通道的手寫字型的識別,這是80年代提出的演算法,當時沒有用padding,而且pooling用的是average pooling,但是現在大家都用max pooling了。

論文中的最後預測用的是sigmoid和tanh,而現在都用了softmax。

AlexNet

AlexNet是2012年提出的演算法。用來對彩色的圖片進行處理,其實大致的結構和LeNet-5是很相似的,但是網路更大,引數更多了。

這個時候已經用Relu來作為啟用函數了,而且用了多GPU進行計算。

VGG-16

VGG-16是2015的論文,比較簡化的是,卷積層和池化層都是用相同的卷積核大小,卷積核都是3×3,stride=1,same padding,池化層用的maxpooling,為2×2,stride=2。只是在卷積的時候改變了每一層的通道數。

網路很大,引數有1.38億個引數。

建議閱讀論文順序:AlexNet->VGG->LeNet

Residual Network(殘差網路)

殘差網路是由若干個殘差塊組成的。

因為在非常深的網路中會存在梯度消失和梯度爆炸的問題,為此,引入了Skip Connection來解決,也就是殘差網路的實現。

上圖即為一個殘差塊的基本原理,在原本的傳播過程(稱為主線)中,加上了 a [ l ] a^{[l]} z [ l + 2 ] z^{[l+2]} 的連線,成為’short cut’或者’skip connetction’。

所以輸出的表示式變成了: a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) a^{[l+2]} = g(z^{[l+2]} + a^{[l]})

殘差網路是由多個殘差塊組成的:

沒有殘差網路和加上殘差網路的效果對比,可以看到,隨著layers的增加,ResNet表現的更好:

ResNet為何有用?

假設我們已經經過了一個很大的神經網路Big NN,得到了 a [ l ] a^{[l]}

那麼這個時候再經過兩層的神經網路得到 a [ l + 2 ] a^{[l+2]} ,那麼表示式為:

a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) = g ( W [ l + 2 ] a [ l + 2 ] + b [ l + 2 ] + a [ l ] ) a^{[l+2]} = g(z^{[l+2]} + a^{[l]}) = g(W^{[l+2]} a^{[l+2]} + b^{[l+2]} + a^{[l]})

如果加上正則化,那麼權值就會很小,假設 W [ l + 2 ] , b [ l + 2 ] = 0 W^{[l+2]},b^{[l+2]} = 0 , 因為啟用函式是Relu,所以

a [ l + 2 ] = g ( a [ l ] ) = a [ l ] a^{[l+2]} = g(a^{[l]}) = a^{[l]}

所以可以看到,加上殘差塊以後,更深的網路最差也只是和前面的效果一樣,何況還有可能更好。

如果只是普通的兩層網路,那麼結果可能更好,也可能更差。

注意的是 a [ l + 2 ] a^{[l+2]} 要和 a [ l ] a^{[l]} 的維度一樣,可以使用same padding,來保持維度。

1×1卷積

用1×1的卷積核可以來減少通道數,從而減少引數個數。

Inception Network

Inception的主要好處就是不需要人工來選擇filter的大小和是否要新增池化層的問題。

如圖可以一次性把各個卷積核的大小和max pool一起加進去,然後讓機器自己學習裡面的引數。

但是這樣有一個問題,就是計算量太大了,假設是上面的 5 × 5 × 192 5 \times 5 \times 192 的卷積核,有32個,這樣一共要進行KaTeX parse error: Expected 'EOF', got '\2' at position 9: 28\times\̲2̲8\times32\times…的乘法次數,運算量是很大的。

如何解決這個問題呢?就需要用到前面的1×1的卷積核了。

可以看到經過維度壓縮,計算次數少了十倍。

Inception 網路

單個的inception模組如下:

構成的google net如下:

使用開源的實現方案

別人已經實現的網路已經很厲害了,我覺得重複造輪子很沒有必要,而且浪費時間,何況你水平也沒有別人高。。還不如直接用別人的網路,然後稍加改造,這樣可以很快的實現你的想法。

在GitHub上找到自己感興趣的網路結構fork過來,好好研究!

遷移學習

之前已經講過遷移學習了,也就是用別人訓練好的網路,固定他們已經訓練好的網路引數,然後套到自己的訓練集上,完成訓練。

如果你只有很少的資料集,那麼,改變已有網路的最後一層softmax就可以了,比如原來別人的模型是有1000個分類,現在你只需要有3個分類。然後freeze凍結前面隱藏層的所有引數不變。這樣就好像是你自己在訓練一個很淺的神經網路,把隱藏層看做一個函式來對映,只需要訓練最後的softmax層就可以了。

如果你有一定量的資料,那麼freeze的範圍可以減少,你可以訓練後面的幾層隱藏層,或者自己設計後面的隱藏層。

資料擴充

資料不夠的話,進行資料擴充是很有用的。

可以採用

  • 映象
  • 隨機裁剪
  • 色彩轉換color shifting(如三通道:R+20,G-20,B+20)等等

tips:

在資料比賽中

  • ensembling:訓練多個網路模型,然後平均結果,或者加權平均
  • 測試時使用muti-crop,也就是在把單張測試圖片用資料擴充的形式變成很多張,然後執行分類器,得到的結果進行平均。