Lecture10 Convolutional Neural Network

為什么CNN常用在影像處理上?如果我們用Fully Network來做影像處理的話,每一個Neuron實際上就代表一個Classifier,舉例來說,第一層的Neuron做的事情就是有沒有綠色出現(xiàn),有沒有紅色出現(xiàn),有沒有條紋出現(xiàn),第二層的Neuron做的事情就是相比第一層更加復雜,在第一層Layer的Output基礎上,如果看到直線橫線,那么可能就是框框的一部分,如果看到棕色直條紋就是木紋,看到斜條紋就可能是輪胎等等,第三層再在第二層Layer的Output基礎上再次做更加復雜的Classify。假設我們輸入的是一張解析度100*100的彩色圖片,如果把它轉換成Vector將會有100 * 100 * 3=30000維,如果第一層Layer有1000個Neuron,那么第一層Layer的參數(shù)就有30000 * 1000個,實在是太多了,所以就需要簡化這個網絡的架構,根據我們之前掌握的知識,就可以判斷出某些參數(shù)是用不上的,一開始就把這些參數(shù)過濾掉,所以CNN是比一般的DNN更簡單的架構。

image.png

為什么我們有可能把一些參數(shù)拿掉?有如下幾個原因:
1.在影像處理中,如果我們說第一層Layer中的Neuron做的事情就是偵測有沒有某一種Pattern出現(xiàn),但是大部分Pattern是比整張Image還要小的,所以對于一個Neuron來說它不需要看整張Image。現(xiàn)在我們有一張圖片,假設某個Neuron的功能是偵測有沒有鳥嘴的出現(xiàn),只需給Neuron看紅色框框的部分它就可以決定出結果。

image.png

2.同樣的Pattern可能會出現(xiàn)在Image中不同的位置,但只需要用同一種Neuron就可以偵測出來。


image.png

3.我們可以將一個Image做一個Subsampling,分別把它的奇數(shù)行偶數(shù)列拿掉,所小為原來的1/10,對于識別結果不會產生影響。
image.png

整個CNN的結構如下:


image.png

對于圖像處理的三個特性,1跟2是通過Convolution來處理,3是通過Max Pooling來處理。


image.png

接下來介紹Convolution Layer的工作流程:假設現(xiàn)在我們Network的輸入是一張6 * 6的黑白Image,在Convolition Layer里面有一組Filter(就等于Fully Connecter Network中的一個Neuron),每一個Filter就是一個矩陣,每個矩陣中的值就是Network的Parameter(等同于Neuron的Weight和Bias),每個Filter里的參數(shù)是自動被學出來的。如果Filter是3 * 3的矩陣,那么它的功能就是偵測Image里3 * 3范圍有沒有某一個Pattern,將輸入的矩陣與每個Filter相乘,就會得到一組結果矩陣,稱為Feature Map。

image.png

如果我們的輸入是一張彩色的Image呢?彩色由RGB三種組成,所以我們的輸入矩陣其實不是跟黑白Image一樣只是一張,而是三張,所以我們每個Filter也是三張矩陣。需要注意的是對于每種顏色的矩陣不是分開來算,而是每一個Filter都考慮到了三種顏色的矩陣,對于每個Filter其中的一張矩陣,分別與Image的三張矩陣做內積,結果組合在一起。


image.png

那么Convolution跟Fully Connecter有什么關系呢?可以這么理解,Convolution其實就是Fully Connected Network中的一層Layer把某些Weight拿掉而已。通過Filter后的輸出也就是FeatureMap其實就可以當作Fully Network中一層Layer的輸出。

image.png

現(xiàn)在來分析一下Convolution中Filter的工作過程,當一個3 * 3的Filter與Image的輸入矩陣做內積時,實際上可以把Image的輸入矩陣拉直,拉成一個一維的向量,如下圖所示,內積后得到一個結果,也就是Layer中某個Neuron的輸出,而這個Neuron的Weight(也就是Filter中矩陣的參數(shù))只連接到輸入的一維向量的第1,2,3,8,9,10,13,14,15個位置的Input。而對于Fully Connected Network中,每一個Neuron的Weight是要連接到所有Input的?,F(xiàn)在我們將Input的矩陣移動一格,再與Filter做內積,得到一個結果-1,那么輸出這個結果的Neuron的Weight只連接到Image的第2,3,4,8,9,10,14,15,16個的輸入,而這個Neuron的Weight參數(shù)是與輸出3的Neuron的參數(shù)是相同的,所以這兩個Neuron做到了Share Weights(方法是我們強迫一些Neuron之間必須用相同的Weight),對于Fully Connected,每個Neuron都有一組自己的Weight,那么相比來看,Convolution又大大減少了參數(shù)的數(shù)量。

image.png

Convolution做完后接下來做MaxPooling,相比Convolution來說,MaxPooling的工作就簡單許多。根據Filter1與輸入矩陣的內積得到FeatureMap1,F(xiàn)ilter2與輸入矩陣的內積得到FeatureMap2,接下來把輸出都分為四個一組,每組可以選平均值或者最大值或者其他方法,目的就是把原來四個值合成一個值。


image.png

所以當一張6 * 6的Image做完一次Convolution和一次MaxPooling后,它就變成了一張新的2 * 2的Image。


image.png

Flatten的做法就是將FeatureMap拉直,丟到FullyConnectedNetwork中。


image.png

如何判斷一個Filter做的是什么工作?(這部分有點沒聽明白)將FeatureMap第K層的結果加起來作為第K個卷積核的激活程度。現(xiàn)在我們的任務就是找到一個x使這個激活程度最大。(通俗的說就是找一張圖案使得某個Filter的FeatureMap取得最大值,也就是這個Filter主要是用來識別這種圖案特征的。)

image.png

如下列舉了12個能夠使前12個Filter的FeatureMap值最大的Image。對于每個FIlter來說,它考慮的都是圖上一個小小的范圍而已,如果圖片上出現(xiàn)了某種條紋,那么這個Filter的輸出就會很大。

image.png

接下來分析Fully Connected中的Layer。如何弄清楚Fully Connected中的每個Neuron的功能呢?如法炮制,我們定義某一層Layer中第j個Neuron的輸出為aj,接下來要做的事情就是找一張Image輸入,使得aj取得最大值。需要注意的是,此時每個Neuron不再只是針對Image中的一個小小的范圍,而是整張Image。

image.png

那么同理再觀察最終的輸出層Neuron,假設在做數(shù)字識別,輸出層有10個Neuron,代表數(shù)字0~9,那么根據之前對Convolution中FIlter以及FullyConnected中Neuron的觀察經驗,是否輸出層每個Neuron的輸出就大致像某個數(shù)字?其實不是,結果如下,每個都像黑白電視一樣,是出錯了嗎?并不是,只是CNN學到的東西跟人類想象中的不太一樣,但它確實是能夠分辨手寫數(shù)字。


image.png

我們有沒有辦法讓這些圖看起來更像數(shù)字呢?可以根據人類的先驗知識,來加一些限制條件。比如說,一張圖片如果是手寫數(shù)字的話,那么整張圖片不可能大部分都是被涂色的(圖片中白色表示有墨水),用xij表示圖片輸入矩陣的第i行第j列的值,將所有的xij值取絕對值加起來,再用yi減去,這個公式的意思就是找到一張Image,能夠使y輸出最大的情況下圖片中大部分的地方是沒有涂色的,結果比不加限制條件時更加像一個數(shù)字。

image.png

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容