TShopping

 找回密碼
 註冊
搜索
查看: 130|回復: 0

[教學] 卷積神經網路(Convolutional neural network, CNN) — CNN運算流程

[複製鏈接]
發表於 2021-2-5 22:21:31 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk  

卷積神經網路(Convolutional neural network, CNN)其他相關連結我也一起列上來


NN-2–1 卷積神經網路(Convolutional neural network, CNN) — 卷積運算、池化運算
NN-2–2 卷積神經網路(Convolutional neural network, CNN) — CNN運算流程
NN-2–3 卷積神經網路(Convolutional neural network, CNN):卷積計算的倒傳遞推導與稀疏矩陣觀點來看卷積計算
NN-2–4 卷積神經網路(Convolutional neural network, CNN):卷積計算中的步伐(stride)和填充(padding)
NN-2–5 卷積神經網路(Convolutional neural network, CNN): 1×1卷積計算在做什麼


一般網路文章都以LeNet-5當作範例,這部份我先不用LeNet-5當例子來說,因為如果不懂CNN流程/運算就看LeNet-5,應該只會更頭痛吧(雖然LeNet-5結構不難)。

本篇文章主要是介紹CNN運作時的細節部分,所以我會我會先舉一個8*8的圖要分成兩類的範例來介紹。此CNN範例只做一次卷積(2個kernel maps)、一次池化(Pooling)、和一個全聯節層(Fully connection,hidden layer 1層,output為兩類,所以output nodes為兩個),結構如下:


卷積神經網路 Convolutional neural network CNN

卷積神經網路 Convolutional neural network CNN




此範例CNN的流程圖

卷積神經網路 Convolutional neural network CNN

卷積神經網路 Convolutional neural network CNN


此範例CNN的示意圖,第二層出現的Map 1和Map 2為Kernel Maps用來做卷積運算,激活函數我先不放到圖片去講,因為他只是在feature map部份做個非線性轉換。卷積部份(Convolution):

卷積運算的mask一般稱為kernel map,其數量是可以調整的,在此舉兩個3x3的kernel maps。

一般在影像上,捲積運算後會再加上激活函數(activation function),進行非線性轉換,之後得到的圖片會稱為特徵圖(feature map)。

Feature map{i} = original Data * Kernel Map{i} (*為卷積運算)

池化部份(Pooling):

池化法會根據feature map的結果去做pooling,然後得到的就是降維的特徵圖。此例為2x2的Pooling。

Flatten部份:

因為做完卷積運算和池化法後得到的特徵圖還是一個2-D的圖片,到全連接層前要先轉成1-D的陣列。(如果做完卷積或是池化後結構是1x1的feature map,此步驟可以省略)


卷積神經網路 Convolutional neural network CNN

卷積神經網路 Convolutional neural network CNN



全連接層部份(Fully connection):

這邊等於一般神經網路,請參照MLP

Input node: Flatten後的結果,此例為18個nodes。

Hidden layer: 1層 5個nodes

Output node: 2個輸出結果。


解析CNN

卷積神經網路實線的重點之一就是權重共享(Shared Weight)這件事情,下左圖,透過卷積運算的方法達到Local connected neural nets。

權重共享(Shared Weight)就是假設每個輸出的結果權重都是一樣的,這樣就大幅簡少訓練模型時的參數。

在卷積部份參數量是根據我設計的kernel map數量和大小決定的,此範例為(3*3)*2=18 (此篇先不考慮bias存在)。

從全連接層可以得知一般的神經網路(MLP/DNN),在node之間是有完全連線起來的,每一條線上都有ㄧ個參數(weight)需要靠訓練得到。所以全連接層所有weight數為Input node*hidden node+hidden node*output node=18*5+5*2=100,請參考上圖"範例CNN的示意圖"。


卷積神經網路 Convolutional neural network CNN

卷積神經網路 Convolutional neural network CNN


神經網路的學習網路架構框好後

所有參數/weight都是靠資料學習推導來的,不是try出來的。

早期影像方面的算法(機器學習)都是

影像→特徵擷取(方法有SIFT、HOG等)→分類。

特徵擷取(方法有SIFT、HOG等)是try出來的。問題是特徵擷取這部份需要有非常專業的專家知識,必須知道什麼是對此分類問題重要的特徵,從影像中擷取出來後在做分類。但事實上專家的知識也是有盲點的,從大量資料(big data)中或許可以突破這個盲點,進而早到更合適的特徵。

因此深度學習就是可以克服這個問題,其結構為

影像→深度學習(特徵擷取+分類)。

卷積神經網路中的「卷積」就是特徵擷取的方法,此部份必須靠大量資料的特性不斷的反覆學習,在學習中盡可能滿足設立的條件,達到目標。所以在用深度學習時通常希望訓練樣本數可以非常大,這樣電腦在學習Kernel map時才能靠著的optimizer(通常用Stochastic Gradient Descent,SGD)利用倒傳遞(backpropagation)學習更有效得到適合的答案。

PS: 如果樣本數小就必須依靠前人的貢獻來達到相同的目的(關鍵字:遷移學習,transfer learning)。


當有兩層卷積層時,Feature Map會?

上面是介紹只有一層卷積層的情況,但當有兩層卷積層,那Feature map會變更多嗎?答案是會。

一般網路找到的例子都是
輸入是1個channel的圖,然後用一個3×3 Kernel Map做卷積
所以這篇文章一開始有寫錯,我去仔細看tensorflow的code發現我當初這邊的寫法寫錯了(2018/08/28修正)。

卷積層的個數參數是跟輸入channel有關,基本上輸入channel有幾個,每個kernel map大小就是 k × k × channel數。
所以假設輸入影像有(R, G, B)三個channel,進行一次10個5×5的Kernel Map,就會有5×5×3×10=750個參數。

本例子假設輸入一張影像(R, G, B),所以輸入為 3個channel的4×4影像

1st卷積層(Conv. 1)
設定2個3×3的kernel map,但卷積層Kernel的深度是跟輸入channel有關,所以Kernel Map的深度為3,每個kernel map實際大小為3×3×3(上一層的channel數),因此每個channel會各自對Kernel Map的不同深度各自做卷積,最後三個卷積結果再作Pixel-wise sum,所以1st卷積層(Conv. 1)輸出的影像就會有2張(4×4)。
此例: 1st卷積結果=Image(R)*kernel map(:,:,1)+ Image(G)*kernel map(:,:,2)+ Image(B)*kernel map(:,:,3)

2nd卷積層(Conv. 2)
設定3個3×3的kernel map,但卷積層Kernel的深度是跟輸入channel有關,所以Kernel Map的深度為2,每個kernel map實際大小為3×3×2(上一層的channel數),所以2nd卷積層(Conv. 2)輸出的影像就會有3張(4×4)。


卷積神經網路 Convolutional neural network CNN

卷積神經網路 Convolutional neural network CNN


* 此圖例的主要是要視覺化說明卷積在設定不同filter數量時,kernel map和輸入輸出的feature map變化,所以我是假設輸入和輸出feature map是一樣大,實質上此例的卷積運算pad=1 (因為kernel size=3),這樣卷積後輸出的feature map大小才會跟輸入一樣。pad設定請看此篇文章


文章出處

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2021-2-28 16:40 , Processed in 0.061911 second(s), 24 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表