目錄鏈接:吳恩達Deep Learning學習筆記目錄
?1.卷積神經網絡
?2.CNN實例探究
?3.目標檢測
?4.人臉識別和神經風格轉換
1. 卷積神經網絡
? 1.1 邊緣檢測
??在計算機視覺中,圖片的識別過程是先檢測到圖片中的邊緣,再檢測到圖片中的一部分,最后檢測到整個圖像。如下圖,對于邊緣檢測,計算機檢測一張圖片時,可能首先第一步要做的就是檢測圖片中的垂直邊緣(如欄桿、人的輪廓線)。可能第二步要做的是檢測水平邊緣。
??為什么通過卷積計算后,計算機能夠檢測到圖像的邊緣呢?下圖是比較直觀的描述,可以看出,原圖片為左邊亮、右邊暗,卷積核也是左邊亮、右邊暗(反過來呢?),卷積后的結果就是中間亮、兩邊暗(卷積核或原圖反過來就中間暗)。
? 1.2 Padding
??如下圖中的卷積操作,(n,n)
的圖片經過(f,f)
的卷積核后,得到(n-f+1,n-f+1)
的輸出。這樣進行卷積存在兩個問題,①每經過一次卷積,圖片都在縮小;②在邊緣上的像素點卷積時只被利用一次或幾次,而在中間的像素點被重復利用很多次,這就導致邊緣的很多信息被丟失。Padding即用來解決這個問題,即在圖片矩陣外圍再補一層亮度值0(RGB圖中為0-255),Padding后再卷積得到的輸出為(n+2p-f+1,n+2p-f+1)
,如此便可以避免圖片縮小問題,弱化邊緣信息丟失問題。
? 1.3 卷積步長
??假設輸入圖片為(n,n)
,卷積核(f,f)
,步長為s
,Padding為p
,那么輸出圖片大小為((n+2p-f)/ s +1,(n+2p-f)/ s +1)
。如果(n+2p-f)/ s
不是整數,則向下取整。
? 1.4 三維卷積
??RGB圖片有三個通道,分別為紅綠藍,描述一張圖片的矩陣為(n,n,3)
,所以卷積核大小為(f,f,3)
,但輸出還是一個二維矩陣。
? 1.5 單層卷積網絡
??單層卷積網絡計算過程:? 1.6 簡單卷積網絡示例
??簡單的卷積網絡如下,一般而言,卷積核的數量會隨著網絡深入而增加,圖片縮小(無Padding時),實際上,典型的卷積網絡應該包括卷積層、池化層和全連接層。? 1.7 池化層
??池化的直觀理解,相當于卷積核,但不是執行權重求和,而是執行核選取區域最大值(最大池化)或平均值(平均池化)。其意義是,如果核提取到某個特征,則保留其最大值,如果這個區域沒有這個特征,那么它的最大值也很小。池化操作會對每一通道數據進行池化,池化后通道數不變。池化層只有一組超參數,沒有可學習參數。? 1.8 典型卷積神經網絡
? 1.9 為什么采用卷積網絡
??相比于只用全連接層相比,卷積層的兩個主要優勢是參數共享和稀疏連接,這兩個原因可以減少參數,防止過擬合。
??②稀疏連接:例如,輸出結果中一個像素點上的數值僅由卷積核對應的那塊區域決定,其他區域都不會對其造成影響,而全連接層則是將輸入圖片所有數據用于計算。
??卷積神經網絡還能夠提取平移不變的特征,因為對于卷積網絡,即使畫像平移幾個像素,這張圖片依然具有非常相似的特征。
2. CNN實例探究
? 2.1 經典網絡
??(1)LeNet - 5
??LeNet - 5可以識別圖片中的手寫數字(適用于灰階圖像,32 * 32 * 1),LeNet - 5沒有Padding,池化采用的是平均池化。隨網絡深度增加,圖像縮小,通道數增加。論文中使用的激活函數為sigmoid和tanh。一共約6萬個參數。
??實際上,AlexNet (一共約6000萬個參數)與LeNet - 5有很多相似之處,但AlexNet采用了含有很多隱藏單元的基礎模塊,并在規模很大的數據集上訓練,這使得其表現極為出色;另一個讓其表現出色的原因是采用了relu激活函數。
??②“局部響應歸一化層”:將一個像素位置上所有通道上的值進行歸一化,即LRN層,這么做的原因是我們可能不需要那么高的激活值,但后來研究者發現LRN層起到的作用不大。
??(2)VGG-16 **
? 2.2 殘差網絡(Residual Networks)
??非常深的網絡是很難訓練的,因為存在梯度消失和梯度爆炸問題。殘差網絡,通過“遠跳連接”將前面的信息直接傳給后面的layer,而不經過中間的layer。
(1)殘差網絡為什么有效?
??當一個網絡越深時,它在訓練集上的效率會有所降低,但在殘差網絡上并不完全如此。在殘差塊中,a[l]通過遠跳連接直接與l+2層Z加和后輸入到激活函數,若網絡中添加了正則項,Z[l+2]的計算中,權重W可能被壓縮得很小,如果出現梯度消失問題,那么Z[l+2]項被忽略;又激活函數為ReLu,故該過程相當于計算了a[l]=a[l+2]得恒等式。a[l]和a[l+2]維度不同問題,添加一個權重矩陣來將a[l]維度轉化與a[l+2]一致,但實際上ReNet采用了一系列維度相同的卷積。
(2)網絡中的網絡和1x1卷積
??對于一張單通道的圖片來說,用一個1x1的卷積核去卷積,其意義不大,但對于網絡中,通道數量很多的數據,1x1卷積核可以實現降維或升維的作用(通道坐標上的維度)。
? 2.3 Inception network motivation
??構建卷積層是,我們要決定卷積核的大小(1x3、3x3或5x5?)、要不要添加池化層,Inception網絡可以自己學習決定,雖然模型會變得比較復雜,但其表現卻非常好。如下圖,①1x1 filter用于通道降維(或升維);②3x3 filter用于卷積;③5x5 filter也用于卷積;④MAX-POOL用于最大池化。這些filter過程都需要維持輸出圖片大小一致(通過Padding和stride控制)。
(1)如何計算loss
??如下圖,在計算loss的過程中,存在一個問題,28x28x192的輸入,那么卷積核的大小為5x5x192,一共32個卷積核,那么需要執行的乘法操作將達到1.2億次,就算是現在的計算機也比較花費時間,而這僅僅是一層卷積。
(2)Inception network
??Inception模塊,兩個綠色層中間各個連接,在訓練時,模型會選擇啟用哪一個連接結果更優。
? 2.4 遷移學習
??如上圖所示,①當你的數據集較小時,可以采用其他人的網絡核權重參數,替換輸出層,訓練時僅訓練輸出層參數;②當數據集較大時,則選擇訓練后幾層網絡參數;③當你的數據集足夠大時,可以將所有參數都訓練。
3. 目標檢測
? 3.1 目標定位
??在目標檢測中,一張圖片的分類,輸出不僅僅是一個標簽(歸屬于什么),而是多個標簽,如同時輸入這張圖片含有行人、汽車、摩托、背景等;此外對于檢測到的目標如行人,不僅包含行人標簽,還包含這個行人的位置、大小。如下圖,圖片左上角坐標為(0,0),右下角坐標為(1,1),檢測到的目標坐標為其中心點(bx,by),大小為(bh,bw)。故目標檢測中,輸出的結果為多個標簽,每個標簽含目標所屬類別、坐標、大小。
? 3.2 特征點檢測
??通過目標定位方法可以輸出目標大小、坐標。更概括的說法是,神經網絡可以通過輸出圖片上的特征點(x,y)坐標,來實現對目標特征的識別。例如,需要通過特征點來識別一張人臉,在訓練集中,X為圖片數據,標簽數據Y包含[分類,人臉各個部分輪廓的特征點],如下圖中人臉檢測,輸出64對坐標點、一個分類。需要注意的是,所有圖片的坐標點順序一致,如左眼角都是(x1,y1)。.? 3.3 目標檢測
(1)滑動窗口法
??要實現圖片中汽車目標檢測,①首先要構建一個標簽訓練集,X表示適當剪切的汽車圖片樣本(含有汽車則圖片基本被汽車占滿),Y=[1 = 汽車,0 != 汽車];②將這個訓練集用于訓練卷積網絡;③通過滑動窗口的方法,采用已訓練好的網絡,可以實現目標檢測。
(2)滑動窗口的卷積應用實現
??如果采用上述的方法來實現窗口滑動,那么效率很低,如果在卷積層上應用這個算法,那么效率將大大提升。
??(2.1)全連接層轉化為卷積層
??如下圖第一個全連接層,一個樣本輸出的是一個長度為400的向量。將其轉化為卷積層,則采用5x5x400的卷積核,卷積后得到1x1x400的輸出,最終輸出不再是一個softmax向量,而是1x1x4的輸出。
??(2.2)卷積層實現滑動窗口
??實際上將滑動窗口中數據傳入卷積網絡,很多像素點對應的卷積計算都是重復在進行,所以沒必要一個一個窗口的輸入,而是將整張圖片輸入,最后輸出各個窗口組成的卷積層數據。如下圖中,綠色對應綠色部分。
? 3.4 YOLO算法
(1)Bounding box
??在卷積網絡中實現窗口滑動,能夠提升效率,但還存在一個問題:不能輸出最精準的邊界框。在YOLO算法中,將圖片劃分為nxn份,如下圖中3x3,更精細一點還可以是19x19等等。為每一部分都設置標簽向量(含類別、坐標、大小等),最后輸出結果大小為3x3x8(8即每個標簽向量的長度)。這個算法將會使得兩個目標的中心在同一個格子的概率降低。同時,能輸出邊界邊框,可以具有任意高寬比和更精確的坐標。
(注意:中心坐標一定會坐落在劃分的格子內,但長寬可能會比格子大)
:(2)交并比函數
??交并比函數用于評價預測邊框是否定位準確。
(3)非極大值抑制
??前述的算法可能會對同一個目標做出多次檢測,非極大值抑制可以保證算法對每個目標只檢測一次。如下圖中,每一個目標對象都會有很多個邊框,每個邊框會給出對應的Pc概率值,非最大值抑制算法會去掉除了概率最大的其他邊框。
(4)Anchor box
??如前所述算法都只是一個框檢測一個目標,如果需要一個框檢測多個目標,可以使用Anchor box。如下圖,人和車的中心坐標都坐落在同一個格子里,那么對于那個格子的輸出Y將無法檢測出兩個結果,必須輸出人或車的其中一個。而Anchor box的思路是預先定義兩個形狀不同的anchor box,然后定義的輸出向量包含兩個概率、坐標、類別信息,并將其與anchor box分別關聯起來。
(5)YOLO算法
??①訓練集:檢測類別(行人、車、摩托),anchor box(竹竿和胖墩),那么標簽向量為3x3x2x8。不同各自y定義如下:
4. 人臉識別和神經風格轉換
? 4.1 one shot學習
??人臉識別最大的挑戰是解決一次學習問題,也就是需要僅僅通過一張照片或一個樣本就能去識別這個人,而在傳統的deep learning的認知中,只有一個樣本時,表現并不好。假設用下圖的方法去做人臉識別,①如果僅有4個員工,用4個員工去訓練一個卷積網絡,顯然樣本數太小,是不合理;②如果又來一個新員工,那么又將要重新訓練這個網絡。? 4.2 Siamese network
??前述的卷積網絡,最后將提取到的特征輸入到softmax等函數來輸出結果。在Siamese network中,將最后提取特征這一層(encoding of sample)將不會輸入給softmax層,再將另一張照片輸入到同一網絡中(結構和參數都相同)提取特征,將兩張照片的特征輸入到“similarity”函數來求兩張照片的相似度。? 4.3 三元損失函數(Triplet loss)
??如下圖,一共三張照片,A和P為同一個人,A和N為不同人,學習的目標是,我們希望,A和P之間的距離盡量小,而A和N之間的距離盡量大,那么就有:
loss 函數
? 4.4 人臉驗證和二分類問題
? 4.5 神經風格轉換
??例子:采用Style的風格來繪制Content:
(1)深度卷積網絡到底在學習什么?
??論文Visualizing and Understanding Convolutional Networks告訴我們CNN每一層到底學習到了什么。論文通過將每一層的輸出反池化、反卷積的到與原圖片大小的圖片,以此來觀察每一層所學習到的東西。池化是不可逆的過程,論文中采用記錄最大值的位置,再將池化后的數值放回原來位置,其余位置填充0來實現反池化過程。例如第一層,我們選取9個卷積核的輸出,將每個卷積核的輸出反卷積后,選取激活值top9(我的理解:n個樣本通過這個卷積核輸出后,選擇激活值最大的9個)的繪制成圖。可以看出,隨著layer的增加,所學習到的特征更為復雜。
(2)代價函數
??為了實現神經風格遷移,我們需要定義一個對于生成圖片G的代價函數,并來優化它。公式含兩項,分別代表新生成的圖片和原圖片、風格圖片的相似度。對于新圖片會先隨機生成,然后經過優化代價函數來生成圖片。
??(2.1)Content代價函數
??①我們需要通過hidden layer來計算content cost,如果層數太淺,那么它可能會使得像素上非常接近content圖片,如果太深,則會判斷圖片中有什么(狗)來生成圖片,并確保生成圖片里有這個東西(狗),所以一般這個hidden layer既不會太淺也不會太深。②使用一個已經預訓練的卷積網絡(如VGG)。③將al和al作為圖片在l層的激活值。④如果al和al相似,那么圖片內容相似。
??(2.2)Style代價函數
??什么是一張圖片的“style”?如果采用某一層的激活值來衡量“style”,那么這個style的定義就是各個通道之間對應位置上的點的相關系數。這個相關系數描述了,如果通道i中的內容出現在該位置,那么通道j中的內容出現在該位置的概率。例如下圖,①通道對應①部分垂直線特征,②對應②部分橘色圖案,相關系數描述了在對應位置①②同時出現的概率。
??①k和k`表示同一層不同通道,i,j代表一個通道中不同位置坐標。計算兩個通道的相關系數如下,將會得到一個相關系數矩陣,大小為通道數 x 通道數: