天天看點

卷積神經網絡CNN完全指南

1】導論

先來說一寫題外話...

研究所學生入學後就被導師逼着學習神經網絡,一開始非常盲目,先是在網上搜了一大堆的資料,各種什麼“一文讀懂卷積神經紋網絡”,“叫你三分鐘搭建屬于自己的神經網絡架構”,“五分鐘速讀神經網絡全解”,之類的文章層出不窮。看了太多導緻的結果是,學了很久都沒能真正意義上地入門。

而後自己艱辛摸索才慢慢了解了卷積神經網絡的真谛。(好官方啊哈哈哈哈哈哈)

首先最需要明确的一點就是,卷積神經網絡,也就是convolutional neural networks (簡稱CNN),現在已經被用來應用于各個領域,物體分割啦,風格轉換啦,自動上色啦blahblah,但是!!CNN真正能做的,隻是起到一個特征提取器的作用!是以這些應用,都是建立在CNN對圖像進行特征提取的基礎上進行的。

這篇文章呢,我不打算和傳統介紹CNN的文章一樣先介紹生物神經元、突觸什麼的,就直接從最簡單的執行個體講起。

廢話不多說,開始。

拿到一張圖檔,要對它進行識别,最簡單的栗子是,這張圖是什麼?

比如,我現在要訓練一個最簡單的CNN,用來識别一張圖檔裡的字母是X還是O。

卷積神經網絡CNN完全指南

我們人眼一看,很簡單嘛,明顯就是X啊,但是計算機不知道,它不明白什麼是X。是以我們給這張圖檔加一個标簽,也就是俗稱的Label,Label=X,就告訴了計算機這張圖代表的是X。它就記住了X的長相。

但是并不是所有的X都長這樣呀。比如說...

卷積神經網絡CNN完全指南

這四個都是X,但它們和之前那張X明顯不一樣,計算機沒見過它們,又都不認識了。

(這裡可以扯出機器學習中聽起來很高冷的名詞 “ 欠拟合 ”)

不認識了怎麼辦,當然是回憶看看是不是見過差不多的呀。這時候CNN要做的,就是如何提取内容為X的圖檔的特征。

我們都知道,圖檔在計算機内部以像素值的方式被存儲,也就是說兩張X在計算機看來,其實是這樣子的。

卷積神經網絡CNN完全指南
卷積神經網絡CNN完全指南

其中1代表白色,-1代表黑色。

如果按照每像素逐個比較肯定是不科學的,結果不對而且效率低下,是以提出其他比對方法。

我們稱之為patch比對。

觀察這兩張X圖,可以發現盡管像素值無法一一對應,但也存在着某些共同點。

卷積神經網絡CNN完全指南

如上圖所示,兩張圖中三個同色區域的結構完全一緻!

是以,我們就考慮,要将這兩張圖聯系起來,無法進行全體像素對應,但是否能進行局部地比對?

答案當然是肯定的。

相當于如果我要在一張照片中進行人臉定位,但是CNN不知道什麼是人臉,我就告訴它:人臉上有三個特征,眼睛鼻子嘴巴是什麼樣,再告訴它這三個長啥樣,隻要CNN去搜尋整張圖,找到了這三個特征在的地方就定位到了人臉。

同理,從标準的X圖中我們提取出三個特征(feature)

卷積神經網絡CNN完全指南
卷積神經網絡CNN完全指南
卷積神經網絡CNN完全指南
卷積神經網絡CNN完全指南

我們發現隻要用這三個feature便可定位到X的某個局部。

卷積神經網絡CNN完全指南

feature在CNN中也被成為卷積核(filter),一般是3X3,或者5X5的大小。

【2】卷積運算

說了那麼久終于扯到了卷積二字!

但是!!胖友們!卷積神經網絡和信号處理裡面那個卷積運算!毛關系都沒有啊!當初我還特意去複習了一下高數裡的卷積運算!摔!

卷積神經網絡CNN完全指南
卷積神經網絡CNN完全指南

這些!!都和我們的CNN沒有關系!!!

(二稿修改:經知友提醒,此處的确說得不對,卷積神經網絡在本質和原理上還是和卷積運算有一定的聯系的,隻是之前本人才疏學淺未能看出它們二者實質相關聯的地方,若有誤導之處還請各位諒解,抱歉!)

好了,下面繼續講怎麼計算。四個字:對應相乘。

看下圖。

取 feature裡的(1,1)元素值,再取圖像上藍色框内的(1,1)元素值,二者相乘等于1。把這個結果1填入新的圖中。

卷積神經網絡CNN完全指南
卷積神經網絡CNN完全指南

同理再繼續計算其他8個坐标處的值

卷積神經網絡CNN完全指南

9個都計算完了就會變成這樣。

卷積神經網絡CNN完全指南

接下來的工作是對右圖九個值求平均,得到一個均值,将均值填入一張新的圖中。

這張新的圖我們稱之為 feature map (特征圖)

卷積神經網絡CNN完全指南

可能有小盆友要舉手問了,為什麼藍色框要放在圖中這個位置呢?

這隻是個栗子嘛。 這個藍色框我們稱之為 “視窗”,視窗的特性呢,就是要會滑動。

其實最開始,它應該在起始位置。

卷積神經網絡CNN完全指南

進行卷積對應相乘運算并求得均值後,滑動窗便開始向右邊滑動。根據步長的不同選擇滑動幅度。

比如,若 步長 stride=1,就往右平移一個像素。

卷積神經網絡CNN完全指南

若 步長 stride=2,就往右平移兩個像素。

卷積神經網絡CNN完全指南

就這麼移動到最右邊後,傳回左邊,開始第二排。同樣,若步長stride=1,向下平移一個像素;stride=2則向下平移2個像素。

卷積神經網絡CNN完全指南

好了,經過一系列卷積對應相乘,求均值運算後,我們終于把一張完整的feature map填滿了。

卷積神經網絡CNN完全指南

feature map是每一個feature從原始圖像中提取出來的“特征”。其中的值,越接近為1表示對應位置和feature的比對越完整,越是接近-1,表示對應位置和feature的反面比對越完整,而值接近0的表示對應位置沒有任何比對或者說沒有什麼關聯。

一個feature作用于圖檔産生一張feature map,對這張X圖來說,我們用的是3個feature,是以最終産生3個 feature map。

卷積神經網絡CNN完全指南

至此,卷積運算的部分就講完啦!~

【3】非線性激活層

卷積層對原圖運算多個卷積産生一組線性激活響應,而非線性激活層是對之前的結果進行一個非線性的激活響應。

這是一個很官方的說法,不知道大家看到上面這句話是不是都覺得要看暈了。

嗯~ o(* ̄▽ ̄*)o 其實真的沒有那麼複雜啦!

本系列的文章秉承着“說人話!”的原則,着力于用最簡單通俗的語言來為大家解釋書上那些看不懂的概念。

在神經網絡中用到最多的非線性激活函數是Relu函數,它的公式定義如下:

f(x)=max(0,x)

即,保留大于等于0的值,其餘所有小于0的數值直接改寫為0。

為什麼要這麼做呢?上面說到,卷積後産生的特征圖中的值,越靠近1表示與該特征越關聯,越靠近-1表示越不關聯,而我們進行特征提取時,為了使得資料更少,操作更友善,就直接舍棄掉那些不相關聯的資料。

如下圖所示:>=0的值不變

卷積神經網絡CNN完全指南

而<0的值一律改寫為0

卷積神經網絡CNN完全指南

得到非線性激活函數作用後 的結果:

卷積神經網絡CNN完全指南

【4】pooling池化層

卷積操作後,我們得到了一張張有着不同值得feature map,盡管資料量比原圖少了很多,但還是過于龐大(比較深度學習動不動就幾十萬張訓練圖檔),是以接下來的池化操作就可以發揮作用了,它最大的目标就是減少資料量。

池化分為兩種,Max Pooling 最大池化、Average Pooling平均池化。顧名思義,最大池化就是取最大值,平均池化就是取平均值。

拿最大池化舉例:選擇池化尺寸為2x2,因為標明一個2x2的視窗,在其内選出最大值更新進新的feature map。

卷積神經網絡CNN完全指南

同樣向右依據步長滑動視窗。

卷積神經網絡CNN完全指南
卷積神經網絡CNN完全指南

最終得到池化後的feature map。可明顯發現資料量減少了很多。

因為最大池化保留了每一個小塊内的最大值,是以它相當于保留了這一塊最佳比對結果(因為值越接近1表示比對越好)。這也就意味着它不會具體關注視窗内到底是哪一個地方比對了,而隻關注是不是有某個地方比對上了。這也就能夠看出,CNN能夠發現圖像中是否具有某種特征,而不用在意到底在哪裡具有這種特征。這也就能夠幫助解決之前提到的計算機逐一像素比對的死闆做法。

到這裡就介紹了CNN的基本配置---卷積層、Relu層、池化層。

在常見的幾種CNN中,這三層都是可以堆疊使用的,将前一層的輸入作為後一層的輸出。比如:

卷積神經網絡CNN完全指南

也可以自行添加更多的層以實作更為複雜的神經網絡。

而最後的全連接配接層、神經網絡的訓練與優化,更多内容将在下一篇文章中繼續。

#今日頭條小助手##深度學習#

繼續閱讀