# 吳恩達老師_深度學習_卷積神經網路_第一週_卷積神經網路
###### 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)})$