1. 程式人生 > >Deep Learning.ai學習筆記_第四門課_卷積神經網路

Deep Learning.ai學習筆記_第四門課_卷積神經網路

目錄

第一週 卷積神經網路基礎

第二週 深度卷積網路:例項探究

第三週 目標檢測

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

 

第一週 卷積神經網路基礎

垂直邊緣檢測器,通過卷積計算,可以把多維矩陣進行降維。如下圖:

 

卷積運算提供了一個方便的方法來發現影象中的垂直邊緣。例如下圖:

 

對於3x3的過濾器,使用下面的數字組合魯棒性比較高,這樣的過濾器也稱為Sobel過濾器

 

還有一種稱為Scharr的過濾器,如下:

隨著深度學習的發展,我們學習的其中一件事就是當你真正想去檢測出複雜影象的邊緣,你不一定要去使用那些研究者們所選擇的這九個數字(3x3的過濾器),但你可以從中獲益匪淺。把這矩陣中的9個數字當成9個引數,並且在之後你可以學習使用反向傳播演算法,其目標就是去理解這9個引數。

 

將矩陣的所有數字都設定為引數,通過資料反饋,讓神經網路自動去學習它們,我們會發現神經網路可以學習一些低階的特徵,例如這些邊緣的特徵。

 

padding卷積,為了指定卷積操作中的padding,你可以指定的值。也可以使用Valid卷積,也就是p = 0。也可使用Same卷積填充畫素,使你的輸出和輸入大小相同。(same卷積填充的核心要點,是使得原給出的矩陣中畫素點都能夠均勻被呼叫計算,否則邊緣點呼叫少,從而被忽略)

 

一個典型的卷積神經網路通常有三層,一個是卷積層,我們常常用Conv來標註。還有兩種常見型別的層,一個是池化層,我們稱之為POOL。最後一個是全連線層,用FC

表示。如下圖:

 

卷積網路中使用池化層,也能夠縮減模型的大小,提高計算速度,同時提高所提取特徵的魯棒性。一下是一個池化層的例子, 把4×4的輸入拆分成不同的區域,我把這個區域用不同顏色來標記。對於2×2的輸出,輸出的每個元素都是其對應顏色區域中的最大元素值。

 

最大化操作的功能就是隻要在任何一個象限內提取到某個特徵,它都會保留在最大化的池化輸出裡。所以最大化運算的實際作用就是,如果在過濾器中提取到某個特徵,那麼保留其最大值。如果沒有提取到這個特徵,可能在右上象限中不存在這個特徵,那麼其中的最大值也還是很小,這就是最大池化的直觀理解。

 

池化的超級引數包括過濾器大小f和步幅s,常用的引數值為f = 2,s = 2,應用頻率非常高,其效果相當於高度和寬度縮減一半。

 

最大池化只是計算神經網路某一層的靜態屬性,它只是一個靜態屬性。

 

如何選定這些引數,常規做法是,儘量不要自己設定超引數,而是檢視文獻中別人採用了哪些超引數,選一個在別人任務中效果很好的架構,那麼它也有可能適用於你自己的應用程式。

 

下面看一個卷積神經網路的例子,步驟一般為卷積->池化->卷積->池化... ... ->全連線,全連線等。如下圖:

 

第二週 深度卷積網路:例項探究

當用於訓練影象和資料集時,AlexNet能夠處理非常相似的基本構造模組,這些模組往往包含著大量的隱藏單元或資料,這一點AlexNet表現出色。AlexNetLeNet表現更為出色的另一個原因是它使用了ReLu啟用函式。如下圖:

 

非常非常深的神經網路是很難訓練的,因為存在梯度消失和梯度爆炸問題。 跳躍連線(Skip connection),它可以從某一層網路層獲取啟用,然後迅速反饋給另外一層,甚至是神經網路的更深層。我們可以利用跳躍連線構建能夠訓練深度網路的ResNets,有時深度能夠超過100層。

如圖所示,5個殘差塊連線在一起構成一個殘差網路。

 

一般情況,隨著網路深度加深,訓練錯誤會越來越多。但是ResNets不一樣, 即使網路再深,訓練的表現卻不錯,比如說訓練誤差減少,就算是訓練深達100層的網路也不例外。這種方法,可以有助於 解決梯度消失和梯度爆炸問題,讓我們在訓練更深網路的同時,又能保證良好的效能。也許從另外一個角度來看,隨著網路越來深,網路連線會變得臃腫,但是ResNet確實在訓練深度網路方面非常有效。

 

普通網路和ResNets網路常用的結構是:卷積層-卷積層-卷積層-池化層-卷積層-卷積層-卷積層-池化層……依此重複。直到最後,有一個通過softmax進行預測的全連線層。

 

1×1卷積層 給神經網路添加了一個非線性函式,從而減少或保持輸入層中的通道數量不變,當然如果你願意,也可以增加通道數量。後面你會發現這對構建Inception網路很有幫助。如下圖:

 

如果你看到一篇研究論文想應用它的成果,你應該考慮做一件事,我經常做的就是在網路上尋找一個開源的實現。因為你如果能得到作者的實現,通常要比你從頭開始實現要快得多,雖然從零開始實現肯定可以是一個很好的鍛鍊。

 

在自己遇到的問題,訓練的資料集內容比較少時,可以從網上下載一些以已訓練且資料集比較大的模型,然後修改其最後的softmax輸出值,然後再在此模型上進行訓練學習,這就是卷積網路訓練中的遷移學習,一般能夠達到很好的效果。

 

常用的實現資料擴充的方法是使用一個執行緒或者是多執行緒,這些可以用來載入資料,實現變形失真,然後傳給其他的執行緒或者其他程序。

 

當你沒有太多標籤資料時,你只需要更多地考慮手工工程。 另一套技術,當你有相對較少的資料時就可以用很多相似的資料。

 

第三週 目標檢測

目標定位

 

滑動視窗目標檢測,通過不斷改變初始視窗的大小,以一定的步幅移動該視窗,對意向目標進行檢測。具體如下圖:

 

滑動視窗目標檢測演算法也有很明顯的缺點,就是計算成本,因為你在圖片中剪切出太多小方塊,卷積網路要一個個地處理。如果你選用的步幅很大,顯然會減少輸入卷積網路的視窗個數,但是粗糙間隔尺寸可能會影響效能。反之,如果採用小粒度或小步幅,傳遞給卷積網路的小視窗會特別多,這意味著超高的計算成本。

 

YOLO物件檢測演算法是最有效的物件檢測演算法之一,包含了整個計算機視覺物件檢測領域文獻中很多最精妙的思路。

 

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

人臉識別,需要解決一次學習的問題。 要讓人臉識別能夠做到一次學習,為了能有更好的效果,要做的應該是學習Similarity函式。 解決一次學習問題的,只要你能學習函式d,通過輸入一對圖片,它將會告訴你這兩張圖片是否是同一個人。如果之後有新人加入了你的團隊(編號5),你只需將他的照片加入你的資料庫,系統依然能照常工作。

 

函式的作用就是輸入兩張人臉,然後告訴你它們的相似度。實現這個功能的一個方式就是用Siamese網路,如下圖:

 

對於兩個不同的輸入,執行相同的卷積神經網路,然後比較它們,這一般叫做Siamese網路架構。

 

要想通過學習神經網路的引數來得到優質的人臉圖片編碼,方法之一就是定義三元組損失函式然後應用梯度下降。學習收集定義好的三元組資料集, 用梯度下降最小化我們之前定義的代價函式,這樣做的效果就是反向傳播到網路中的所有引數來學習到一種編碼,使得如果兩個圖片是同一個人,那麼它們的d就會很小,如果兩個圖片不是同一個人,它們的d就會很大。如下圖:

 

人臉識別的另一種方法是可以把識別過程當成一個二分類問題。對比兩種圖片的差異,輸出相似度,如下圖:

 

什麼是神經風格遷移?

例如,可以把一張圖片的元素整合到另一張圖片中,如下圖:

 

 

 

 

參考資料:

1.http://www.ai-start.com