---
# System prepended metadata

title: CNN
tags: [機器學習]

---

模型輸入影像大小固定，如果不是正方形或過大，則做 rescaleing (調整圖片的長寬以符合模型輸入的形狀)

模型的輸出在經過 softmax 後，希望與結果的 one-hot vector 有最小的 cross entropy

## 影像
*Tensor* : 超過二維的 matrix
*Channel* : 顏色的多寡，如 RGB 則為 3，黑白則為 1

影像會被視為是一個三維的 Tensor ，分別為：寬、高、Channel，network 輸入為向量，所以影像會被拉伸為一維向量

network 通常不使用 fully connected network ，因容易增加模型的彈性及容易產生 overfitting ，可以通過觀察影像辨識的特性來減少參數的數量


## 觀察及簡化： Receptive field
有些 pattern 不是整張圖片，而是一些範圍較小的區域，如鳥嘴、鳥爪等等
也就是說，可以讓一個神經元關心一小部分的區域就行

### Receptive field
決定一小部分的寬高以及 channel ，即是一個 Receptive field
![image](https://hackmd.io/_uploads/SJ0xjYPqC.png)

#### 如何得出
**自己決定**

- 不同 Receptive field 可以重疊
- 可以存在不同大小 Receptive field 
- 可以只考慮單個 channel
- 可以不是正方形

### Typical Setting
*kernel size* : 通常考慮全部 channel ，延伸出名詞 kernel size 代表**寬乘高**
    > 通常使用 3 x 3 就足夠了，設為 5 x 5 或 7 x 7 都過大
    > 會太小嗎? [解答](#3-x-3-會不會太小)
*stride* : Receptive field 的移動距離，通常會設 1 或 2 ，讓 Receptive field 有重複的範圍
*padding* : 當 Receptive field 超出影像範圍，通常會在溢出的地方補零


通常會有一組 (64 個) 神經元去觀測一個 Receptive field 


## 觀察及簡化： Parameter Sharing 
同樣的 pattern 可能出現在不同地方，那我們用同一個神經元(這個神經元可能是判定鳥嘴的神經元)去判斷不同的 Receptive field 會不會比較好
![image](https://hackmd.io/_uploads/H1qQaKv90.png)

### Parameter Sharing 
神經元的參數權重都是一樣的，但輸出不會是一樣的，因為輸入不一定是一樣的，而且還有 bias 與 Activation function
![image](https://hackmd.io/_uploads/SkYx0tP50.png)

#### 如何得出
**自己決定**

### Typical Setting
*filter* : 參數權重一樣的神經元

Receptive field 的神經元通常是同一組一樣的
![image](https://hackmd.io/_uploads/SknH0YPq0.png)

# 標題回收
*Receptive field* : pattern 不會是整張圖片，更大機率是小範圍的影像
*parameter sharing* : 判斷 pattern 需要同一組參數

Receptive field + parameter sharing = Convolutional Layer
![image](https://hackmd.io/_uploads/SJbOk9vqA.png)

雖然 bias 大，但在影像辨識上沒差，而因為增加以上兩種特性， CNN 大部分是使用在影像辨識上

## 另一種介紹方法 (based on filter) 

Convolution 就是一堆的 Filter ，而這些 Filter 去影像內抓 pattern 出來

Filter 內的值會用 梯度下降 找出來
![image](https://hackmd.io/_uploads/Hk_Nlqw5A.png)

*Feature map* : 影像通過 Convolution (也就是一堆 Filter 對 Receptive field 做內積)後得出的新的「影像」

新「影像」的 chaneel 數是 filter 的數目，也就是說 filter 有 64 個的情況，原始影像經過一次 Convolution 後， channel 數會是 64
![image](https://hackmd.io/_uploads/S1sClqwcR.png)

### 3 x 3 會不會太小
**不會**，因為 feature map 也會再做 convolution ，這樣第一次後的 filter 可以看到不同範圍的原始影像的區域
![image](https://hackmd.io/_uploads/BylHWcD50.png)


## 觀察及簡化： Pooling
將大圖縮小後， pattern 感覺還是同一個類別
![image](https://hackmd.io/_uploads/H1YhZqv90.png)

### Pooling
在範圍內選擇數值作為代表，可以是最大值、最小值、幾何平均或算數平均等等

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

pooling 通常會縮小「影像」，原先目的是減少計算量，但對於需要判斷較細微的 pattern 時， performance 就沒那麼好

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


# The whole CNN
Convolution 與 Pooling 可以交錯，也可以多次 Convolution 後再一次 Pooling，也可以不用 Pooling (alpha go)

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


# 其他應用
## Alpha GO
19 寬
19 高
48 channels 叫吃等等其他規則

### 為什麼可以在 go 上使用 CNN?
檢查特點
- Receptive field
    需要判斷的範圍是否小於整張圖片
    **是，Alpha GO 使用 5 x 5 的範圍**
- parameter sharing
    判斷的結構是否會在其他地方出現
    **是**
    ![image](https://hackmd.io/_uploads/S1s-E5PqR.png)

- 適合 pooling 嗎?
    **不適合，拔除一部分的棋盤可能不能代表整個棋局，所以 Alpha GO 沒有使用 Pooling**

## 語音及文字
可能有用其他的特性與方法，不能直接用影像處理的 CNN 去套用

# 缺點
CNN 無法處理圖片縮放或旋轉的情境，所以需要做 Data Augmentation (資料增強)
除此之外， Spatial Transformer Layer 可以達成這些目標