# 吳恩達老師_深度學習_卷積神經網路_第二週_深度卷積神經網路 ###### tags: `deep learning` `Andrew Ng` ## 2-1.Why look at case studies? ![](https://i.imgur.com/JiwXfdW.png) **課程說明**:為何需要參考學習? ### Outline ![](https://i.imgur.com/ea13hOm.png) 建構卷積最好的方式之一,就是閱讀已經有不錯效能的架構,學習參考,再來就是閱讀論文。 幾個經典的架構 * LeNet-5 * AlexNet * VGG * ResNet * 殘差網路 * 有152層 * Inception ## 2-2.Classic networks ![](https://i.imgur.com/Z0AS2r8.png) **課程說明**:經典的網路架構 ### LeNet-5 ![](https://i.imgur.com/ampZkQQ.png) LeNet-5是針對灰值圖訓練 * 輸入 * 32x32x1 * $f$=5 * $s$=1 * $p$=0 * $n_c$=6 * Layer1 * CONV1 * 28x28x6 * avg pool * 在當初使用avg pool的人較多,而現在更多是使用max pool * $f$=2 * $s$=2 * POOL1 * 14x14x6 * $f$=5 * $s$=1 * $n_c$=16 * Layer2 * CONV2 * 當年不使用padding或者有效卷積,所以每進行一次卷積,圖像的高寬都會縮小。 * 10x10x16 * avg pool * $f$=2 * $s$=2 * POOL2 * 5x5x16 * 5x5x16有400個節點 * FC3(FULL CONNECTION) * 每個節點有120個神經元 * FC4(FULL CONNECTION) * 每個節點有84個神經元 * 以此層得到最後的輸出 * 因為是數字辨識,有0-9的可能,所以使用softmax做輸出 如果我們從左往右看,隨著網路愈來愈深,圖片的高、寬都在縮小,從32x32一路縮到了5x5,但是channel的數量會一路增加,從1增長到了16。 在過去,人們使用sigomoid或是tanh函數,而LeNet-5正是使用這兩個函數,這種網路結構的特別之處在於各層網路之間是有關聯的。 在當初因為電腦的計算速度慢,所以架構上每個filter的channel都與上一層的channel相同,Layer1與Layer2的CONV與POOL相接的filter數量都是相同的,只是在LeNet-5論文中提到的複雜細節現在一般都不用了。 建議在讀這篇論文的時候可以精讀第二段,帶過第三段。 ### AlexNet ![](https://i.imgur.com/NMWSv2j.png) 以論文的第一作者Alex Krizhevsky命名,其他兩位共筆作者為Ilya Sutskever, Geoffrey Hinton。 * 輸入層 * 227x227x3 * 原著為224x224x3,但推導會發現這尺寸較佳。 * conv * $f$=11 * $s$=4 * $n_c$=96 * Layer1 * CONV1 * 55x55x96 * Max-pooling * $f$=3 * $s$=2 * POOL1 * 27x27x96 * $f$=5 * same padding * Layer2 * CONV2 * 27x27x256 * Max-pooling * $f$=3 * $s$=2 * POOL2 * 13x13x256 * $f$=3 * same padding * Layer3 * CONV3 * 13x13x384 * $f$=3 * Layer4 * CONV4 * 13x13x384 * $f$=3 * Layer5 * CONV5 * 13x13x256 * Max-pooling * $f$=3 * $s$=2 * POOL2 * 6x6x256 * 9216個單元 * FC6(FULL CONNECTION) * 9216 * FC7(FULL CONNECTION) * 4096 * FC8(FULL CONNECTION) * 4096 * 全部約6000萬個參數 * softmax AlexNet使用了ReLU,在架構的時候因為GPU處理速度還不快,所以用了兩個GPU計算。AlexNet還有另一種類型的層,稱為Local Response Normalization(LRN層),但後來研究發現LRN作用不大,所以此課程不會談到。 從深度學習的歷史角度來看,因為有了AlexNet這篇論文的出現,讓機器視覺開始重視深度學習。 ### VGG-16 ![](https://i.imgur.com/PVpCXJo.png) VGG本身並沒有那麼多超參數,是一種只需要專注於構建卷積層的簡單網路。16代表著CONV與FC的層數。 * CONVx2 * $f$=3 * $s$=1 * same padding * $n_c$=64 * max pooling * $f$=2 * $s$=2 * POOL * 112x112x64 * CONVx2 * $f$=3 * $s$=1 * same padding * $n_c$=128 * max pooling * $f$=2 * $s$=2 * POOL * 56x56x128 * CONVx3 * $f$=3 * $s$=1 * same padding * $n_c$=256 * max pooling * $f$=2 * $s$=2 * POOL * 28x28x256 * CONVx3 * $f$=3 * $s$=1 * same padding * $n_c$=512 * max pooling * $f$=2 * $s$=2 * POOL * 14x14x512 * CONVx3 * $f$=3 * $s$=1 * same padding * $n_c$=512 * max pooling * $f$=2 * $s$=2 * POOL * 7x7x512 * FC * 4096 * FC * 4096 * Softmax 總共有著1.38億個參數,這是一個非常大的網路,但結構不複雜並且非常工整。CONV之後接著POOL來壓縮圖片,而且CONV的filter數量變化也存在一定的規律,64、128、256、512。隨著圖片經過POOL壓縮之後,也在下次的CONV增加了channel一倍,這代表可片的壓縮與channel的增加是比例是有規律的。 另外還有VGG-19,但表現與VGG-16差不多,所以大家還是選擇VGG-16多。 如果對論文有興趣的話,建議先看AlexNet,接著是VGG,最後再看LeNet5 :::info same padding意味著卷積之後圖片長寬不變 ::: ## 2-3.Residual Networks(ResNets) ![](https://i.imgur.com/cQqLfzD.png) **課程說明**:殘差網路 ### Residual block ![](https://i.imgur.com/uyIMCjZ.png) :::info ResNets發明者:何愷明、張翔宇、任少卿、孫劍 ::: 深度神經網路存在著梯度消失與爆炸的問題,透過skip connection(short cut)從某一網路層得到啟動並且反饋給另外一層,以此訓練更深的神經網路。 ResNets由殘差區塊構建而成,上圖為例,一般而言要由輸入到輸出需要經過下列主要路徑步驟: * $a^{[l]}\rightarrow Linear \rightarrow ReLU \rightarrow a^{[l+1]} \rightarrow Linear \rightarrow ReLU \rightarrow a^{[l+2]}$ * $a^{[l]}$ * $z^{[l+1}=w^{[l+1]}a^{[l]}+b^{[l+1]}$ * $a^{[l+1]}=g(z^{[l+1]})$ * $z^{[l+2}=w^{[l+2]}a^{[l+1]}+b^{[l+2]}$ * $a^{[l+2]}=g(z^{[l+2]})$ 但在ResNets中會有些許不同,我們會將$a^{[l]}$直接copy到神經網路的深層(紫線),在啟動函數ReLU之前加上,也因此我們的計算式也有所不同。 $a^{[l+2]}=g(z^{[l+2]}) \leftarrow$取消 更改為:$a^{[l+2]}=g(z^{[l+2]}+ a^{[l]})$ 因此產生了一個殘差區塊,透過這樣的方式可以訓練更深的神經網路,所以構建一個ResNets就是通過將許多這樣的殘差區塊堆積在一起,形成一個深度神經網路。 ### Residual Network ![](https://i.imgur.com/USW7rpz.png) :::info plain network:普通網路,這術語來自ResNets論文 ::: 上圖是一個普通網路,將它改變成ResNets的方式,就是加入skip connection,每兩層一個,構成五個殘差區塊連接在一起。 plain network在優化過程會隨著深度愈見增長而出現愈多的錯誤,但這種情況並不會發生在ResNets。 ## 2-4.Why ResNets work ![](https://i.imgur.com/kYECoup.png) **課程說明**:實例探討ResNets ### Why do Residual Networks work? ![](https://i.imgur.com/83YDU2E.png) 在上一節我們了解到,隨著深度的加深,神經網路的錯誤會愈見增多,這也是我們不希望加深網路的原因,但這點在ResNets並非完全如此。 案例上,我們有一個大型神經網路,輸出為$a^{[l]}$,透過ResNets,我們再加深兩層,輸出為$a^{[l+2]}$,並且使用的啟動函數為ReLU($a\geqq0$) $a^{[l+2]}=g(z^{[l+2]}+a^{[l]})=g(w^{[l+2]}a^{[l+1]}+b^{[l+2]}+a^{[l]}$ 這邊最重要的是權重w,我們假設$w^{[l+2]}、b^{[l+2]}$皆為0,那就剩$a^{[l]}$,即$g(a^{[l]})=a^{[l]}$。 結果表明,Residual Block學習這個恆等式並不難,儘管它多了兩層,也只是將$a^{[l]}$的值賦予$a^{[l+2]}$,這讓學習更深層的網路時性能不受影響,還有機會提高效率。 另一個細節是,如果$a^{[l]}$與$z^{[l+2]}$有相同的維度,ResNets使用了許多相同卷積(Same Convolutions),所以$a^{[l]}$的維度等於輸出層的維度,因而實現了這個連接。 如果$a^{[l]}$=28與$a^{[l+2]}$=256有不同的維度,那就加入一個$W_s \mathbb{R} ^{256x128}$,它是網路通過學習得到的矩陣或參數。 ### ResNets ![](https://i.imgur.com/Cto8fRK.png) 我們來看ResNets的圖像辨識,上面是一個普通網路,有多個卷積層,最後輸出一個softmax,將它變成ResNets的方式就是加入跳接(skip connection)。 這網路有很多層3x3的卷積,而且大多相同,這就是添加相等維度特徵向量的原因,也解釋了$z^{[l+2]}+a^{[l]}$,中間也會加入pool,不管如何你都需要加入調整矩陣維度的$W_s$, ## 2-5.Network in Network and 1x1 convloutions ![](https://i.imgur.com/rfJcUXd.png) **課程說明**:1x1卷積的用途 ### Why does a 1x1 convloution do? ![](https://i.imgur.com/f6jfyGA.png) 假設有一個6x6的圖片,另外有一個filter為1x1,數值為2,以這個filter對圖片做卷積得到的就是將所有的數值2倍,這看來效果不大,但如果是一張6x6x32的圖片,效果就不一樣。 以黃色區塊來看,用這32個數字乘上1x1的切片得到一個實數,可以這麼解釋,一個神經元的輸入是32個數字乘上相同高度與寬度上某切片的32個數字,並乘上32個權重之後以ReLU當啟動函數之後輸出相應的結果。 1x1的卷積可以理解為這32個單元都應用了FC(FULLY CONNECTED),FC的作用是輸入32個數字(filter數量),在36個單元中重覆這樣的計算,最後輸出6x6x#filter,這方式有時候稱為Network in Network。 ### Using 1x1 convolutions ![](https://i.imgur.com/JDn77jT.png) 假設有一個28x28x192的輸入層,我們知道可以透過pooling來壓縮圖片,但如果channel數量很大(此例為192),那該如何壓縮成28x28x32? 你可以使用32個1x1x192的filter,這是一種壓縮channel的方式($n_c$)。 1x1 convolution給神經網路添加了一個非線性函數,從而減少或保持輸入層中的channel數量不變(也可以增加)。 ## 2-6 Inception network motivation ![](https://i.imgur.com/Sz789Dv.png) **課程說明**:Inception的基礎架構 ### Motivation for inception network ![](https://i.imgur.com/cZMguqF.png) 上圖是Inception的架構,假設你有一個28x28x192的輸入層,將各種conv、pool堆疊起來(1x1、3x3、5x5做了same convloution,有一個same padding的max pool),輸出為28x28x256。 基本的想法是,Inception不需要人為決定使用那一個filter,或者是否需要pooling,由網路自己學習它需要什麼參數,採用哪此過濾器組合。 ### The problem of computational cost ![](https://i.imgur.com/8xUaI6Q.png) 我們將重點放在其中一個5x5的卷積層,它有32個filter,每個filter的大小為5x5x192,輸出為28x28x32,所以要計算28x28x32個數字,每個數字都要執行5x5x192次乘法運算,兩數相乘結果為1.2億次。 下面我們要提到,如何透過1x1的卷積來降為原本10%的計算需求。 ### Using 1x1 convolution ![](https://i.imgur.com/mSsUpE4.png) 使用1x1的卷積將192個channel減少到16個,得到輸出為28x28x16,再運行5x5的卷積,依然得到28x28x32的輸出。 我們做的就是透過1x1的卷積來壓縮28x28x192這個大的輸入,有時候這稱為瓶頸層(Bottleneck layer)(中間那層28x28x16就跟瓶子一樣),瓶頸層為網路中最小的部份,先壓縮再擴大。 其計算成本,(28x28x16)x(1x1x192)=240萬加上(28x28x32)x(5x5x16)=1000萬,兩層總計成本為1240萬,跟上節的1.2億來看,僅原來的十分之一。 事實證明,只要妥善規劃瓶頸層,並不會影響到網路的效能,並且可以大量節省計算成本。 ## 2-7.Inception network ![](https://i.imgur.com/qQGImwS.png) **課程說明**:建立Inception network ### Inception module ![](https://i.imgur.com/vEd1MTw.png) Inception會將上層的輸出作為輸入: * 輸入:28x28x192 * 堆疊 * 經過1x1的卷積 * 16個channel * 28x28x16的輸出 * 經過5x5的卷積 * 32個channel * 28x28x32的輸出 * 堆疊 * 經過1x1的卷積 * 96個channel * 28x28x96的輸出 * 經過5x5的卷積 * 128個channel * 28x28x128的輸出 * 堆疊 * 經過1x1的卷積 * 64個channel * 28x28x64的輸出 * 堆疊 * Max pooling * 3x3 * s=1 * same padding * 為了讓維度相同,需要做same padding * 28x28x192的輸出 * 經過1x1的卷積 * 經過壓縮,避免pooling佔據所有channel * 28x28x32的輸出 最後將所有得到的輸出堆疊起來,得到一個28x28x256的輸出(如右上堆疊圖) ### Inception network ![](https://i.imgur.com/AMyyev2.png) 上圖取自Szegety et al.的論文,取其中一個區塊來看,就跟上小節說明的Inception一樣,而這個網路中有很多Inception區塊,中間也許接了pooling來做圖片長寬的改變。 Inception network只是很多你學習的區塊在不同位置重覆組成的網路,原始論文中還有一些分支(Inception block下面),在網路的最後幾層為fully connected layer然後接上一個softmax層來做出預測,分支所做的就是通過隱藏層來做出預測,它確保了即使是隱藏單元與中間層也參與了特徵計算,它們也能預測圖片的分類,有調整的效果並且能防止擬合。 這由google所發生的架構也稱為gooLeNet,這名字是為了向LeNet作者致敬,而Inception的命名來自全面啟動這電影台詞『We Need To GO Deeper』![](https://i.imgur.com/mUECxKr.png) ## 2-8.Using open-source implementations ![](https://i.imgur.com/PQaoQdv.png) **課程說明**:找尋open source資源 ### Git Hub 可以到git-hub上找尋已經有成功的架構,在日後自己成功之後也記得貢獻自己的架構,好處在於可以利用之前提過的遷移學習轉移。 ## 2-9.Transfer learning ![](https://i.imgur.com/jd15B7C.png) **課程說明**:站在巨人的肩上 ### Transfer learning ![](https://i.imgur.com/FYtgKIF.png) 在機器視覺社群中,不少人已經分享訓練過的模型,這可能是耗盡了許多資源訓練而成的,透過Transfer learning我們可以快速的做模型的基礎。 以貓咪分辨為例,你的手上沒有很多資料,訓練集非常小,這時候可以從網路上取得公開的模型資料(git、ImageNet、MS COCO),除了程式碼之外,記得將權重下載。 作法如下: * 小數據 * 拿掉Softmax層,建立屬於你的Softmax * 此例來看,輸出為Tigger,Misty,Neither * 將其它層視為凍結,只訓練與Softmax有關的參數 * 將輸入層映射到softmax前的啟動函數 * 計算它的某個特徵向量 * 這樣訓練的就是一個很淺的softmax,以此特徵向量來做預測 * 保存模型結果之後可以取用 * 大數據 * 凍結較少的層數,訓練後面的層 * 或是注入自己的隱藏層與隱藏單元 * 如果最後的輸出不同,那就建構自己的softmax * 愈大的數據相對凍結的層數就會少 * 更大數據 * 那就取架構,剩下的自己訓練 ## 2-10.Data augmentation ![](https://i.imgur.com/kkotsc9.png) **課程說明**:數據增強的方法 ### Common augmentation method ![](https://i.imgur.com/cfWZm9E.png) 資料的不足在機器視覺上是常見的問題,這部份可以透過幾個方法來做數據擴充 * 垂直鏡像 * 隨機裁剪 * 注意需要保留欲預測的目標 * 旋轉 * 局部扭曲變形 ### Color Shifting ![](https://i.imgur.com/QGHfXqv.png) * 色彩轉換 * 給rgb三通道不同的加減來造成色偏 :::info 可參考AlexNet中所提PCA顏色增強的實現 ::: ### Implementing distortions during training ![](https://i.imgur.com/xQ4EptF.png) 透過cpu的多線程來平行處理圖片的數據增強再提交後續線程的訓練。 :::info 基本上使用數據增強的話,rgb的增減、圖片的裁剪大小...等調校也是一個超參數。 ::: ## 2-11.The state of computer vision ![](https://i.imgur.com/8ehUYsx.png) **課程說明**:機器視覺的現況分享 ### Data vs hand-engineering ![](https://i.imgur.com/qcs7iWE.png) 可以把大部份的機器學習問題看成,你在數據相對較少的地方應用於大數據,如語音、圖像辨視、物件檢測..你有愈多的資料就愈少人工,當你資料很少的時候,也只需要手工。 (數據量少的時候也可以透過遷移學習來加強) 通常演算法有兩種知識來源 * 標記資料(x,y) * 手工工程 * 數據充足的時候會將較多的時間花在建立模型 ### Tips for doing well on benchmarks/winning competitions ![](https://i.imgur.com/G7chfJX.png) 開源社群上有許多人分享的技巧來加強建立系統或贏得比賽 * Ensembling_集成 * 建立多個模型來取平均值(整體學習),多個弱學習器整合成一個強學習。 * Multi-crop at test time * 舉例來說,將貓咪複製四次 * 也有10-crop * 通過分類器對照片做出十張數據增加照片,取平均。 * 計算成本是代價 ### Use Open Source code ![](https://i.imgur.com/qdTjAkf.png) 儘可能的從其他人已架構好的網路開始,可以減少很多時間,再細部調整資料集,當然如果本身有強大的資源可以計算的話,從頭開始也未嚐不行。