卷積神經網路(Convolutional neural network, CNN) — 卷積運算、池化運算
卷積神經網路(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卷積計算在做什麼
這篇文章主要是要先介紹卷積神經網路(Convolutional neural network, CNN)會用到的運算方式-卷積運算(Convolution)、池化運算(Pooling)。
廢話篇
現今的數位影像在電子產品的程現就是由很多的小點(像素pixel)一起組成,在此不多說影像的取得是如何生成的。以下針對影像像素和產生來說明,因為卷積神經網路(Convolutional neural network, CNN)一開始就是提在影像上的模型,裡面用到的卷積部份(Convolution)和池化部份(Pooling)會和像素有相關。
大家應該都聽過八百萬畫素,一千萬畫素,這幾百萬幾千萬就代表影像解析度,當然越高的畫素解析度越好。
計算公式: 影像寬度像素值 x 影像高度像素值 = 影像總像素值
八百萬3,360 x 2,460=8,265,600
一千萬3,648 x 2,736=9,980,928
這邊只決定影像的清晰程度,色彩豐富程度跟此無關。
下圖的例子(左圖18*18=324,右圖50*70=3500)就是在說明,如果像素越高,影像越清晰。
所以當我們在對影像作處理或是影像作辨識時,我們都需要從每個像素中去取得這張圖的特徵,除了每個像素的值之外,還需要考慮像素和像素之間的關連。
其中將影像進行特徵萃取的方法就是將影像進行濾波(filter),得到更有用的資訊,比如用在邊緣(Edge Detection)偵測的derivative mask(遮罩)有Prewitt operator,其遮罩設計出來後,利用卷積運算達到濾波影像的功能,得到只有邊的圖片,下圖就是我用Prewitt operator水平和垂直邊緣偵測用卷積運算得到的結果。
CNN基礎介紹-卷積運算(Convolution)
假設大家知道什麼是灰階影像(8位元)。
下圖是一個數字0(像素值為10*10=100),人的眼睛看到的是左圖,電腦看到的是右圖。
濾波影像 = 影像*Operator mask (note: * 不是乘號是卷積運算)
我這邊亂設計一個Operator mask(大小3x3)
這邊開始對每個像素做卷積運算,圖片中紅色框起來的部份會和Operator mask進行點跟點相乘,最後在全部相加得到結果,這個步驟就是卷積運算。
整張圖的濾波就是每個位置都會運算到,運算方式一般都是從左上角開始計算,然後橫向向右邊移動運算,到最右邊後在往下移一格,繼續向右邊移動運算,直到整張圖都完成,如下圖。
下圖是大家常見卷積運算的圖,和上面是做一樣的事情,只是為了讓大家清楚知道卷積運算怎麼執行的,所以做了上面兩張圖。
最左邊是原始影像,經由中間的mask去做卷積後,可以得到最右邊那張圖。
Note:
- 大家有沒有意識到整張圖掃過一遍後,圖的大小會變小,從原本的10x10變成8x8。如果你不想濾波完,圖變小,當然還有很多技巧(關鍵字: zero padding),比如先將圖擴大到12x12其他部份先塞0進去,在進行一次卷積運算得到10x10的圖。
- 從來沒有人說mask在移動的時候只能移動一格,所以在用開源模組時,Convolution部份會有一個參數叫strides可以設定,看你一次想移動幾格。
CNN基礎介紹-池化(Pooling)
池化目的只是在將圖片資料量減少並保留重要資訊的方法,把原本的資料做一個最大化或是平均化的降維計算。本文取一個2x2的最大池化法(max pooling)當作例子。
所以整個圖片做池化的方式如下圖,原本8x8的圖片因為我取2x2的池化,所以會變成4x4。
當然池化法除了最大化池化法外,也可以做平均池化法(取最大部份改成取平均)、最小化池化法(取最大部份改成取最小化)等。
從上圖可知max pooling後整張圖等於白的,所以此例就比較不適合用max pooling的方式。
Note:
圖的大小很容易因為pooling變得很小,2x2的Pooling會讓圖小一半,3x3的pooling小3分之1。所以跟卷積運算一樣,Pooling也可以用zero padding和strides的方式,讓圖不要一次變太小。