1. 程式人生 > >乾貨丨深度學習、影象分類入門,從VGG16卷積神經網路開始

乾貨丨深度學習、影象分類入門,從VGG16卷積神經網路開始

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

剛開始接觸深度學習、卷積神經網路的時候非常懵逼,不知道從何入手,我覺得應該有一個進階的過程,也就是說,理應有一些基本概念作為奠基石,讓你有底氣去完全理解一個龐大的卷積神經網路:

本文思路:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

一、我認為學習卷積神經網路必須知道的幾個概念:

1、卷積過程:

  我們經常說卷積神經網路卷積神經網路,到底什麼才是卷積?網路層卷積過程到底怎麼實現?我們在這裡借鑑了另一位部落格大牛的動態圖來給大家演示一下,

  圖作者文章在此:http://blog.csdn.net/silence1214/article/details/11809947

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

我們可以看到,卷積過程其實還是基於一個固定的矩陣,在另外一個矩陣不斷一格一格掃過去的到的數值的和,(注意:這裡的一格一格非常重要,因為涉及後面的概念:步長→我們不妨想一想當固定矩陣不是一格一格前進的時候,會發生什麼呢?)產生的一個新的矩陣,我們以作為比較會發現:粉紅色矩陣和綠色矩陣在根本上有很大不一樣,

第一,卷積之後的維數降低了;第二,我們要想想為什麼降維了?(思考:降低維度到底有沒有規律?)

  答案是有的:我們發現橙色的固定框為3*3,綠色是5*5,出來是三乘三;

  所以規律可以得到:粉紅色最後的卷積結果矩陣維度=綠色矩陣維數-橙色矩陣維數+1

(我們又應該思考:如果我不想最後減少維度,我只希望卷積,怎麼辦呢?)

2、兩層之間的池化:

  我們依然延用部落格大牛的另一個動圖(再次點贊做的精細準確!)

640?wx_fmt=gif

我們可以發現其實跟之前沒什麼不一樣:還是以三個矩陣之間的運算,但是我們很容易發現,它並不是一行一行掃過去的,橙色矩陣維度是黃色矩陣的整數倍,所以池化的最終的結論是要把原來的維度減少到1/n.這是池化最根本的原理(當然也有特殊情況。)

(思考點:我們想象一下如果一個19*19的矩陣做池化,會是一種什麼樣的體驗呢?我們不可以縮小整數倍!!答案會在後面的VGG16裡面講清楚,不急不急640?wx_fmt=gif640?wx_fmt=gif640?wx_fmt=gif

3、第三個知識點是步長的概念:

  卷積核(後面講到VGG16會介紹)移動的步長(stride)小於卷積核的邊長(一般為正方行)時,變會出現卷積核與原始輸入矩陣作用範圍在區域上的重疊(overlap),卷積核移動的步長(stride)與卷積核的邊長相一致時,不會出現重疊現象。

  通俗一點其實就是:剛剛說的那個粉紅色矩陣,他每一次移動多少格,格子就是步長!!

4、卷積核:

  一個聽起來很高大上的詞語,我們依然用之前的基礎來解釋:通俗易懂:就是粉紅色矩陣的個數!!因為有時候我們要提取的特徵非常多非常廣泛,所以需要我們用更多的矩陣來掃(多掃幾遍),那麼粉紅色矩陣的個數就是卷積核個數。

5、Padding:

  這個應該是最抽象的概念了:但是也不會特別難呢,就是我們在之前講到第一點:卷積的時候,我拋下了一個問題:

 (我們又應該思考:如果我不想最後減少維度,我只希望卷積,怎麼辦呢?)(現在知道括號的重要性了吧哈哈?640?wx_fmt=gif640?wx_fmt=gif640?wx_fmt=gif

  現在我們來解決這個問題:比如:我們需要做一個300*300的原始矩陣,用一個3*3卷積核(粉紅色矩陣)來掃,掃出來,按照之前公式,結果的矩陣應該是:298*298的矩陣,但是這樣很難計算,減得也不多,反而增加我計算難度,還不如池化(pooling)來得乾脆是吧!那我們就在300*300矩陣外面周圍加一圈“0”,記住,是在外面外包一層“0”

重點是:這樣的300*300就變成了302*302的矩陣,這樣就可以完全避開卷積後那兩層的抵消。

6、還有一個就是通道的概念:這個不算知識點,僅僅是一個常識詞語,比如一張圖片,有RGB三種顏色,對應三個灰度級別,也就是三個通道了:

更加抽象的圖可以參照下面的結構:

640?wx_fmt=gif

二、等待已久的VGG16:

VGG16分為16層,我們主要講前面的前幾層(越詳細越好吧,後面是一樣的)

——首先教會大家一個看其他神經網路也是用的辦法:官方資料表格:

640?wx_fmt=png

看懂一些式子表達:

Conv3-512   →    第三層卷積後維度變成512;

Conv3_2 s=2     →     第三層卷積層裡面的第二子層,滑動步長等於2(每次移動兩個格子)

好了,我們有了以上的知識可以考試剖析VGG16卷積神經網路了

三、利用之前的基本概念來解釋深層的VGG16卷及網路;

【1、從INPUT到Conv1:】

640?wx_fmt=png

首先兩個黃色的是卷積層,是VGG16網路結構十六層當中的第一層(Conv1_1)和第二層(Conv1_2),他們合稱為Conv1。

我們主要講述第一個,也就是第一層(Conv1_1),它怎麼把一個300*300*3的矩陣變成一個300*300*64的矩陣?

640?wx_fmt=png

我們假設藍色框是一個RGB影象,橙色是一個3*3*3的卷積核,我們對一個三維的27個數求和,然後掃過去,按照第一部分算的得出來的是一維的298*298的矩陣(因為卷積核也是三維所以結果是一維);

然後回想一下什麼是Padding、前面也講過它的概念了;所以不了一圈的圓,回到了300*300*1;

然後,VGG16這一層安置有64個卷積核,那麼,原來的300*300*1變成300*300*64

於是我們的到了想要的東西;最後的綠色框;

【1、從Conv1到Conv2之間的過度:】

640?wx_fmt=png

這一步用的Pooling是:2*2*64 s=2;

也就是說,步長是二,滑動的矩陣本身沒有重疊;剛好減半,第三維度64不變;

【3、順利來到Conv2並且結構完全一樣進入Conv3:】

我們知道原來INPUT是300*300*3過了第一層出來時150*150*64

那麼第二層仍然有池化有128個卷積核,聯想推理:

出來的應該是75*75*128;這一步沒有問題,我們繼續往下分析:

【4、進入Conv3的推演:】

640?wx_fmt=jpeg

可以知道第三層有256個卷積核,包含三層小的卷基層:

【5、從Conv3到Conv4之間的過度:】

640?wx_fmt=png

池化沒有問題,但是這裡75不是一個偶數怎麼弄,還記得我們第一部分前面的括號嗎?

就是這樣,我們在75這裡相加了一個一,使之成為76,變成一個偶數,還有一種方法是通過步長的設定這裡先不展開來講了;

【6、後續的步驟】

  後面的方法很簡單,根據我給的那個VGG16的表格查詢每一層裡面有什麼卷積核?多少個?池化的大小?步長多少?是否需要Padding?解決這些問題,你的VGG16就已經完全可以從頭到尾說清楚了!!!

【7、Faster Rcnn的例子】

http://blog.csdn.net/errors_in_life/article/details/70916583

____________後續我將介紹一些基於VGG16深度學習的影象分類知識,一個愛分享自己錯誤和經驗的師兄640?wx_fmt=gif640?wx_fmt=gif640?wx_fmt=gif,多多指教!

640?wx_fmt=jpeg