CNN (Convolutional Neural Network) === ###### tags: `李宏毅` [TOC] ## 教材 * [pdf](https://drive.google.com/file/d/1Ic07oPsRC7QBU_z6JzXrfRCxKo3OgLXK/view?usp=sharing) * [youtube](https://www.youtube.com/watch?v=OP5HcXJg2Aw) ## 簡介 * 介紹 ![](https://i.imgur.com/wvz7Upz.png) * 專門被用在影像上 * 影像分類 * 輸入 * 假設一個固定大小的圖片,如果有各種大小的圖片就先 Rescale 再拿去餵 Model * 輸出 * model 的輸出是一個 One-hot Vector y' * 跟 Ground Truth ŷ 的 Cross Entropy 越小越好 * 目標 * 一個 One-hot vector ŷ,只有一個 1 其餘為 0 * 目標 Dimension 有多少,代表可以辨識多少種圖片 * 模型 * 一張圖片是一個 3-D tensor,tensor 可以想成維度大於 2 的矩陣 * 三維分別是長、寬、channel 數目(RGB 3 channels) * 三維的 tensor 拉直就可以變成向量作輸入 * 每個數值都是 pixel 的顏色 * 假設長 = 100, 寬 = 100, channel = 3,然後有 1000 個 neuron,則在 Fully Connected Network 中 Weight 共有 3 * 10^7 個 ## 模型性質 Weight 多較有彈性,但也容易 Overfitting。所以以下 Observation、Simplification 就是要來簡化 CNN。 ![](https://i.imgur.com/JydLlFJ.png) ### Observation 1 有些 neuron 不需要存在,因為只需要讓模型看到圖片的一小部分就足夠,所以可以做簡化。 ![](https://i.imgur.com/JQOIuIS.png) #### Receptive Field 小區域給一個 Neuron 當作輸入,每個 Neuron 只在乎自己的 Receptive Field,決定 Receptive Field 的方法自己定義。同個範圍可以有多個 Neuron,Receptive Field 大小不一定要相同,也不一定要同時考慮所有 Channel,形狀也可以自己變化。 ![](https://i.imgur.com/PExeNRS.png) #### Simplification 1 所有 Channel 不一定都會考慮,形狀也自己定義。一個 Receptive Field 往旁邊移動一個 Stride 就又是另一個 Receptive Field,Stride 大小自己定義。總之根據對問題的理解去做任何改變。 ![](https://i.imgur.com/DzikV8Q.png) #### Typical Setting 一般會看所有的 Channel。 長跟寬稱作 Kernel Size,一般不會設太大,大多做 3 x 3,同時會有多個 Neuron 照顧同個 Receptive Field。 但是因為 3x3 不一定能夠包含所有的圖片特徵,所以 Stride 一般設 1 或 2,目的是希望 receptive field 有重疊。 如果 receptive field 超出範圍就補 padding,可以補 0 或是平均等等。 ![](https://i.imgur.com/X37hHzQ.png) ### Observation 2 同樣的 Pattern 可能出現在不同位置,如果有個負責偵測鳥嘴的 Neuron,假設在每個 Receptive Field 都放一個這樣的 Neuron 就重複了。 ![](https://i.imgur.com/bdn95Zq.png) #### Simplification 2 讓不同 Receptive Field 的 Neuron 共享參數(Parameter Sharing),其中的 Weight 完全一樣。 因為輸入是不同的 Receptive Field,所以輸出也不同,共享的方式可以自己定義。換句話說,在同個 Receptive Field 內的 Neuron 們彼此就不會共享參數。 ![](https://i.imgur.com/YtaLsxV.png) #### Typical Setting 常見的方式是,每個 Receptive Field 都有一組 Neuron,每個 Receptive Field 共享相同參數的 Neuron,共享的參數叫做 Filter。 ![](https://i.imgur.com/k2wsHRa.png) ### Observation 3 一張圖片可以假設同一小區塊的值是相近的。 #### Simplification 3 每個 Filter 都產生一組數字,要做 Pooling 時就把這些數字分組並選擇其中一個數字代表它們。在 Max Pooling 是選最大的那個,Min Pooling 則是選每組最小的,分組方式可以自己定義。 ![](https://i.imgur.com/V8vslNV.png) 通常 convolution 做完會做 Pooling,目的是讓目前圖片的變小。不過 Pooling 也有可能造成不好的效果,如果要觀察的是比較細微的特徵的話。 ![](https://i.imgur.com/hiO7TCX.png) ## Convolutional Layer 做完參數共享後, CNN 就被簡化成如下圖。CNN 是 專門為影像設計的,有用到 Convolutional Layer 的 Neural Network 就是 CNN。 ![](https://i.imgur.com/PVVUrBk.png) ### 使用 Model 假設已經訓練完要測試了,那 Weight 的矩陣(Filter) 對圖片做了什麼? 1. 把 Filter 跟 Receptive Field 的值做 Inner Product 2. 往旁邊移 Stride 個距離 3. 再跟目前的 Receptive Field 做 Inner Product 4. 重複直到所有 Receptive Field 都做完 5. 把每個 Filter 也都做一次前面的步驟,全部做完得到 Feature Map 6. Feature Map 可以看成是另一張圖片,只是 Channel 對應到的不是 RGB,而是 Filter ![](https://i.imgur.com/wwzd5Hn.png) 7. 通常接著會做 Pooling,Channel 不變,但是長寬變小 8. 再拿去做下一層的 Convolution,只是這層的 Filter 的大小變成上一層的 Filter 數量。下一層的 Filter 比上一層的 Filter 看到的圖片範圍更大,因為下一層的 Receptive Field 是從上一層的圖片重疊來的。因此層數越高 ,圖片範圍看得越廣 9. 做 Flatten,把矩陣拉直變成向量 10. 丟到 Fully Connected Layers 11. 過個 Softmax 得到影像辨識的結果 ![](https://i.imgur.com/r6CcFj0.png) ## CNN 應用 * CNN 應用 - 圍棋 * 輸入 * 黑子跟白子的位置 * 把棋局變向量,19x19 拉直,例如黑子是 1,白子 -1,空的 0 * 原理 * 當作是一個分類問題,看到目前棋局,分類出下在哪最好 * 可以用 Fully-connected network,但是 CNN 效果更好,因為可以把棋局當作是一張圖。不一定要看完整張圖才知道發生什麼事(Receptive field)、相同棋型出現在不同地方(Parameter Sharing) * 但是沒有使用 pooling,因為不適用,因為不太能取出局部的代表,論文裡也沒有使用 pooling * Alpha Go 論文用 48 個 channel * 輸出 * 下一步落子位置 * 其他 * 也有用在語音(Speech)和自然語言(NLP)上,只是其中的步驟需要重新設計 * CNN 在影像上不能處理縮放(scaling)和旋轉(rotation)的情形,因為輸入的 vector 會差很多,所以在訓練時要做 data augmentation * 有個 layer 可以處理縮放和旋轉的問題,叫做 [Spatial Transformer Layer](https://www.youtube.com/watch?v=SoCywZ1hZak&ab_channel=Hung-yiLee),又是另一堂課