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) ## 簡介 * 介紹  * 專門被用在影像上 * 影像分類 * 輸入 * 假設一個固定大小的圖片,如果有各種大小的圖片就先 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。  ### Observation 1 有些 neuron 不需要存在,因為只需要讓模型看到圖片的一小部分就足夠,所以可以做簡化。  #### Receptive Field 小區域給一個 Neuron 當作輸入,每個 Neuron 只在乎自己的 Receptive Field,決定 Receptive Field 的方法自己定義。同個範圍可以有多個 Neuron,Receptive Field 大小不一定要相同,也不一定要同時考慮所有 Channel,形狀也可以自己變化。  #### Simplification 1 所有 Channel 不一定都會考慮,形狀也自己定義。一個 Receptive Field 往旁邊移動一個 Stride 就又是另一個 Receptive Field,Stride 大小自己定義。總之根據對問題的理解去做任何改變。  #### Typical Setting 一般會看所有的 Channel。 長跟寬稱作 Kernel Size,一般不會設太大,大多做 3 x 3,同時會有多個 Neuron 照顧同個 Receptive Field。 但是因為 3x3 不一定能夠包含所有的圖片特徵,所以 Stride 一般設 1 或 2,目的是希望 receptive field 有重疊。 如果 receptive field 超出範圍就補 padding,可以補 0 或是平均等等。  ### Observation 2 同樣的 Pattern 可能出現在不同位置,如果有個負責偵測鳥嘴的 Neuron,假設在每個 Receptive Field 都放一個這樣的 Neuron 就重複了。  #### Simplification 2 讓不同 Receptive Field 的 Neuron 共享參數(Parameter Sharing),其中的 Weight 完全一樣。 因為輸入是不同的 Receptive Field,所以輸出也不同,共享的方式可以自己定義。換句話說,在同個 Receptive Field 內的 Neuron 們彼此就不會共享參數。  #### Typical Setting 常見的方式是,每個 Receptive Field 都有一組 Neuron,每個 Receptive Field 共享相同參數的 Neuron,共享的參數叫做 Filter。  ### Observation 3 一張圖片可以假設同一小區塊的值是相近的。 #### Simplification 3 每個 Filter 都產生一組數字,要做 Pooling 時就把這些數字分組並選擇其中一個數字代表它們。在 Max Pooling 是選最大的那個,Min Pooling 則是選每組最小的,分組方式可以自己定義。  通常 convolution 做完會做 Pooling,目的是讓目前圖片的變小。不過 Pooling 也有可能造成不好的效果,如果要觀察的是比較細微的特徵的話。  ## Convolutional Layer 做完參數共享後, CNN 就被簡化成如下圖。CNN 是 專門為影像設計的,有用到 Convolutional Layer 的 Neural Network 就是 CNN。  ### 使用 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  7. 通常接著會做 Pooling,Channel 不變,但是長寬變小 8. 再拿去做下一層的 Convolution,只是這層的 Filter 的大小變成上一層的 Filter 數量。下一層的 Filter 比上一層的 Filter 看到的圖片範圍更大,因為下一層的 Receptive Field 是從上一層的圖片重疊來的。因此層數越高 ,圖片範圍看得越廣 9. 做 Flatten,把矩陣拉直變成向量 10. 丟到 Fully Connected Layers 11. 過個 Softmax 得到影像辨識的結果  ## 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),又是另一堂課
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up