在吳恩達深度學習視頻以及大樹先生的博客提煉筆記基礎上添加個人理解,原大樹先生博客可查看該鏈接地址大樹先生的博客- ZJ
CSDN:http://blog.csdn.net/JUNJUN_ZHAO/article/details/79281361
Part 1:人臉識別
4.1 什麼是人臉識別? what is face recognition?
基於以上所學的卷積神經網絡的知識,接下來介紹,一些重要的 ConvNet 的特殊應用。
- 人臉驗證和人臉識別
人臉驗證(Verification):
- Input:圖片、名字/ID;
- Output:輸入的圖片是否是對應的人。
- 1 to 1 問題。
人臉識別(Recognition):
- 擁有一個具有 K 個人的數據庫;
- 輸入一副人臉圖片;
- 如果圖片是任意這 K 個人中的一位,則輸出對應人的 ID。
個人理解:目前 My company 用的是 Face Verification. 百度用的是 Face Recognition.
人臉識別問題對於人臉驗證問題來說,具有更高的難度。如對於一個驗證系統來說,如果我們擁有 99% 的精確度,那麼這個驗證系統已經具有了很高的精度;但是假設在另外一個識別系統中,如果我們把這個驗證系統應用在具有K個人的識別系統中,那麼系統犯錯誤的機會就變成了 K 倍。所以如果我們想在識別系統中得到更高的精度,那麼就需要得到一個具有更高精度的驗證系統。
4.2 one shot learning
人臉識別挑戰:對於大多數的人臉識別系統都存在的一個問題就是 one shot learning 一次學習問題。
什麼是 one shot learning:
對於一個人臉識別系統,我們需要僅僅通過先前的一張人臉的圖片或者說一個人臉的樣例,就能夠實現該人的識別,那麼這樣的問題就是 one shot 問題。對於存在於數據庫中的人臉圖片,系統能夠識別到對應的人;而不在數據庫中的人臉圖片,則系統給出無法通過識別的結果。
對於 one shot learning 問題,因爲只有單個樣本,是不足以訓練一個穩健的卷積神經網絡來進行不同人的識別過程。而且,在有新的樣本成員加入的時候,往往還需要對網絡進行重新訓練。所以我們不能以傳統的方法來實現識別系統。
Similarity 函數:
爲了能夠讓人臉識別系統實現一次學習,需要讓神經網絡學習 Similarity 函數:
- d(img1, img2):兩幅圖片之間的差異度
- 輸入:兩幅圖片
- 輸出:兩者之間的差異度
- 如果 ,則輸出“same”;
- 如果 ,則輸出“different”.
注: 發音 /tau/
對於人臉識別系統,通過將輸入的人臉圖片與數據庫中所擁有的圖片成對輸入 Similarity 函數,兩兩對比,則可解決 one shot problem。如果有新的人加入團隊,則只需將其圖片添加至數據庫即可。
4.3 Siamese 網絡 network
如何實現上面提到的 Similarity 函數呢?:利用 Siamese 網絡來實現 Similarity 函數。
構建網絡:
對於一個卷積神經網絡結構,我們去掉最後的 softmax 層,將圖片樣本1 輸入網絡,最後由網絡輸出一個 N 維的向量(圖中實例以 128 表示),這 N 維向量則代表輸入圖片樣本1 的編碼。將不同人的圖片樣本輸入相同參數的網絡結構,得到各自相應的圖片編碼。
Similarity 函數實現:
將 Similarity 函數表示成兩幅圖片編碼之差的範數:
那麼也就是說:
- 我們的神經網絡的參數定義了圖片的編碼;
- 學習網絡的參數,使我們得到好的 Similarity 函數:
- 如果 x1,x2 是同一個人的圖片,那麼得到的 很小;
- 如果 x1,x2 不是同一個人的圖片,那麼得到的 很大。
4.4 Triplet Loss
上面提到了神經網絡的參數定義了圖片的編碼; 接下來->
如何通過學習神經網絡的參數,得到優質的人臉圖片的編碼?方法之一就是定義 Triplet 損失函數,並在其之上運用梯度下降。
學習目標:
爲了使用Triplet 損失函數,我們需要比較成對的圖像(三元組術語):
- Anchor (錨)(A): 目標圖片;(錨,理解上就是目標)
- Positive(P):與 Anchor 屬於同一個人的圖片;
- Negative(N):與 Anchor不屬於同一個人的圖片。
對於 Anchor 和 Positive,我們希望二者編碼的差異小一些;對於Anchor 和Negative,我們希望他們編碼的差異大一些。所以我們的目標以編碼差的範數來表示爲:
也就是:
上面的公式存在一個問題就是,當 時,也就是神經網絡學習到的函數總是輸出 0 時,或者 時,也滿足上面的公式,但卻不是我們想要的目標結果。所以爲了防止出現這種情況,我們對上式進行修改,使得兩者差要小於一個較小的負數:
一般將 寫成 ,稱爲“margin”。即:
不同 margin 值的設置對模型學習具有不同的效果,margin 的作用就是拉大了 Anchor 與 Positive 圖片對 和 Anchor 與 Negative 圖片對之間的差距。
Triplet 損失函數:
Triplet 損失函數的定義基於三張圖片:Anchor、Positive、Negative。
整個網絡的代價函數:
假設我們有一個 10000 張片的訓練集,裏面是 1000 個不同的人的照片樣本。我們需要做的就是從這 10000 張訓練集中抽取圖片生成(A,P,N)的三元組,來訓練我們的學習算法,並在 Triplet 損失函數上進行梯度下降。
注意:爲了訓練我們的網絡,我們必須擁有 Anchor 和 Positive 對,所以這裏我們必須有每個人的多張照片,而不能僅僅是一張照片,否則無法訓練網絡。
三元組(A,P,N)的選擇:
在訓練的過程中,如果我們隨機地選擇圖片構成三元組(A,P,N),那麼對於下面的條件是很容易滿足的:
所以,爲了更好地訓練網絡,我們需要選擇那些訓練有“難度”的三元組,也就是選擇的三元組滿足:
算法將會努力使得 變大,或者使得 變小,從而使兩者之間至少有一個 的間隔;
增加學習算法的計算效率,避免那些太簡單的三元組。
最終通過訓練,我們學習到的參數,會使得對於同一個人的圖片,編碼的距離很小;對不同人的圖片,編碼的距離就很大。
對於大型的人臉識別系統,常常具有上百萬甚至上億的訓練數據集,我們並我容易得到。所以對於該領域,我們常常是下載別人在網上上傳的預訓練模型,而不是從頭開始。
4.5 臉部驗證和二分類 Face verification and binary classification
除了利用 Triplet 損失函數來學習人臉識別卷積網絡參數的方法外,還有其他的方式。我們可以將人臉識別問題利用 Siamese 網絡當成一個二分類問題,同樣可以實現參數的學習。
Siamese 二分類改進:
對兩張圖片應用 Siamese 網絡,計算得到兩張圖片的 N 維編碼,然後將兩個編碼輸入到一個 logistic regression 單元中,然後進行預測。如果是相同的人,那麼輸出是 1;如果是不同的人,輸出是 0。那麼這裏我們就將人臉識別的問題,轉化爲一個二分類問題。
對於最後的 sigmoid 函數,我們可以進行如下計算:
其中, 代表圖片 的編碼,下標 k 代表選擇 N 維編碼向量中的第 k 個元素。
我們以兩個圖片編碼向量對應元素之間的差值作爲特徵輸入到 logistic regression 的單元中,增加參數 和 ,通過訓練得到合適的參數權重和偏置,進而判斷兩張圖片是否爲同一個人。
同時輸入邏輯迴歸單元的特徵可以進行更改,如還可以是:
上式也被稱爲 方公式,有時也稱爲 方相似度。
在實際的人臉識別系統中,我們可以對數據庫的人臉圖片進行預計算,存儲卷積網絡得到的編碼。當有圖片進行識別時,運用卷積網絡計算新圖片的編碼,與預計算保存好的編碼輸入到邏輯迴歸單元中進行預測。這樣可以提高我們系統預測的效率,節省計算時間。
總結:
利用 Siamese 網絡,我們可以將人臉驗證當作一個監督學習,創建成對的訓練集和是否同一個人的輸出標籤。
我們利用不同的圖片對使用反向傳播的算法對 Siamese 網絡進行訓練,進而得到人臉驗證系統。
Part 2:神經風格遷移
4.6 什麼是神經風格遷移? what is neural style transfer?
最近,ConvNets 最有趣的應用,是神經風格遷移。
Content :內容圖片
Style:風格圖片
Generated: 生成圖片
4.7 深度網絡學習內容可視化 what are deep ConvNets learning?
疑問:深度卷積神經網絡究竟在學習什麼?接下來通過可視化的例子去理解。
如何可視化:
假設我們訓練了一個卷積神經網絡如下所示:
我們希望看到不同層的隱藏單元的計算結果。依次對各個層進行如下操作:
- 在當前層挑選一個隱藏單元;
- 遍歷訓練集,找到最大化地激活了該運算單元的圖片或者圖片塊;
- 對該層的其他運算單元執行操作。
個人理解:某個隱藏單元都在尋找類似樣式的圖片塊。也就是只要是符合這個隱藏單元所尋找的樣式 圖片塊,都會激活這個隱藏單元的。
對於在第一層的隱藏單元中,其只能看到卷積網絡的小部分內容,也就是最後我們找到的那些最大化激活第一層隱層單元的是一些小的圖片塊。我們可以理解爲第一層的神經單元通常會尋找一些簡單的特徵,如邊緣或者顏色陰影等。
各層網絡可視化:
觀察可知:對於卷積網絡的各層單元,隨着網絡深度的增加,隱藏層計算單元隨着層數的增加,從簡單的事物逐漸到更加複雜的事物。
例如:從檢測一些邊緣,到檢測某一個部分,再到檢測出 狗,人 等等。
4.8 神經風格遷移代價函數 Cost function
代價函數:
爲了實現神經風格遷移,我們需要爲生成的圖片定義一個代價函數。(代價函數的目的永遠是最小化代價函數,用的是梯度下降法)
對於神經風格遷移,我們的目標是由內容圖片 C 和風格圖片 S,生成最終的風格遷移圖片 G:
所以爲了實現神經風格遷移,我們需要定義關於 G 的代價函數 J,以用來評判生成圖片的好壞:
其中
- 代表生成圖片 G 的內容和內容圖片 C 的內容的相似度;
- 代表生成圖片 G 的內容和風格圖片 S 的內容的相似度;
- 兩個超參數用來表示以上兩者之間的權重。
執行過程:
- 隨機初始化生成圖片 G,如大小爲 100×100×3;
- 使用梯度下降算法最小化上面定義的代價函數 J(G),
對於上圖的內容圖片 C 和風格圖片 S,通過梯度下降算法一次次的訓練,我們可以由初始的噪聲圖片得到最終的風格遷移圖片 (具有 C的內容,又具有 S 的風格的)圖片 G。
4.9 內容代價函數(Content cost function)
由上可知,風格遷移網絡的代價函數,具有一個內容代價部分,還有一個風格代價部分。
- 假設我們使用隱藏層 來計算內容代價。(如果選擇的 太小,那麼代價函數就會使得我們的生成圖片 G 在像素上非常接近內容圖片;然而用很深的網絡,那麼生成圖片 G 中就會產生與內容圖片中所擁有的物體。所以對於 一般選在網絡的中間層,既不深也不淺);
使用一個預訓練的卷積網絡。(如,VGG 或其他); - 令 和 分別代表內容圖片 C 和生成圖片 G 的 層的激活值;
- 如果 和 相似,那麼兩張圖片就有相似的內容;
定義內容代價函數如下:
在對代價函數運行梯度下降算法時,會激勵這裏的內容代價函數,努力使得生成圖片 G 隱含層 的激活值和內容圖片 C 隱含層 的激活值相似。
個人理解:某一層的 某個激活函數的激活值相似,就是某種程度上,應該是類似的 圖片塊可以引起的。
4.10 風格代價函數(Style cost function)
“Style”的含義:
對於一個卷積網絡中,我們選擇網絡的中間層 , 定義“Style”表示 層的各個通道激活項之間的相關性。
相關性大小的度量:
上面是我們選出的 層的激活項,對於不同的通道值,代表不同的神經元所學習到的特徵,這裏假如紅色的通道可以找到圖片中含有垂直紋理特徵的區域,黃色通道可以找出橙色的區域。
而相關性大小的含義就是,如假設中,圖片出現垂直紋理特徵的區域顯示橙色可能的大小。
我們將相關係數應用到風格圖片 S 和生成圖片 G 的對應通道上,就可以度量風格圖片和生成圖片的相似度。
Style 矩陣:
- 令 表示在(i,j,k)位置的激活值,其中 i、j、k 分別代表激活值的高、寬、通道;
是一個 大小的矩陣:
上面的矩陣在線性代數中又稱爲 Gram 矩陣,這裏稱爲風格矩陣。
代價函數:
內容代價函數和風格代價函數前面的歸一化可以加也可以不加,因爲總體的代價函數前面有權重係數。
如果對各層都使用風格代價函數,那麼會讓結果變得更好:
4.11 1D to 3D 卷積 一維到三維推廣 1D and 3D generalizations of model
在我們上面學過的卷積中,多數是對圖形應用 2D 的卷積運算。同時,我們所應用的卷積運算還可以推廣到 1D 和 3D 的情況。
2D和1D卷積:
- 2D卷積:14×14×3∗5×5×3——>10×10×
- 1D卷積:14×1∗5×1——>10×
3D卷積:
- 3D 卷積:14×14×14×1∗5×5×5×1——>10×10×10×
- 3D 數據:如醫療 CT 掃描中的即可產生身體的 3D 模型;電影切片也屬於 3D 數據。
confidence 置信.
參考文獻:
[1]. 大樹先生.吳恩達Coursera深度學習課程 DeepLearning.ai 提煉筆記(4-4)– 特殊應用:人臉識別和神經風格遷移
PS: 歡迎掃碼關注公衆號:「SelfImprovementLab」!專注「深度學習」,「機器學習」,「人工智能」。以及 「早起」,「閱讀」,「運動」,「英語 」「其他」不定期建羣 打卡互助活動。