---
# System prepended metadata

title: '卷積神經網路（Convolutional Neural Networks, CNN）'
tags: [架構設計, 李宏毅, 深度學習]

---

## 什麼是卷積神經網路(Convolutional Neural Networks, CNN)？
卷積神經網路（CNN）經常使用在影像辨識上，當模型看到一張可愛貓咪的圖片就能夠辨別是一隻可愛貓咪，那問題就來了，該如何將圖片轉為模型看得懂的樣子呢？

我們需要將一張圖片轉換成向量，而且每張圖片的大小必須固定，例如下方例子中，每張圖片的大小皆為 100 * 100，此外，還需要考慮到圖片是彩色的，代表有三個 channel (RGB)，如果圖片是黑白的，代表只有一個 channel，因此一整個向量長度會是 100 * 100 * 3，再丟入到模型中，還記得分類任務主要用的誤差函式就是 Cross-entropy，並且期望 loss 值愈小愈好。

![image](https://hackmd.io/_uploads/rk27OPgB0.png)

### 觀察一，圖片中重要的 pattern
思考一下，你如何判別出一隻鳥呢？可以從眼睛、鳥嘴、翅膀等重要的 pattern 確定是一隻鳥，不需要完整地看完一整張圖片，一樣的道理，CNN 在做影像辨識時，也不需要完整地看完一整張圖片，只需要觀察幾個重要的 pattern 即可，這麼做的好處是，能夠降低向量長度、減少參數量，避免模型 Overfitting。

這裡要特別介紹幾個新名詞，分別有 Receptive field、Kernel size、Stride、Padding
#### 1. Receptive field
描述 pattern 大小範圍以及 channel 數量 ex: 3 * 3 * 3。
    a. 可自訂 Receptive field 大小、形狀
    b. 不一定要考量到所有 channel
#### 2. Kernel size
描述平面 2D pattern 大小範圍 ex: 3 * 3，不考慮 channel 數量。
#### 3. Stride
平移之移動長度 ex: 紅色框框向右平移 2 至黃色框框。
#### 4. Padding
超過範圍的區域要補上數字 ex: 0 或框框中數字之平均值。

另外，每一個 Receptive field 由一組 neuron 負責守備，且一個 neuron 守備區域可與其他 neuron 守備區域相同或是重疊。

![image](https://hackmd.io/_uploads/BJhV6DerR.png)

### 觀察二，相同 pattern 可能出現在不同的區域
若現在有兩張鳥的照片，一張照片的鳥嘴出現在左上角，而另一張照片的鳥嘴出現在正中間，用兩個 Receptive field 都是為了去偵測鳥嘴，其功能相同，是不是能夠使用相同的參數或共享參數(parameter sharing)，就能降低參數量呢？沒錯，是可以的。

![image](https://hackmd.io/_uploads/ryIBVOgH0.png)

剛有提到，一個 Receptive field 由一組 neuron 所守備，假設一組內總共有 64 個 neurons，偵測鳥嘴的兩個 Receptive field 就各自擁有 64 個 neurons，兩兩成對的 neuron 由於共享參數，代表參數量以及參數值皆相同，也就是下方的兩個紅色圓圈（二個 neuron），這組參數稱為 filter 1，第二對 neuron 也由於共享參數，也就是下方的兩個黃色圓圈（二個 neuron），這組參數稱為 filter 2，以此類推。

![image](https://hackmd.io/_uploads/rk_Z8ueHR.png)

### 小總結，從 Fully conneted layer 到 Convolutional layer
從 Fully conneted layer 一直到 Convolutional layer，相信你如果將上面看懂後，就能夠輕易理解下方的圖片，雖然 Fully conneted layer 的效果較全面卻也較不專精，因為它擁有大量的參數能夠較好地擬合資料，但也容易導致 Overfitting，然而上述介紹的 Receptive field + parameter sharing 能辨別重要 pattern 的位置，也能幫助降低參數量，雖然會產生較大的 bias，但是 Convoulutional layer 卻能在影像上表現得相當好，正是它獨特的優勢。

![image](https://hackmd.io/_uploads/BkUgn_bSR.png)

## 以 Filter 的角度來理解 CNN
剛有提到，一個 filter 其實就是一組參數，會去偵測守備區域的 pattern，假設 filter 的參數量 3 * 3 * 1(channel = 1)，實際上這些參數都是未知數，這裡有一張 6 * 6 大小的圖片，將 filter 1 對應於圖片上滑動 + 內積，每次向右或向下平移 1 總共會得到 16 個數字，同樣方式 filter 2 也會得到 16 個數字，以此類推，有 64 個 filter 就有 64 組 4 * 4 的圖片稱為 Feature Map，是經過一層 Convolutional layer 後的結果。

![image](https://hackmd.io/_uploads/HyoiPK-SA.png)

經過一層 Convolutional layer，會得到一組 4 * 4 大小的圖片且 channel 數量 = 64，若有第二層 Convolutional layers，那該用多少參數量的 filter 呢？答案是 3 * 3 * 64（channel = 64），必須與處理影像的 channel 數量一樣多。

當 Convolutional layer 的層數越多，也就是 Network 越深時，經過處理後的影像在 3 * 3 的面積範圍，該範圍卻是原本影像 5 * 5 的大小，也就是經過多層捲積層後，能夠在處理後的圖片中用較小範圍，就能看到原本圖片較大範圍，下方右側是經過一層 Convolutional layer 後的圖示。

![image](https://hackmd.io/_uploads/HkCgqK-S0.png =70%x)    ![image](https://hackmd.io/_uploads/ryNIRYWSA.png =29%x)

### 觀察三，Pooling
Pooling 會對卷積層(Convolutional layer)輸出的特徵圖（feature map）做降維的動作，縮小特徵圖的寬與高，同時又可以保留到最重要的特徵。

如下圖所示，使用的是 Max Pooling，也就是將圖片先切分成四等分，每一等分中各有 2 * 2 大小的矩陣，例如左上方分別由 -1, -1, -1, -1 所組成，取最大值其餘省略掉，也就是取 -1，讓我們再試一次，若是右上方為 -1, -1, -2, 1 也就是取最大值 1，重複步驟將可以獲得 4 個數字，分別是 -1, 1, 0, 3，就完成降維的動作。

![image](https://hackmd.io/_uploads/r1cIW5bSA.png)

:::info
過去非常知名的 Alpha Go 就是利用 CNN 的技術打敗世界厲害的棋手，可以將棋盤就看作是一張 19 * 19 的圖片，丟到模型後，做一次分類任務判斷該下在哪一個位置上，同時可以抓取重要的 pattern，例如哪一個子的氣快盡了，就是特別該留意的 pattern。

CNN 無法精準辨別出被放大縮小或是經過旋轉後的圖片，即使兩張都是貓咪的圖片，一張是原圖，一張是放大後的圖片，將會輸出不同的類別，正是因為其輸入已經受到改變，當然就會得到不同的輸出結果。
:::

## 總結，卷積神經網路 CNN 的架構
在文章中，我們以圖片作為例子，了解圖片如何轉換成機器能理解的樣子，並透過 Receptive field 觀察重要的 pattern 以及參數共享（parameter sharing）減少參數量，也認識到 filter 在卷積層（Convolutional layer）中的運作方式，得到一個特徵圖，接著 Pooling 降低特徵圖的維度，最終依序丟入 Fully connected layer、Softmax 得到機器預測的類別 ex: 狗、貓等。

![image](https://hackmd.io/_uploads/HkDH_5ZSC.png)

:::info
在運算能力越來越強大的時代，Pooling 的必要性就沒有那麼重要了，因為降維是為了減少運算量，若運算能力夠強大，就不需要多做此步驟，此外，CNN 除了影像外，也可以利用在語音與自然語言處理上，有興趣者可再自行研究。
:::


---
:::info 
以上就是這篇文章「卷積神經網路(Convolutional Neural Networks, CNN)」的所有內容，第一次看的人會花比較多時間消化吸收，這是很正常的事情，若有任何問題，歡迎在下方與我聯繫、討論，接下來也會繼續分享相關文章，敬請期待。