CNN卷積神經網路原理的直觀理解
哈哈?偶然在知乎上翻到了我旭神對CNN原理的通俗易懂的解釋,看完以後簡直醍醐灌頂呢。 下面上頭像!! 哼,趕緊記錄一下加強一下理解! 轉自知乎我旭神
如果學過數字影象處理,對於卷積核的作用應該不陌生,比如你做一個最簡單的方向濾波器,那就是一個二維卷積核,這個核其實就是一個模板,利用這個模板再通過卷積計算的定義就可以計算出一幅新的影象,新的影象會把這個卷積核所體現的特徵突出顯示出來。比如這個卷積核可以偵測水平紋理,那捲積出來的圖就是原圖水平紋理的影象。現在假設要做一個影象的分類問題,比如辨別一個影象裡是否有一隻貓,我們可以先判斷是否有貓的頭,貓的尾巴,貓的身子等等,如果這些特徵都具備,那麼我就判定這應該是一隻貓(如果用心的話你就會發現這就是CNN最後的分類層,這一部分是我們傳統的神經網路的範疇)。關鍵在於這些特徵是高階的語義特徵,這種特徵怎麼用卷積核提取呢?原來的卷積核都是人工事先定義好的,是經過演算法設計人員精心設計的,他們發現這樣或那樣的設計卷積核通過卷積運算可以突出一個什麼樣的特徵,於是就高高興興的拿去卷積了。但是現在我們所需要的這種特徵太高階了,而且隨任務的不同而不同,人工設計這樣的卷積核非常困難。於是,利用機器學習的思想,我們可以讓他自己去學習出卷積核來!也就是學習出特徵!如前所述,判斷是否是一隻貓,只有一個特徵不夠,比如僅僅有貓頭是不足的,因此需要多個高階語義特徵的組合,所以應該需要多個卷積核,這就是為什麼需要學習多個卷積核的原因。還有一個問題,那就是為什麼CNN要設計這麼多層呢?首先,應該要明白,貓的頭是一個特徵,但是對於充斥著畫素點的影象來說,用幾個卷積核直接判斷存在一個貓頭的還是太困難,怎麼辦?簡單,把貓頭也作為一個識別目標,比如貓頭應該具有更底層的一些語義特徵,比如應該有貓的眼睛、貓的耳朵、貓的鼻子等等。這些特徵有的還是太高階了,沒關係,繼續向下尋找低階特徵,一直到最低階的畫素點,這樣就構成了多層的神經網路。最好,CNN最不好理解的就要放大招了。雖然我們之前一直用一些我們人常見的語義特徵做例子,但是實際上CNN會學習出貓頭、貓尾巴、貓身然後經判定這是貓嗎?顯然我們的CNN完全不知道什麼叫貓頭、貓尾巴,也就是說,CNN不知道什麼是貓頭貓尾巴,它學習到的只是一種抽象特徵,甚至可能有些特徵在現實世界並沒有對應的名詞,但是這些特徵組合在一起計算機就會判定這是一隻貓!關於這一點,確實有些難以理解,比如一個人判斷貓是看看有沒有貓頭、貓身子、貓尾巴,但是另一個選取的特徵就是有沒有貓的毛,貓的爪子,還有的人更加奇怪,他會去通過這張影象裡是不是有老鼠去判斷,而我們的CNN,則是用它自己學習到的特徵去判斷。 —————————————————分割線————————————————————— 最近又看了一些資料,在此糾正和闡明一些問題。目前CNN的視覺化是一個很火的方向了,有些論文中已經提到了中間的卷積層特徵其實也是具有現實的語義意義的,但是隻是不那麼清晰。CNN稱之為深度學習,要義就在這個深字上,對於CNN而言,這個深其實就是意味著層層的特徵表示。比如淺層的特徵,例如點、線、面之類的簡單幾何形狀,都是在底層訓練出來的,對於這些底層的特徵繼續進行組合表示,就是後面的若干層的任務。最後把從低階特徵組合而來的高階特徵在進一步變成語義特徵,就可以使用全連線層進行分類了。也就是說,最後一次分類並不一定要用神經網路,如果已經拿到了足夠好的特徵資訊,使用其餘的分類器也未嘗不可。這就是為什麼CNN可以fine-tune的原因,例如你要完成一個分類貓和狗的任務,你需要從頭訓練一個CNN網路嗎?假設你的貓狗圖片樣本量並不是很大,這並不是一個好主意。好的辦法是,拿一個經過大型影象資料集,你如ImageNet,訓練過的大規模CNN(比如VGG NET)直接載入訓練,這個過程稱之為fine-tuning。因為這個CNN底層已經訓練到了豐富的細節資訊,你所需要訓練的其實是上層對這些特徵的組合資訊,以及最後全連線層的分類資訊,所以完全不需要從頭再來。這也證明了CNN確實可以有遷移學習的能力。 ——————————————————分割線———————————————————— 之前有一點沒有說,今天沒啥事補充一下,也算是做個記錄。CNN的部件其實大致分為三個,卷積層、池化層、全連線層,這也是LeNet-5的經典結構,之後大部分CNN網路其實都是在這三個基本部件上做各種組合和改進。卷積層之前已經介紹過了,全連線層就是連在最後的分類器,是一個普通的bp網路,實際上如果訓練得到的特徵足夠好,這裡也可以選擇其他的分類器,比如SVM等。那麼池化層是幹什麼的呢?池化,英文是pooling,字面上看挺難懂,但其實這可能是CNN裡最簡單的一步了。我們可以不按字面理解,把它理解成下采樣(subsampling)。池化分為最大值池化和平均值池化,和卷積差不多,也是取一小塊區域,比如一個55的方塊,如果是最大值池化,那就選這25個畫素點最大的那個輸出,如果是平均值池化,就把25個畫素點取平均輸出。這樣做有什麼好處呢?1、應該很明顯可以看出,影象經過了下采樣尺寸縮小了,按上面的例子,原來5