# 吳恩達老師_深度學習_卷積神經網路_第一週_卷積神經網路 ###### tags: `deep learning` `Andrew Ng` ## 1-1.Computer vision ![](https://i.imgur.com/9tEgVob.png) **課程說明**:機器視覺 ### Computer Vision Problems ![](https://i.imgur.com/hycUUiy.jpg) 本週課程要學習的一些問題 * 圖片辨識 * 目標檢測 * 照片風格轉移 ### Deep Learning on large images ![](https://i.imgur.com/HonjPfA.png) 機器視覺遇到最大的問題是維度過大,以貓咪為例,64\*64\*3(RGB)就已經是12288。 如果照片是1000\*1000\*3,那就是300萬,假設你的第一層隱藏單元有1000個,那權重矩陣就30億個資料了。 為了可以計算,就會執行卷積神經! ## 1-2.Edge detection example ![](https://i.imgur.com/Lektkel.png) **課程說明**:邊緣偵測範例 ### Computer Vision Problem ![](https://i.imgur.com/iObuqmQ.png) 卷積神經的前幾層是做邊緣檢測,而後面的部份可能檢測到物體的本身,上例的話就是人臉。 給定一張照片(下圖),要讓系統去了解這照片里有什麼,第一件事可能是檢測圖片中的垂直邊緣,欄杆、站立的人,這是垂直邊緣檢測器的輸出。再來可以是水平線檢測.... ### Vertical edge detection ![](https://i.imgur.com/RefcQ4o.png) 該如何處理垂直邊緣檢測? 上圖是一個6x6的灰值圖(上圖左),建立一個3x3的矩陣(上圖中)(在卷積神經中稱為過濾器(filter),部份文獻會稱為kernel),接著將灰值圖與過濾器做卷積計算,這會得到一個(4,4)的矩陣(上圖右)。 首先,將過濾器覆蓋在灰值圖最左上,接著做乘法計算數值。 ``` 3*1+1*1+2*1+0+0+0+(1*-1)+(8*-1)+(2*-1)=-5 ``` 接著將過濾器向右位移,做一樣的計算,得到-4,得到0、得到8,以此方式由左而右,由上至下計算整個矩陣。 ```python= # 在tensorflow中指令 tf.nn.conv2d # python指令 conv-forward # keras conv2D ``` :::info \*:代表卷積計算(convolution) ::: ### Vertical edge detection ![](https://i.imgur.com/PYKTU1P.png) 為什麼透過這樣的過濾器就可以達到垂直偵測? 上面是另一個6x6的矩陣,看起來下左的小圖,一樣是剛才的過濾器,看起來就像是下中小圖,中間的區隔線是一條很明顯的垂直線。 將圖片做卷積計算之後得到最左邊的矩陣,就像是下右的圖片,這看起來就像是中間的垂直邊緣。 這垂直邊緣看起來很胖不正常是因為我們舉例的圖片較小,如果是維度大的照片的話看起來會是很正常的。 ## 1-3.More edge detection ![](https://i.imgur.com/Jzx9RBi.png) **課程說明**:更多的邊緣檢測,由亮至暗與由暗至亮的差異。 ### Vertical edge detection examples ![](https://i.imgur.com/HPFiKC5.png) 依然是上節的案例,由亮至暗的圖片,我們對圖片進行了卷積計算,假如我們將圖片調整成由暗至亮,卷積之後所得就會是-30,這說明了是由暗至亮的過度,而非由亮至暗。 ### Vertical and Horizontal edge detection ![](https://i.imgur.com/wjMZ1yx.png) * 左圖 * 垂直邊緣檢測 * 由左至右為亮至暗 * 右圖 * 水平邊緣檢測 * 由上至下為亮至暗 通過使用不同的過濾器,可以找到垂直或是水平的邊緣。 ### Learning to detect edges ![](https://i.imgur.com/gIUhPO9.png) * Sobel filter * 中間加了元素的權重 * 會使結果更可靠 * Scharr filter * 也是一種垂直邊緣檢測 執行中也不一定要使用已經有的過濾器,而是可以透過學習的方式來找到相對應的過濾器,將過濾器中的九個值當成九個參數,並且執行反向傳播,透過學習的方式,甚至可以偵測各種角度的邊緣。 ## 1-4.Padding ![](https://i.imgur.com/jwrW3nW.png) **課程說明**:卷積的基本操作Padding ### Padding ![](https://i.imgur.com/vXnWM7m.png) 一個6x6(nxn)的圖片與3x3(fxf)的過濾器做卷積之後會得到一個4x4(n-f+1,n-f+1)的矩陣,這麼做有兩個缺點。 * 每次的卷積都會造成圖像的縮小 * 卷積神經會有很多層,如果每過一層就縮小的話,那100層之後就只剩一個很小的圖像。 * 圖片邊緣的pixel在輸出中採用較少,因為只會被計算到一次,這意味著我們放棄了邊緣的訊息。 為了解決這兩個問題,可以在每次的卷積之前就padding圖像(想像在css上的邊界),此次來看,我們可以在圖像的外圍在填充一層像素,那6x6的圖片就會變成8x8,並且得到一個跟原圖一樣大小的圖片(8-3+1=6),如此,兩個缺點就可以以此被改善了。 :::info p=padding 此例p=1,因為我們填充一個像素在外層 所得圖片為(n+2p-f+1,n+2p-f+1) 習慣上,可以用0去填充。 ::: ### Valid and Same convolutions ![](https://i.imgur.com/ky65CQz.png) 對於該如何選擇填充數像素,通常有兩個選擇。 * Valid convolutions * no padding * nxn * fxf $\rightarrow$ n-f+1 x n-f+1 * Same convolutions * 代表輸入與輸出的大小是一樣的 * n+2p-f+1 = n * $p=\frac{(f-1)}{2}$ 過濾器一般而言都是奇數矩陣,可能原因有二,如果過濾器f是偶數,那padding就需不對稱處理。另一理由即是,奇數矩陣才會有中心點,便於指出過濾器的位置。 ## 1-5.Strided convolutions ![](https://i.imgur.com/JoauiGs.png) **課程說明**:卷積中的步幅 ### Strided convolution ![](https://i.imgur.com/EIglVSK.png) 案例來看,我們有一個7x7的圖片,過濾器為3x3,透過過濾器來計算出值之後,不是向右移動一格,而是兩格,這就是步幅。由左而右的計算完畢之後,跳往下一行,一樣是跳兩格。 如果會有造成無法整除的情況,那就取最近整數,意思就是必需確保過濾器能過全數的過濾,才計算卷積。 :::info s = stride:步幅 卷積後的維度:$rounddown(\frac{n+2p-f}{s}+1)$ ::: ### Summary of convolutions ![](https://i.imgur.com/6JIqu6x.png) 結合卷積維度計算,原始圖片為nxn,過濾器為fxf,padding為p,步幅為s $rounddown(\frac{n+2p-f}{s}+1)$ ### Technical note on cross-correlation vs. convolution ![](https://i.imgur.com/H29j8Zw.png) 這節主要說明著不同教材間的卷積定義,不影響整個作業。 在部份教材中,卷積的定義是,在輸入與過濾器做卷積計算之前,尚需對過濾器做一個鏡像(mirror),隨後才做卷積,如上圖範例,而我們之前的範例並未執行這個動作,技術上來說,前幾節的案例操作被稱為互相關(cross-correlation),而非卷積,但在深度學習的文獻中,這亦稱為卷積。 總結而言,在機器學習慣例中,通常不進行翻轉操作,並且不會影響到我們的結果。 ## 1-6.Convolutions over volumes ![](https://i.imgur.com/aRgHik1.png) **課程說明**:在高維度影像中執行卷積 ### Convolutions on RGB image ![](https://i.imgur.com/TrbVArf.png) 假設現在不僅要對灰值化後的圖片做卷積(2D),而是希望對原圖(3D,加入了RGB),那圖片維度即為6(長)x6(寬)x3(RGB),相對應的過濾器(filter)也要是3x3x3,最後得到一個4x4x1的矩陣,需注意到,圖片與過濾器的最後一個維度必需要相等(此例而言兩者皆3(rgb)) ### Convolutions on RGB image ![](https://i.imgur.com/g9vUvEl.png) 維度雖然提高,但卷積的過程不變,首先即是將整個3x3x3的過濾器置於左上,並與相對應層做卷積計算,將這27個數值加總之後得到第一個數字,接著向右移動得到下一個輸出…以此循環至最後一個輸出。 假如你想檢測紅色邊緣,那就可以將藍、綠相對應的過濾器皆設置為0,依不同設置可得不同的邊緣檢測效果。 ### Multiple filters ![](https://i.imgur.com/Q4R49JP.png) 上例來看,卷積過程中,如果需求同時檢測水平與垂直邊緣的話,那最終的輸出結果就會是一個4x4x**2**的矩陣。 總結維度,如果圖片是nxnxn_c(6x6x3)與過濾器fxfxn_c(3x3x3)會得到(n-f+1)x(n-f+1)xn'c的輸出(4x4x2(n'c))。 ## 1-7.One layer of a convolutional network ![](https://i.imgur.com/igpg3jv.png) **課程說明**:建置單層卷積網路 ### Example of a layer ![](https://i.imgur.com/utEf0SF.png) 透過上節的說明,我們了解到可以同時做多個邊緣檢測,得到多個輸出,各自形成一個卷積神經網路層,然後加入偏差單元b(實數),透過python的廣播特性,輸出的16個元素都會各自加上偏差,然後使用非線性(non-linearity)函數ReLU來得到一個4x4矩陣。 最後將兩個矩陣堆疊,得到一個4x4x2的矩陣。 這過程的實現如下說明: * $X$:輸入層,$a^{[0]}$,即為輸入圖片6x6x3 * $w^{[1]}$:權重,即為過濾器3x3x3 * 上述兩者相乘,即為計算卷積,所得之值加上偏差即為$z^{[1]}$ * 上例我們有兩個過濾器,故特徵數為2,因此最後才得到一個4x4x"2"的輸出 * $a^{[1]}=g(z^{[1]})$,4x4x2 * 使用ReLU做為啟動函式 ### Number of parameters in one layer ![](https://i.imgur.com/E5IY4Lb.png) 問題:如果你有10個過濾器,並且過濾器維度為3x3x3的矩陣,你有多少參數? * 3x3x3=27 * b=1 * 10x(27+1)=280 這邊需注意到的是,不管你的輸入照片畫素有多大,100x100或是4000x4000,參數始終都是280,透過這10層的過濾器來取得特徵,這就是卷積神經網路的一個特徵,稱為避免過度擬合。 ### Summary of notation ![](https://i.imgur.com/5hnRMV9.png) 總結卷積神經網路的符號標記。 * $f^{[l]}=$filter size:過濾器大小,$l$用來標記第$l$層 * $p^{[l]}=$padding:padding數量 * $s^{[l]}=$stride:每次的移動數(步幅) * $n^{[l]}_c=$number of channel\_c:過濾器數量 * Each filter is:$f^{[l]}*f^{[l]}*n^{[l-1]}\_c$ * Activations:$a^{[l]}\rightarrow n^{[l]}_H*n^{[l]}_W*n^{[l]}_c$ * Weights:$f^{[l]}*f^{[l]}*n^{[l-1]}_c*n_c^{[l-1]}$ * bias:$n_c^{[l]}\rightarrow (1,1,1,n_c^{[l]})$ * $Input=n^{[l-1]}_H*n^{[l-1]}_W*n^{[l-1]}_C$:上一層輸入照片的維度 * $Outut=n^{[l]}_H*n^{[l]}_W*n^{[l]}_C$:輸出照片的維度 * $n^{[l]}=rounddown(\frac{n^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1)$ ## 1-8.A simple convolution network example ![](https://i.imgur.com/n3eDe3M.png) **課程說明**:簡單的卷積案例,複習標記 ### Example ConvNet ![](https://i.imgur.com/u72oinO.png) 假設有一張照片,我們希望辨視照片內有沒有貓咪: * 輸入層$a^{[0]}$ * 照片大小為39x39x3 * $n_H^{[0]}=n_W^{[0]}=39$ * $n_c^{[0]}=3$ * 過濾器為3x3,有10個過濾器 * $f^{[1]}=3$ * 步幅為1 * $s^{[1]}=1$ * No padding * $p^{[1]}=0$ * 第一層$a^{[1]}$ * 輸入層輸出為37x37x10 * 10是因為有10個過濾器 * 37 = $\frac{n+2p-f}{s} + 1= \frac{39+0-3}{1}+1$ * $n_H^{[1]}=n_W^{[1]}=37$ * $n_c^{[1]}=10$ * 數值等同於第一層的filter數量 * 過濾器為5x5,有20個過濾器 * $f^{[2]}=5$ * 步幅為2 * $s^{[2]}=2$ * No padding * $p^{[2]}=0$ * 第二層$a^{[2]}$ * 第一層輸出為17x17x20 * 20是因為有20個過濾器 * $n_H^{[2]}=n_W^{[2]}=17$ * $n_c^{[2]}=20$ * 過濾器為5x5,有40個過濾器 * $f^{[3]}=5$ * 步幅為2 * $s^{[3]}=2$ * No padding * $p^{[3]}=0$ * 第三層,假定為輸出層$a^{[3]}$ * 第二層輸出為7x7x40 * 將所有單元平滑展開(1960個單元向量)之後經過logistic或是softmax來判斷是否有貓咪 ### Type of layer in a convolutional network ![](https://i.imgur.com/hq3KIAG.png) 一個典型的卷積神經網路通常會有三層 * 卷積層(Convolution)-CONV * 池化層(Pooling)-POOL * 全連接層(Fully connected)-FC ## 1-9.Pooling layers ![](https://i.imgur.com/YiCtjt9.png) **課程說明**:池化層 ### Pooling layer: Max pooling ![](https://i.imgur.com/tr03kGF.png) 左圖是一個4x4的圖片,假設我們執行了Max pooling,那會產生一個2x2的輸出,執行過程如下: * 將4x4的圖片畫分為4個區塊 * 輸出對應了每個區塊中的最大元素值 * 左上9、右上2、左下6、右下3 * Max pooling的超參數 * filter=2(2x2) * stride=2 * 雖然是超參數,但是不用學習,是固定運算值 * 可以將過程當做是一個特徵的提取 * 如果在filter中提取到某個特徵,那僅保留最大值 * 如果沒有該特徵,那取得的值還是很小的(如右上的2) ### Pooling layer: Max pooling ![](https://i.imgur.com/l0uX4cM.png) 另一個範例: * 各參數 * 輸入為5x5 * filter=3 * stride=2 * output=3x3 * 計算方式同卷積 * 過程 * 計算方式同卷積,但取filter內最大值 * 如果是5x5x3的話,輸出也會是3x3x3 * 各channel各自計算pooling * 這部份不同卷積 ### Pooling layer: Average pooling ![](https://i.imgur.com/n8gfGaG.png) 此種方式較不常用,直觀的看,就是取filter內的平均值。 ### Summary of pooling ![](https://i.imgur.com/kecot6U.png) * Pooling的超參數 * f:filter size(過濾器大小) * s:stride(每次移動步幅) * 常用為f=2、s=2(或是f=3、s=2) * 效果相當於縮減一半 * 如果願意的話還是可以加入padding,但是實務上很少人使用 * 所以p=padding=0 * 輸入:$n_H*n_W*n_c$ * 輸出:$rounddown(\frac{n_H-f}{s}+1)*rounddown(\frac{n_W-f}{s}+1)$ * 過程中沒有需要學習的超參數 * 即反向傳播的時候不需要優化 * 屬靜態屬性 ## 1-10.Convolutional nerual network example ![](https://i.imgur.com/IVXyBNf.png) **課程說明**:卷積神經的範例 ### Neural network example ![](https://i.imgur.com/NWMuv4P.png) 我們希望做數字辨識『7』,這是一個靈感來自於(LeNet-5)的作法。 * 輸入層 * 32x32x3 * conv * $f$=5 * $s$=1 * $n_c$=6 * Layer1 * 文獻上有將pooling與conv視為不同層,但較多將有權重的視為一層,而pooling並沒有權重,故pool與conv視為同一層,課程以此視之。 * CONV1 * 28x28x6 * pooling * $f$=2 * $s$=2 * 這表示長、寬會縮減一半 * POOL1 * 14x14x6 * $f$=5 * $s$=1 * $n_c$=16 * Layer2 * CONV2 * 10x10x16 * pooling * $f$=2 * $s$=2 * POOL2 * 5x5x16 * 將矩陣平整化成一個向量 * 5x5x16=400 * (400,1) * 利用此向量建構下一層 * 下一層有120個神經單元 * FC3(FULL CONNECTION) * 將400神經單元與120個神經單元緊密相連 * 維度(120,400) * 具有一個權重矩陣$w^{[3]}$與偏差單元$b^{[3]}$ * 下一層具有84個神經單元 * FC4(FULL CONNECTION) * 將120神經單元與84個神經單元緊密相連 * 維度(84,120) * 具有一個權重矩陣$w^{[4]}$與偏差單元$b^{[4]}$ * 透過softmax做輸出 * 0-9,共計10個輸出。 隨著神經網路愈深,照片會愈來愈小,而channel會愈來愈多,最後得到一個全連接層,常見作法是一或多個卷積層後面會跟一個池化層、一或多個卷積層後面會跟一個池化層、接著是全連接層,最後接softmax。 ### Neural network example ![](https://i.imgur.com/CwBFyNa.png) 上表是每一層的activation sizes * 池化層與輸入層不會有參數 * 卷積層的參數相對較少 * 許多參數都存在於全連接層 * activation sizes隨深度減少 ## 1-11.Why convolutions? ![](https://i.imgur.com/7SFZN40.png) **課程說明**:為何使用卷積神經網路 ### Why convolutions ![](https://i.imgur.com/pc0ht5f.png) 相比於僅用全連接層,卷積的優勢在於: * 參數共享 * 稀疏連接 舉例來說,我們建構一個神經網路其中一層含32x32x3=3072個單元,在卷積之後有著28x28x6=4704單元,兩層之間的神經元彼此相連,其權重矩陣為(3072,4704),約1400萬,要訓練的參數很多,而這只是一個32x32x3的照片。 我們來看這個卷積層的參數數量,每個過濾器為5x5=25,加上偏差單元25+1=26個參數,6個過慮器26\*6=156個參數,相對少很多。 ### Why convolutions ![](https://i.imgur.com/fnVScp9.png) 卷積映射這麼少參數有兩個原因 * 參數共享 * 一個filter,每一個區塊都可以使用取得特徵檢測 * 稀疏連接(sparse connections) * 輸出的每一個pixel都只跟相對應的九個pixel有關,與其它pixel無關,這即是稀疏連接。 ### Putting it together ![](https://i.imgur.com/n5TchoH.png) 假設我們要建立一個貓咪檢視器,我們選定了一個卷積神經網路架構,從輸入圖片、conv、pooling、full connection、softmax得到$\hat{y}$。 一樣的,我們需要定義成本函數,並且利用優化演算法來減少成本法函數。 $CostJ=\frac{1}{m}\sum^m_{i=1}L(\hat{y}^{(i)},y^{(i)})$