【轉載】深度學習、圖像分類入門,從VGG16卷積神經網絡開始

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

本文思路:

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

1、卷積過程:

我們經常說卷積神經網絡卷積神經網絡,到底什么才是卷積?網絡層卷積過程到底怎么實現?我們在這里借鑒了另一位博客大牛的動態圖來給大家演示一下,

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

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

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

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

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

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

2、兩層之間的池化:

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

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

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

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

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

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

4、卷積核:

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

5、Padding:

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

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

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

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

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

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

二、等待已久的VGG16:

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

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

看懂一些式子表達:

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

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

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

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

【1、從INPUT到Conv1:】

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

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

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

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

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

于是我們的到了想要的東西;最后的綠色框;

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

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

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

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

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

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

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

【4、進入Conv3的推演:】

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

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

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

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

【6、后續的步驟】

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

【7、Faster Rcnn的例子】

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


原文鏈接:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容