卷積神經網路(Convolutional Neural Networks)是深度學習領域的發展主力,它也被稱為 CNNs 或 ConvNets, 電腦視覺這領域是因為CNN的關係在近幾年有了許多重大進展, CNN 在影像辨識中甚至可以超越人類辨識的精準度。
它是一個很直觀的演算法,概念跟人類以眼睛去辨識有模擬相似之處。
一、CNN的基本概念:
CNN可分為四部份:填白(padding)、stride 步長、池化(pooling)以及卷積(convolution)。
1、padding 填白:
原圖像在經過filter卷積之後,變小了,主要有兩個問題:
- 每次卷積,圖像都縮小,這樣卷不了幾次就沒了
- 相比於圖片中間的點,圖片邊緣的點在卷積中被計算的次數很少。
邊緣的信息就易於丟失。爲了解決此問題,我們可以採用padding的方法。我們每次卷積前,先給圖片周圍都補一圈空白,讓卷積之後圖片跟原來一樣大,同時,原來的邊緣也被計算了更多次。比如,我們把(8, 8)的圖片給補成(10, 10),那麼經過(3, 3)的filter之後,就是(8, 8),沒有變。
我們把上面這種「讓卷積之後的大小不變」的padding方式,稱為 「Same」方式, 把不經過任何填白的,稱為 「Valid」方式。這個是我們在使用一些框架的時候,需要設置的超參數。
2、stride 步長:
前面我們介紹的卷積,都是默認步長是1,但實際上,我們可以設置為其他的值。 例如對於(8, 8)的輸入,我們用(3, 3)的filter。
如果stride=1,則輸出爲(6, 6);
如果stride=2,則輸出爲(3, 3)。
3、pooling 池化:
這個pooling,是為了提取一定區域的主要特徵,並減少參數數量,防止模型過擬合。 如下的Max Pooling,採用了一個2×2的視窗,並取stride=2:
通過卷積操作,我們完成了對輸入圖像的降維和特徵抽取,但特徵圖像的維數還是很高。維數高不僅計算耗時,而且容易導致過擬合。為此引入下採樣技術,也稱為 pooling即池化操作。
Pooling常用的方式有二種,Max Pooling,Mean Pooling。
Pooling的做法是對圖像的某一個區域用一個值代替,如最大值或平均值。如果採用最大值,叫做 max 池化;如果採用均值,叫做均值池化。此外Max Pooling,還有Average Pooling,就是取那個區域的平均值。
4、對多通道(channels)圖片的卷積:
彩色圖像,一般都是RGB三個通道(channel)的,因此輸入數據的維度一般有三個:(長, 寬, 通道)。
如28×28的RGB圖片,維度就是(28, 28, 3)。前面的例子看到,輸入圖片是2維的(8, 8),filter是(3, 3),輸出也是2維的(6, 6)。 如果輸入圖片是三維會產生什麼情況呢?(即增多了一個channels),比如是(8, 8, 3),這個時候,我們的filter的維度就要變成(3, 3, 3)了,它的 最後一維要跟輸入的channel維度一致。
這個時候的卷積,是三個channel的所有元素對應相乘後求和,就是9個乘積的和,現在是27個乘積的和。因此,輸出的維度並不會變化。還是(6, 6)。 但一般我們會使用多了filters同時卷積,如果我們同時使用4個filter的話,那麼輸出的維度則會變爲(6, 6, 4)。這裡特地畫了下面這個圖,來展示上面的過程:
(輸入圖像是(8, 8, 3),filter有4個,大小均為(3, 3, 3),得到的輸出爲(6, 6, 4))
其實,如果套用我們前面學過的神經網路的符號來看待CNN,我們的輸入圖片就是X,shape=(8, 8, 3);4個filters其實就是第一層神經網路的參數W1,shape=(3, 3, 3, 4),這個4是指有4個filters;我們的輸出,就是Z1,shape=(6, 6, 4),後面其實還應該有一個啟動函數,比如ReLU,經過啟動後,Z1變為A1,shape=(6, 6, 4)。所以,在前面的圖中,加一個啟動函數,給對應的部分標上符號,就是這樣的:
二、CNN的結構組成
上面我們已經知道了卷積(convolution)、池化(pooling)以及填白(padding)是怎麼進行的。
接下來我們來看看典型的卷積神經網路三種Layers組成:卷積層(Convolution layer)、子採樣池化層(Subsampling/ Pooling layer)、全連接層(Fully connected layer)。
1、Convolutional layer(卷積層–CONV)
卷積運算是線性操作,而神經網路要擬合的是非線性的函數,因此和前全連接網路類似,我們需要加上啟動函數,常用的有 sigmoid 函數,tanh 函數,ReLU 函數等。 神經網路前部卷積層有小的感受野,可以捕捉圖像局部、細節資訊,即輸出圖像的每個圖元(Activation啟動值)只是感受到輸入圖像很小範圍數值進行計算的結果。
2、Pooling layer(池化層–POOL)
這裡沒有參數需要我們學習,因爲參數都是設置好了,是Max pooling或是Average pooling。需要指定的超參數,包括是Max還是Average,視窗大小以及步長。 通常,我們使用的比較多的是Max pooling,而且一般取大小為(2, 2)步長為2的filter,這樣,經過pooling之後,輸入的長寬都會縮小2倍,channels不變。
3、Fully Connected layer(全連接層–FC)
這個前面沒有講,是因爲這個就是我們最熟悉的傢夥,就是我們之前學的神經網路中的那種最普通的層,就是一排神經元。因為這一層是每一個單元都和前一層的每一個單元相連接,所以稱之為「全連接」。 這裡要指定的超參數,無非就是神經元的數量,以及啟動函數。
接下來,我們隨便看一個CNN的模樣,來獲取對CNN的一些感性認識:
上面這個CNN是我隨便拍腦門想的一個。它的結構可以用: XàCONV(ReLU)àMAXPOOLàCONV(ReLU)àFC(RelU)àFC(softmax)àY來表示。 這裏需要說明的是,在經過數次卷積和池化之後,我們 最後會先將多維的數據進行「扁平化」,也就是把(height, width, channel)的數據壓縮成長度為 height × width × channel 的一維數組,然後再與 FC層連接,這之後就跟普通的神經網路無異了。
可以從圖中看到,隨著網路的深入,我們的圖像(嚴格來說中間的那些不能叫圖像了,但是爲了方便,還是這樣說吧)越來越小,但是channels卻越來越大了。在圖中的表示就是長方體面對我們的面積越來越小,但是長度卻越來越長了。
二、CNN的應用
- 卷積神經網路提升圖像辨識效率
現階段可具體展現深度神經網路能力的應用,如圖像辨識領域。以電腦視覺社群每年舉辦的圖像標籤挑戰賽ImageNet為例,自2012年起開始有參賽團隊採用深度神經網路技術贏得勝利,並且準確度逐年攀升,到了2015年達到與人類圖像辨識相同的水準。
醫學博士的Google研究團隊產品經理彭浩怡進一步說明,在傳統電腦視覺領域中,若研究人員欲建構熊貓分類機制,必須先把熊貓特徵輸入到淺分類,經由研究人員對資料進行分析研究後,理解特性所定義的特徵,此程序即為特徵工程;而深度學習網路架構中最常見的卷積神經網路(Convolutional Neural Network,CNN),主要是透過足夠數量的資料集實作,換句話說,只要提供很多不一樣的熊貓照片學習理解後,再提供非熊貓的照片,不用人工撰寫規則,卷積神經網路即可自主學習辨識熊貓的能力。如此一來,可以省下研究人員耗費時間打造特徵工程,現在則轉變為準備原始資料,即可建立模型架構、數據優化,讓圖像辨識更有效率。
【相關課程】提升 AI 實作能力必備,深度學習 TensorFlow 基礎與應用
這門課將系統化的依照 30 個完整的模組,帶你逐步累積深度學習的概念,從基本的 DNN 開始介紹,並逐次導入 CNN 與 RNN 等應用,透過 24 實作範例,協助你解決不知該從哪些工具下手、該如何開始實作、該如何整合資料… 等最實際迫切的深度學習問題。
想成為爬蟲工程師 、資料分析師 、資料工程師 、資料分析領域專家 、人工智慧產品經理嗎?還是你的公司正需要培養此領域人才呢?
點我了解 AI資料科學家-三階段全方位學程班 👉 https://www.tibame.com/eventpage/ai_datascientist
每日5分鐘, 提拔我園丁陪你快速添補AI/資料科學知識與技能。
若想了解更多AI/資料科學的小知識、及各產業的相關應用,歡迎訂閱TibaMe FB及部落格,或有其他想了解的主題歡迎在下方留言讓我們知道唷!
參考資料