## 什麼是卷積神經網路(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)」的所有內容,第一次看的人會花比較多時間消化吸收,這是很正常的事情,若有任何問題,歡迎在下方與我聯繫、討論,接下來也會繼續分享相關文章,敬請期待。