【盡可能用人話講清楚】卷積神經(jīng)網(wǎng)絡(luò)CNN的小筆記

閱讀須知
本文主要意義是為了方便對(duì)CNN有個(gè)最直觀的理解,知道這個(gè)玩意到底是干嘛的。文章本體是UP自己自學(xué)深度學(xué)習(xí)這塊的時(shí)候做的筆記,內(nèi)容均為網(wǎng)上收錄。發(fā)在這里的原因是因?yàn)?,也許有很多像UP一樣不理解了就完全學(xué)不了的人存在,為了這些人能粗略地了解一下CNN于是發(fā)了出來。網(wǎng)上很多教程可以說是非常嚴(yán)謹(jǐn)了,要公式有公式要出典有出典,但就是看不懂...所以本文會(huì)涉及到很多UP自己的理解,如果有一定的錯(cuò)誤還望指出。
以下正文
本文主要參考https://zhuanlan.zhihu.com/p/27908027
CNN的作用為特征提取器,用于提取給定數(shù)據(jù)內(nèi)的某個(gè)特征。
以識(shí)別圖片的方式理解CNN,比如,創(chuàng)建一個(gè)CNN識(shí)別一張圖片是X還是O的模型。我們最開始輸入了

作為輸入數(shù)據(jù),讓程序去學(xué)習(xí)X的特征。于是第二次再輸入該圖的時(shí)候,機(jī)器知道了,這個(gè)就是X。
但是第三次,我們輸入的不是這張圖,而是

機(jī)器此時(shí)就無法再識(shí)別出該圖到底是不是X了。因?yàn)闄C(jī)器只學(xué)過第一張圖,所以模型無法整理出通用特征。用機(jī)器學(xué)習(xí)的話來說就模型復(fù)雜度低,學(xué)習(xí)樣本不夠,這種時(shí)候被稱為欠擬合。(原文是欠擬合,但也有說過擬合的)
為了解決這個(gè)問題,只用第一張圖作為學(xué)習(xí)樣本很明顯是不太夠的。畢竟人類也不一定一次就總結(jié)出某個(gè)第一次見到的事物的特征。比如我到現(xiàn)在都沒搞清楚一些日語(yǔ)詞的用法,只能通過每次聽到這個(gè)詞在什么語(yǔ)境下使用,一點(diǎn)點(diǎn)自己總結(jié)這個(gè)詞到底是什么意思。機(jī)器需要做相同的事情。
這里提到一點(diǎn),對(duì)于數(shù)碼圖片,在人眼里是各種波長(zhǎng)的光組成的一張圖片,但是在機(jī)器層面,是下圖這樣的??

當(dāng)然,這只是一個(gè)例子,圖中-1代表黑色,1代表白色,用這種1與-1的行列來表述一張黑白圖片。
當(dāng)機(jī)器想用如上兩張圖來總結(jié)規(guī)律時(shí),他們是實(shí)際在做的事情是,找到這兩張圖里通用的特征。比如這兩張圖雖然對(duì)應(yīng)的行列結(jié)構(gòu)不一樣,但是存在一致的地方,比如

這些被框框框住的區(qū)域仍然是相同的,因此依然可以用來輔助機(jī)器識(shí)別圖片到底是不是X。
(小想法,從某種層面上來說,機(jī)器學(xué)習(xí)是賦予機(jī)器一種模糊判斷的能力。從一個(gè)到一類的轉(zhuǎn)變。)
但是上圖框框有一個(gè)是3x3,兩個(gè)是2x2,盡可能保持特征為同樣行列的矩陣的話會(huì)更好處理。于是,從上圖這倆例子來說,機(jī)器提煉出了如下的三種特征。從行列的角度來說如下

這種被提取出來的特征被稱為卷積核,一般是3x3或者5x5大小。
?
接下來說一說機(jī)器學(xué)習(xí)里一直說來說去的卷積到底是什么意思。
當(dāng)機(jī)器提取了如上的三種特征之后,他要做的下一步事情,是拿這三個(gè)特征行列,去和圖片里的每一處3x3乘一遍,
在這里三個(gè)特征行列我們先稱為特征行列1,特征行列2和特征行列3.


…

最終得到另一個(gè)3x3行列,

再將這個(gè)3x3行列的9個(gè)元素的平均值寫在最中間的位置。

這意味著,在藍(lán)框框中心的這個(gè)位置的3X3行列,每一個(gè)元素與特征行列1的特征值分別相乘之后,平均值為1.
這里只是當(dāng)藍(lán)框框在這個(gè)位置時(shí)候和特征行列1相乘的一個(gè)例子,我們?cè)谥耙舱f了,需要拿特征行列與該圖片中的每一處3x3都要乘一遍,于是我們要把藍(lán)框框再挪一挪。對(duì)了,這個(gè)藍(lán)框框稱為窗口。
藍(lán)框框最開始應(yīng)該在這個(gè)位置。

當(dāng)算完這個(gè)藍(lán)框框之后,會(huì)繼續(xù)向右移動(dòng)。如果我們?cè)O(shè)置步長(zhǎng)stride=1的話,則會(huì)變成

當(dāng)移動(dòng)到最右邊之后,我們得去第二行,于是向下移動(dòng)一個(gè)步長(zhǎng)stride=1,則會(huì)變成

當(dāng)我們用這種方式把整個(gè)圖上所有的地方都計(jì)算了一遍之后,這張圖變成了這樣

這張圖稱為特征圖feature map
注意哈,這張圖不再是最開始黑白圖的那個(gè)9x9行列了,而變成了7x7。這是很容易理解的,畢竟原本黑白那張圖的(1,1)元素為中心的藍(lán)框框是不存在的。
同樣的,這張圖只是對(duì)特征行列1進(jìn)行了計(jì)算,還有特征行列2和3,所以我們還要進(jìn)行兩次同樣的計(jì)算,并最終得到

這么三個(gè)特征行列。至此,特征圖計(jì)算完畢了。
?
接下來來介紹另外兩個(gè)概念。
當(dāng)我們獲得如上三張?zhí)卣鲌D之后,還是覺得數(shù)據(jù)量太大,計(jì)算機(jī)處理起來太麻煩。那能不能再簡(jiǎn)化一點(diǎn)的。
可以。
這里有一個(gè)新的方法,使用relu函數(shù)。這個(gè)函數(shù)的功能是保留行列中大于等于零的數(shù)字,且將小于零的數(shù)直接改寫為0。(因?yàn)樵谔卣鲌D里,數(shù)字越接近1則表示相關(guān)性越高,越接近-1則相關(guān)性越低,故為了方便計(jì)算,將小于0的略去)

最終將左圖完全改寫成如下形式

這一層叫做非線性激活層,relu函數(shù)是一種常用的非線性激活函數(shù)
現(xiàn)在我們這張圖上小于0的元素因?yàn)橄嚓P(guān)性太低都被清理掉了。數(shù)據(jù)一下少了很多。那能不能再降低一下數(shù)據(jù)量呢?
?
還是可以的。
比方說,我們依然可以用之前那種窗口的方式,然后選取窗口內(nèi)的最大值,填到一個(gè)新的行列里去

在紅框框區(qū)域中,最大值是1.00,于是便將這個(gè)1.00填入新行列的(1,1)位置。然后,窗口紅框框一般不會(huì)重復(fù)選擇數(shù)據(jù),因此下一個(gè)位置選這里

當(dāng)紅框框框在最右邊單獨(dú)的列時(shí),我們將被框住的空白視為0即可。

因此在這個(gè)位置輸出的最大值應(yīng)為0.33。當(dāng)對(duì)整張圖都進(jìn)行了一遍取最大值之后,這張圖變成了這樣。

這種處理方法,被稱為池化(pooling)
相應(yīng)的,這一層被稱為池化層,這種取最大值的方法叫做最大池化,還有一種取平均值的方法叫做平均池化。池化這種處理方式的特征為,一定程度保留數(shù)據(jù)特征的前提下,減少參數(shù)和計(jì)算量(數(shù)據(jù)的長(zhǎng)寬),通道數(shù)不變。

-----------------------------------------------------------------------------------------------------------------------
注意,接下來的部分為全連接層,這一部分我把網(wǎng)上快翻遍了都沒找到幾個(gè)好理解的。因此只能硬著頭皮理解了一番之后整理了一下自己的理解??赡苡绣e(cuò),注意甄別。
-----------------------------------------------------------------------------------------------------------------------
當(dāng)數(shù)據(jù)處理到這里時(shí),可以繼續(xù)重復(fù)之前的這幾種層再來一遍,

或者進(jìn)入另一種處理方式

把上一步得到池化之后的三個(gè)特征行列一維展開,就是按照從左往右從上往下的方式改寫成一列,這一列將作為全連接層的輸入層,然后把輸入層的所有元素都與隱層相連

而隱層,則是人為放了一個(gè)具有n個(gè)元素(或者說神經(jīng)元)的一列行列。里面的每個(gè)元素可以視作一個(gè)多項(xiàng)式,每個(gè)多項(xiàng)式都不同,這樣才可以更好地?cái)M合數(shù)據(jù)分布。[1](如果隱層神經(jīng)元都一樣的話,那輸入層的數(shù)字輸入哪個(gè)神經(jīng)元都沒區(qū)別)隱層未必只有一層,可以有很多層,但是太多太少都不好。這塊要依靠經(jīng)驗(yàn)來。
至于輸出層,需要分成幾類,就設(shè)置輸出層有幾個(gè)神經(jīng)元就行。比如說分類X或者O,就是兩類,所以就放兩個(gè)神經(jīng)元。
所以整個(gè)流程就是,輸入層的每個(gè)數(shù)字都分別與隱層的每個(gè)神經(jīng)元算一算,得到各自的結(jié)果,然后把這個(gè)結(jié)果稍加處理之后分別再次發(fā)到輸出層的兩個(gè)神經(jīng)元上,最終輸出層的兩個(gè)神經(jīng)元各自會(huì)得到一個(gè)數(shù)字,把這兩個(gè)數(shù)字用softmax函數(shù)處理了之后,最終會(huì)分別獲得兩種分類的概率。比方說40%概率是X,60%概率是O這樣。(softmax函數(shù)的作用是使預(yù)測(cè)結(jié)果值為大于等于0的基礎(chǔ)上,再使預(yù)測(cè)結(jié)果概率之和為1[2])
輸入層是輸入數(shù)據(jù)的特征,隱藏層是特征是否滿足某n個(gè)條件(可視為),輸出層則是與該結(jié)果的符合程度。
至此,CNN就先告一段落。
[1] https://zhuanlan.zhihu.com/p/33841176
[2]https://blog.csdn.net/lz_peter/article/details/84574716