卷積神經網絡-吳恩達深度學習課程第四課


 

時間:2021/02/16

 

一.卷積神經網絡

1.1 計算機視覺

卷積神經網絡一般應用於計算機視覺領域,由於有的時候圖片的像素點很多,導致神經網絡輸入特征值的維數很多。

 

1.2 邊緣檢測示例

如下圖所示,原圖是一個6*6*1的矩陣,卷積核是一個3*3*1的矩陣,經過卷積后得到一個4*4*1的矩陣。

 

下圖展示了垂直邊緣檢測的原理:

 

1.3 更多邊緣檢測例子

垂直邊緣檢測不僅可以檢測垂直方向的邊緣,還可以區分該邊是從亮到暗(正邊)還是從暗到亮(負邊)。

 

除了之前卷積核中數字組合外還有很多,在做邊緣檢測的過程中最好將卷積核中的數字作為參數進行學習,這樣得到的神經網絡效果最好。

 

1.4 Padding

對於之前介紹的卷積方式,其存在兩個缺陷:一是當一個6*6的圖像經過3*3的卷積核卷積后會變成一個4*4的圖像,這使圖像經過卷積后變小了;二是原矩陣邊緣處只被運算一次,而中心處會被運算多次,導致邊緣處大部分信息被丟失了。

下圖是兩種卷積方式:Valid卷積是令padding為0;Same卷積是通過添加padding使卷積前和卷積后圖像的大小相同。

引入padding后維數的公式為n+2p-f+1。

 

1.5 卷積步長

當步長為2時,每進行一次運算后都要向左或者下移動兩個像素點,如下圖。

 

下圖是有步長的情況下維數的計算公式:

 

 

1.6 三維卷積

對三維圖像進行卷積時,卷積核的通道數要與三維圖像的通道數相等。當我們想對圖像的多個邊緣特征進行檢測時,我們可以使用多個卷積核,這樣卷積后生成圖像的通道數為使用的卷積核的個數。

對於三維卷積具體運算的實例如下:如果使用的是下圖3*3*3的卷積核,則一共有27個參數,進行卷積運算時讓數值與相應的參數相乘后求和,這就是最后4*4*1矩陣中的一個值。

 

1.7 單層卷積網絡

通過下圖來說明卷積層所做的操作,但我們有一個6*6*3的圖片輸入時,我們想要提取圖片的兩個特征值,所以我們用了兩個3*3*3的卷積核,從而生成了4*4*2的兩個矩陣,然后對矩陣增添一個偏置量b,這樣就相當於完成了完成了全連接神經網絡的線性運算z=w*a+b。之后對得到的矩陣運用激活函數就可以完成該卷積層的運算。

 

下圖是對各個變量以及參數的維數的總結

 

1.8 簡單卷積網絡示例

下圖展示了使用一個卷積神經網絡實現圖片分類,在最后我們要將得到的矩陣展開成一個向量,然后輸入到輸出層的sigmoid函數或者softmax函數。對於卷積神經網絡來說,通常圖片會變小,通道數會增加。

 

 

1.9 池化層

下圖是最大池化,在每個作用區域內選擇值最大的一個放在輸出的方格上。當輸入有多層時,對每一層都采用相同的操作,這樣輸入和輸出的層數是相同的。最大池化的功能就是只要在任何一個象限內提取到某個特征,它都會保留在最大池化的輸出里。最大池化運算的實際作用就是,如果在過濾器中提取到某個特征,那么保留其最大值,如果沒有提取的這個特征,那么其最大值也是很小的。

 

 

下圖是平均池化,平均池化沒有最大池化應用的廣泛。

 

需要注意的是,池化過程中的參數都是靜態的,不需要進行學習。並且,卷積過程中計算維數的公式也可以應用在池化過程中。池化層的主要作用是特征降維,提高模型的魯棒性。

 

 

1.10 卷積神經網絡示例

一個卷積神經網絡通常包含卷積層、池化層和全連接層,一般將卷積層和池化層作為一層。下圖就是一個卷積神經網絡的示例:

 

1.11 為什么使用卷積

與只使用全連接層相比,卷積層有兩個優勢:參數共享和稀疏連接。這樣可以有效減少參數的數量。

 

二.實例探究

2.1 為什么要進行實例探究

下圖是后面幾節課的提綱:

 

 

2.2 經典網絡

下圖是LeNet-5神經網絡的結構:

 

下圖是AlexNet神經網絡的結構:

 

下圖是VGG-16神經網絡的結構:每經過一次卷積和池化后圖像大小減半,通道數加倍。

 

2.3 殘差網絡

下圖是一個殘差塊,輸入a[l]會傳送到l+2層的線性部分之后,這樣它會直接參加非線性部分的計算。

 

下圖是一個殘差神經網絡的示例:對於一般的神經網絡,當網絡層數變多時,訓練錯誤會先減少后增加,但是對於ResNet不會出現這種情況。

 

2.4 殘差網絡為什么有用?

殘差網絡起作用的主要原因就是這些殘差塊學習恆等函數非常容易,能夠保證網絡的性能不會收到影響,很多時候甚至可以提高效率,或者說至少不會降低網絡效率,因此創建類似殘差網絡可以提升網絡性能。一般卷積神經網絡的結構都是幾個卷積層后面跟一個池化層,在網絡的最后還有一個或多個全連接層。

 

 

2.5 網絡中的網絡以及1*1卷積

下圖中用對一個1*1*32的卷積對6*6*32的圖像進行卷積操作,相當於對6*6個單元分別進行添加了一個全連接層。

 

正如下圖所示,1*1卷積層可以減少或者增加圖像的通道數,之前學習的池化層會減少圖像的高度和寬度,但不會改變圖像的通道數。

 

 

2.6 谷歌Inception網絡簡介

Inception模塊的作用:代替人工確定卷積層中的卷積核大小或者確定是否需要創建卷積層和池化層。即不需要人為的決定使用哪個過濾器,是否需要池化層等,由網絡自行決定這些參數,可以給網絡添加所有可能值,將輸出連接起來,網絡自己學習它需要什么樣的參數。因此可以使計算量大大減少,收斂更快。

由於使用Inception模塊的計算量還是比較多的,上圖中的網絡是1.2億次,所以可以在中間添加瓶頸層來減少運算量。下圖的運算量為1240萬次,約為上面運算量的十分之一。

 

2.7 Inception網絡

下圖就是一個Inception模塊,一個Inception模塊可能由很多不同的卷積核甚至池化層構成,它們都要采用same卷積方式,這樣最后的輸出才可以拼接在一起,為了避免池化層的通道數過多,在池化層后面還加上了一個1*1的卷積核來減少通道數。

下圖是一個Inception神經網絡,我們可以看到在下面的網絡中有很多分支,這些分支的作用就是通過隱藏層來做出預測。它確保了即便是隱藏單元和中間層也參與了特征計算,它們也能預測圖片的分類,它在Inception網絡中起到了一種調整的效果,並且能夠防止網絡發生過擬合。

 

2.8 使用開源的實現方案

開發一個計算機視覺應用的常用工作流程:先選擇一個你喜歡的架構,接着尋找一個開源實現,從GitHub下載下來,以此為基礎開始構建。

 

2.9 遷移學習

如果我們可以要做一個下圖這樣的三分類神經網絡,,我們可以使用開源的神經網絡結構和初始權重,然后將網絡的最后一層改為三分類的softmax層。在我們數據量比較少的情況下,我們可以選擇將softmax層之前的層冰凍起來,即參數不變,這樣只需要訓練softmax層的參數。由於前面幾層都冰凍起來了,即為靜態參數,不需要訓練,我們可以將softmax的輸入數據計算出來,然后存入硬盤中,該數據是靜態的,不會改變,所以只需要計算一次。這就可以使該深層網絡簡化為一個淺層網絡。

如果我們擁有的數據更多,則網絡需要冰凍的層數越少,但我們最好使用參考網絡的權重作為初始權重,這樣可以提高訓練速度。

 

2.10 數據擴充

數據擴充(數據增強)可以彌補計算機視覺領域數據不足的問題。具體的數據擴充的方法如下:

鏡像對稱和隨即裁剪

 

色彩轉換

 

2.11 計算機視覺現狀

在神經網絡中主要依靠兩部分,第一部分是被標記的數據,第二部分使是手工工程。當數據量較少時,需要的手工工程比較多,需要對神經網絡進行精心的設計。

 

三.目標檢測

3.1 目標定位

對於分類定位問題,通常只有一個較大的物體在圖片的中央,我們需要識別該物體的類別並標記物體的位置。而對象檢測問題在一張圖片中可能會有多個不同類別的對象,我們需要識別各個物體的類別並標記位置。具體如下圖:

 

對於目標定位問題,我們通常要輸出該物體的類別以及物體中心點的坐標和寬高。

 

該目標定位神經網絡要輸出8個值,分別是圖中是否有目標對象(pc)、目標對象的坐標(bx、by)、目標對象的寬和高(bh、bw)和三種類別物體的可能性(c1、c2、c3)。當pc=1時,下面7個值是有效的;當pc=0時,下面7個值是無效的。所以這也就對應着兩種代價函數的計算公式,這里代價函數使用的是平方差。

 

 

3.2 特征點檢測

如果我們想要做人臉識別或者人體姿態檢測,我們可以人為設置一些特征點,在訓練集上標記處特征點的位置用來訓練,這樣在輸出時就可以輸出標記點的位置,要注意訓練集上標記點要前后一致。

 

 

3.3 目標檢測

這里介紹的是基於滑動窗口的目標檢測方法。訓練集是類似於圖像分類的,標記圖片中是否有汽車。

具體檢測時是選定一個檢測窗口大小以及步長,然后從圖片的左上角開始依次將檢測窗口中的圖像輸入到網絡中。這種檢測方法存在問題:當選擇的步長過大時,檢測效果可能不是很好,但當步長過小時,需要的運算量會很大。 

 

3.4 卷積的滑動窗口實現

要實現的卷積的滑動窗口,我們首先要將之前神經網絡中的全連接層轉化為卷積層。具體如下圖,通過設置相應的卷積核就可以實現這樣的操作:

 

如果我們在選擇的檢測窗口大小是14*14*3,那我們訓練集中的圖片大小與檢測窗口的大小相同。按照上一節的方法,假如我們輸入的圖片大小是16*16*3,選擇的步長為2,則我們先從圖片的左上角開始選擇一個檢測窗口,然后輸入到網絡中輸出分類結果,然后右移兩個單元,在重復上面的方法,然后再移動,這樣的操作要重復4次。但這種方法會有很多重復的運算。所以我們采用卷積層代替全連接層,不再按檢測窗口輸入圖片,而是將整個圖片一起輸入到網絡中,這樣重復的部分會共享結果,不會重復運算。就如下圖中的第二個網絡最后輸出的是一個2*2*4的矩陣,每一個1*1*4的矩陣相當於之前網絡的一個輸出。

 

 

3.5 Bounding Box預測

下圖展示了滑動窗口在目標檢測方面的問題,即不能准確識別目標的邊界。

YOLO算法可以很好的解決圖像邊界的問題。這里我們將圖片分成9個部分,當然分的越細檢測的越精准,我們按對象中心點所在的方塊決定對象所屬的方塊。對於每一個方塊,我們都要輸出8個值,分別是是否有物體、物體的坐標、物體的寬高和屬於各個種類的概率。我們並不是將方塊一個一個輸入,而是對整個圖像整體進行輸入,這樣會加快計算速度。

 

3.6 交並比

交並比函數用來評價對象檢測算法表現是否良好。在下圖中,紅框是對象的實際邊界,紫框是對象檢測算法檢測出來的邊界,交並比函數的計算方法就是用兩個邊界交集的大小除以兩個邊界並集的大小。一般當交並比(IOU)>0.5時可以接受,如果交並比=1,則兩個邊界完美重合。

 

3.7 非極大值抑制

如下圖,由於我們會先將圖片划分稱很多小網格,所以可能出現一個對象在很多網格中的情況,這樣一個對象就會被檢測多次,因為有多個網格會認為該對象在自己的區域內,同時輸出多個對象邊界,但在下圖中實際上只有兩個對象,所以我們的目標是輸出兩個對象邊界。這里采用的方法就是非極大值抑制。

 

下圖我們做的是汽車檢測,只有汽車和非汽車兩種可能,所以不需要c1、c2、c3。具體方法:先將pc值小於0.6的邊框去除,然后選取剩余邊框中pc值最大的邊框輸出,將與該邊框交並比小於0.5的邊框去除。然后循環選取剩余邊框中pc值最大的,重復上述操作。如果是多目標檢測,則最好對每一個目標獨立進行上述過程。

 

3.8 Anchor Box

之前算法存在一個問題:一個格子只能檢測一個對象。所以這里我們引入了anchor box,我們可以根據要檢測對象的形狀認為設定anchor box的形狀,anchor box可以有多個。如下圖,行人和汽車的中心點位於一個方格中,這是就要根據汽車和行人的形狀設定兩個anchor box,此時神經網絡的輸出不再是8維的,而是16維,其中上面8維是anchor box1的,下面8維是anchor box2的。至於如何判定對象輸入anchor box1還是anchor box2,通過檢測出目標的形狀於anchor box的形狀取交並比來判定。

 

 anchor box可以使網絡更具有針對性。但是也存在一些問題:

1.如果你設定了兩個anchor box,但是一個網格中有三個對象,anchor box將無法很好的解決。

2.如果兩個相同的對象在同一個anchor box中,anchor box也無法很好的解決。

 

3.9 YOLO算法

如果我們要做一個識別三個對象的目標檢測網絡,分別是行人、汽車和摩托車。我們將輸入圖像划分稱3*3的網格。然后遍歷每個網格進行目標檢測。這里我們設定兩個anchor box,所以網絡最后會輸出一個3*3*2*8的矩陣。

由於我們選擇的是兩個anchor box,所以每個網格都會有兩個邊框,注意:這里的邊框並不一定要在一個網格內,也可以超出。然后若邊框的pc值小於設定的閾值則刪除,然后再根據非極大值抑制算法進行篩選,最后輸出結果。

 

 

3.10 候選區域

R-CNN算法,也被稱為帶區域的CNN算法。它將目標檢測分為兩個過程,首先根據圖像分割選出候選區域,然后對候選區域進行分類。

下面使R-CNN的改進版:

 

四.特殊應用:人臉識別和神經風格轉換

4.1 什么是人臉識別

吳恩達老師在視頻開頭展示了百度開發的人臉識別系統,該系統用到了人臉識別和活體檢測技術。

下面解釋一下人臉驗證和人臉識別:

人臉驗證做的是1:1的對比,可以簡單理解為證明你就是你。就是我們先告訴人臉識別系統,我是張三,然后用來驗證站在機器面前的“我”到底是不是張三。

人臉識別做的是1:N的對比,即系統采集了“我”的一張照片之后,從海量的人像數據庫中找到與當前使用者人臉數據相符合的圖像,並進行匹配,找出來“我是誰”。

 

4.2 One-Shot學習 

對於人臉識別來說,最難的是要解決一次學習的問題,即僅僅通過一張照片或一個人臉樣例就能去識別這個人。

如果我們想要用softmax網絡做識別4個人的人臉識別系統,那softmax的輸出值可能有5個,但是這樣的系統存在問題,如果我們要再加入一個人,那我們需要讓softmax單元有6個輸出,此時需要重新訓練網絡。

所以使用softmax網絡做人臉識別系統是不可行的,下圖提供了一種新的方法,即學習一個d函數(similarity function)。該函數是一個差異度函數,函數的輸入是兩張圖片,該函數可以計算出兩個圖片的差異度,當差異度小於等於給定的閾值時,我們認為兩張圖片是同一個人,大於時為不同的人。但我們訓練好d函數之后,我們令要檢測圖片為函數輸入img1,然后遍歷人臉數據庫中的圖片作為函數輸入img2,然后分別輸出差異度的值,根據差異度的值和閾值來進行人臉識別。

 

4.3 Siamese網絡

我們定義一個網絡,假設經過卷積層、池化層和全連接層后會輸出一個128維的特征值f(x1),則該特征值就是輸入圖像x1的特征值,然后我們再將另一張圖片x2輸入進相同參數的網絡,也輸出一個128維的特征值f(x2),假如輸出的特征值可以很好的表示輸入圖片,我們可以定義d函數為f(x1)和f(x2)之間的歐氏距離。當兩張圖片為同一個人時,d函數的輸出值很小,當兩張圖片不為同一個人時,d函數的輸出值很大。

所以我們該如何訓練這個神經網絡呢?Siamese網絡學習的是編碼函數f(x),即輸出的是圖片的特征向量。在訓練的時候,我們定義的代價函數是兩張圖片特征向量的歐氏距離,我們訓練的目的是使相同圖片的代價函數小,不同圖片的代價函數大,以此為依據進行反向傳播。

 

4.4 Triplet損失

要使用三元組損失函數,我們需要將三張圖片作為一組,其中第一張圖片為anchor,第二張圖片是positive,表示和第一張圖片為同一個人,第三張圖片為negative,表示和第一張圖片不為同一張函數。我們的目的是使d(A,P)-d(A,N)+α<=0,這里的α為一個超參數。

 

 

損失函數的定義如下:

 

 

但是這個網絡也存在一些問題,就是我們在訓練網絡時最好使三元組中d(A,P)與d(A,N)接近,這樣會使網絡訓練起來更有效率,因為如果d(A,P)與d(A,N)本身就相差很大的話,網絡訓練起來太輕松了,也不會有很好的效果。

 

4.5 面部驗證與二分類

除了上節課中介紹的使用三元組的方法進行人臉識別,也可以將人臉識別作為一個二分類問題,輸出為1時表示是同一個人,輸出為0時表示不是同一個人。這里采用一對完全相同的神經網絡,輸入一對圖像,分別計算輸入圖像的特征向量,然后將兩個特征向量輸入到sigmoid單元中進行計算,具體計算公式見下圖。

 

同時,對於這種二分類人臉識別算法還有一種技巧,假設圖片x(i)是人臉數據庫中的圖片,我們可以不用每次計算人臉數據庫中圖片的特征值,而是預先計算好后作為靜態數據存入數據庫中,在識別時直接輸入sigmoid單元即可。

 

4.6 什么是神經風格轉換

下圖是神經風格轉換的兩個例子,我們C來表示內容圖像,用S來表示風格圖像,用G來表示生成圖像。

 

 

 

4.7 什么是深度卷積網絡

我們選取能夠最好激活隱藏單元的圖片塊,從中可以發現,淺層神經網絡層學習的是邊緣一類比較小的特征,而深層神經網絡層學習的圖像區域會更大,學習的特征也會更加全面。

 

4.8 代價函數

神經風格轉換的輸入需要兩張照片,分別是內容圖像和風格圖像。所以代價函數也包含兩個部分,一部分是內容代價,它用來衡量內容圖片與生成圖片之間的相似度,另一部分是風格代價,它用來衡量風格圖片與生成圖片之間的相似度,同時還有兩個超參數。

 

 

具體神經風格轉換算法的過程:先生成一個初始的生成圖片,然后通過正向以及反向傳播使代價函數變小。

 

 

4.9 內容代價函數

對於內容代價,我們要先選擇一個隱含層來進行計算,這里一般選擇中間層;然后使用一個預訓練的網絡,比如VGG;之后通過比較內容圖像第l層的激活值和生成圖像第l層的激活值來計算內容代價,當內容圖像和生成圖像相似時,使內容代價比較小。這里可以使用L2范式。

 

4.10 風格代價函數

如果我們使用第l層來定義風格代價,那么我們將風格代價定義為跨通道激活值之間的相關性。如下圖,圖像含有5個通道,所謂相關性的含義是:如果紅色通道識別的是豎線,黃色通道識別的是橙色,則如果紅色通道和黃色通道的相關性比較高,那么出現豎線時橙色出現的可能比較大,如果紅色通道與黃色通道的相關性比較低,則出現豎線時一般不會出現橙色。

要計算風格代價,首先要計算出風格矩陣,求出風格圖像和生成圖像的風格矩陣,然后如下圖求解風格代價。

 

 

4.11 一維到三維推廣

使用一維的卷積核可以對一維數據進行卷積操作。

 

使用三維卷積核可以對三維數據進行卷積操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM