吴恩达深度学习——人脸识别与神经风格转换
文章目錄
- 引言
- 什么是人臉識別
- One-Shot學(xué)習(xí)
- Siamese網(wǎng)絡(luò)
- Triplet損失
- 面部驗證與二分類
- 什么是神經(jīng)風(fēng)格轉(zhuǎn)換
- 深度卷積網(wǎng)絡(luò)在學(xué)習(xí)什么
- 神經(jīng)風(fēng)格轉(zhuǎn)換代價函數(shù)
- 內(nèi)容代價函數(shù)
- 風(fēng)格代價函數(shù)
- 從一維到三維的推廣
- 參考
引言
本文是吳恩達深度學(xué)習(xí)第四課:卷積神經(jīng)網(wǎng)絡(luò)。本次課程將會告訴大家如何構(gòu)造卷積神經(jīng)網(wǎng)絡(luò)并應(yīng)用到圖像數(shù)據(jù)上。從中你會學(xué)到如何構(gòu)建一個卷積神經(jīng)網(wǎng)絡(luò)、如何應(yīng)用卷積神經(jīng)網(wǎng)絡(luò)到圖像識別和目標檢測上、學(xué)習(xí)如何使用神經(jīng)風(fēng)格轉(zhuǎn)換去生成藝術(shù)作品、能將這些算法應(yīng)用到更廣泛的圖像應(yīng)用上,比如2D、3D數(shù)據(jù)和視頻。
第四課有以下四個部分,本文是第一部分。
什么是人臉識別
首先要區(qū)分人臉識別與人臉驗證。
給定輸入圖片、ID或名字,人臉驗證系統(tǒng)做的是驗證是否是這個人。做的是1:1的匹配,這種模式最常見的應(yīng)用場景便是人臉解鎖,終端設(shè)備只需將用戶事先注冊的照片與臨場采集的照片做對比,判斷是否為同一人,即可完成身份驗證。
而人臉識別是1:K的。假設(shè)數(shù)據(jù)庫中有K個人的圖片,輸入某個人的圖片,輸出這個人是否與數(shù)據(jù)庫中的圖片匹配或沒有識別。
One-Shot學(xué)習(xí)
人臉識別所面臨的一個挑戰(zhàn)是需要解決一次學(xué)習(xí)問題(one-shot learning problem)。即在大多數(shù)人臉識別應(yīng)用中需要通過單一圖片取識別某個人。
大多數(shù)機器學(xué)習(xí)模型在只有一個樣本進行訓(xùn)練的時候都表現(xiàn)不好。我們來看一個例子,
假設(shè)你要做一個人臉識別門禁系統(tǒng),這里有四個員工。然后來了一個人,叫簡
那么機器需要通過僅有的簡的一張圖片來識別出這個人就是簡,從而打開門
相反,如果來了一個人,并不是數(shù)據(jù)庫中的4個人之一,機器要知道無法識別。
所以O(shè)ne-shot 學(xué)習(xí)問題只能通過一個樣本來進行學(xué)習(xí),以便能夠識別出一個人。
大多數(shù)人臉識別系統(tǒng)都需要解決這個問題,
這樣訓(xùn)練集就很小,這種很小的訓(xùn)練集不足以去訓(xùn)練CNN模型。假設(shè)今天又有一個新員工加入了,那么將有5個員工需要識別,CNN模型的輸出數(shù)也要加1,這需要修改CNN的網(wǎng)絡(luò)結(jié)構(gòu),并且還需要重新訓(xùn)練。
所以為了得到更合理的結(jié)果,現(xiàn)在要做的是學(xué)習(xí)一個相似函數(shù),
d代表兩張圖片的不同程度。
通常可以設(shè)定一個閾值,只要小于這個值,就認為這兩張圖片代表的是同一個人,這樣就可以應(yīng)用于識別任務(wù)。
分別用數(shù)據(jù)庫中的員工去與這張圖片計算“不相似度”,越小說明越相似。通過函數(shù)d(img1,img2)解決了one-shot問題。 如果有新員工加入,只需要把新員工的照片加入數(shù)據(jù)庫,系統(tǒng)依然能正常工作。
現(xiàn)在的問題是如何得到這個函數(shù)d呢
Siamese網(wǎng)絡(luò)
實現(xiàn)函數(shù)d的一個方式是使用Siamese網(wǎng)絡(luò)
假設(shè)有一個這樣的卷積網(wǎng)絡(luò),輸入圖片x(1)x^{(1)}x(1),然后通過一系列卷積、池化和全連接等操作最終得到這樣的特征向量,我們之前學(xué)過的例子是將這個向量喂給softmax單元,得到判斷的類別。 這里我們關(guān)注的是這個向量,假設(shè)它有128個維度,我們給這個向量一個名詞,叫做f(x(1))f(x^{(1)})f(x(1)),可以把它看成是輸入圖像的編碼。
建立一個人臉識別系統(tǒng)的方法是,如果要比較兩張圖片的話,就是分別計算這兩張圖片的編碼。
這里計算編碼用到的是同一個網(wǎng)絡(luò)。
接著就可以用這兩個編碼向量之間差的范數(shù)來表示這兩張圖片的距離。
這種就叫Siamese網(wǎng)絡(luò)架構(gòu)。那么要如何訓(xùn)練這個網(wǎng)絡(luò)呢。這個卷積神經(jīng)網(wǎng)絡(luò)的參數(shù)定義了一個編碼函數(shù)f(xi)f(x^{i})f(xi),所學(xué)習(xí)參數(shù)時,如果兩個圖片中是同一個人,那么兩個編碼的距離就要小:
改變這個網(wǎng)絡(luò)中不同層的參數(shù),就可以得到不同的編碼輸出,編碼的距離也不一樣。所以可以通過反向傳播來學(xué)習(xí)參數(shù),以滿足上面兩個條件。
那如何定義目標函數(shù)呢
Triplet損失
要想通過學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的參數(shù)來得到一個好的編碼,方法之一就是定義三元組(Triplet)損失函數(shù),然后通過梯度下降法來訓(xùn)練。
為了應(yīng)用三元組損失函數(shù),需要比較成對的圖像,比如下面這對圖像。
你想要它們的編碼差異小,因為這是同一個人(吳恩達夫人)。
假如是上面這組圖片,你想要它們的編碼差異大一些,因為是不同的人(難道是吳恩達夫人與丈母娘)。
用三元組損失的術(shù)語來說,你要做的通常是看一個anchor圖片,讓anchor圖片和positive圖片(意味著同一人)的距離很近。
而當anchor圖片和Negative(不同的人)圖片的距離很遠。這就是為什么叫三元組損失,因為需要同時看三張圖片(anchor(A)、positive§和negative(N))。
通過公式表述的話,想要網(wǎng)絡(luò)的參數(shù)(或得到的編碼)滿足一下特征:
為了防止所有的輸出都為零,我們要改變一下這個式子。
不能要這些輸出完全等于零,我們增加了一個超參數(shù)α\alphaα,這樣如果fff輸出都為零的話就不滿足了。這個α\alphaα叫間隔(margin)。
下面就可以來定義損失函數(shù)了,給定3張圖片A,P,NA,P,NA,P,N:
這個maxmaxmax的意思是,只要能使綠線的部分小于等于0,那么損失就是0;反之如果綠線部分大于0,那么損失就是大于零的這個值。
這是一個三元組定義的損失,整個網(wǎng)絡(luò)的代價函數(shù)應(yīng)該是訓(xùn)練集中的所有三元組損失之和:
為了定義三元組的數(shù)據(jù)集,你需要成對的AAA和PPP,所以你需要收集同一個人有多張照片的數(shù)據(jù)集。
那如何選擇樣本組成三元組呢,如果你隨機的選擇A,P,NA,P,NA,P,N,要保證A,PA,PA,P是同一個人,A,NA,NA,N是不同的人。
如果隨機選擇的話,那么這個約束條件很容易被滿足,因為隨機選擇的圖片,AAA和NNN比AAA和PPP差別大的概率很大。
因此要盡可能選擇很難訓(xùn)練的A,P,NA,P,NA,P,N。
也就是選擇的d(A,P)要很接近與d(A,N)。這樣你的算法就會努力使左邊的式子變小,右邊的式子變大。這樣這兩個式子之間就會至少有一個α\alphaα間隔。
在你得到了這樣的數(shù)據(jù)集后
還需要做的是用梯度下降來最小化代價函數(shù)JJJ。
面部驗證與二分類
Triplet損失是學(xué)習(xí)人臉識別卷積網(wǎng)絡(luò)參數(shù)的好方法,這節(jié)我們介紹一下其他的方法。
我們看看如何將人臉識別當成一個二分類問題。
另一個訓(xùn)練神經(jīng)網(wǎng)絡(luò)的方法是選取一個Siamese網(wǎng)絡(luò)(上面其實是同一個網(wǎng)絡(luò),只是表示不同輸入下的輸出),使其同時計算這些特征向量。
然后將這些向量輸入到邏輯回歸單元,來預(yù)測是否為相同的人。
這樣就轉(zhuǎn)換為一個二分類問題??梢杂眠@種方法來替換triplet損失的方法。
那最后的邏輯單元是如何處理的,輸出的y^\hat yy^?為
這里的下標kkk表示特征向量的維度。這里假設(shè)有128維。這是將這兩個向量取元素差的絕對值。
和普通的邏輯回歸一樣,還可以增加權(quán)重參數(shù)和偏置參數(shù)。
這里有一個技巧,
假設(shè)這兩張圖片中有一張是數(shù)據(jù)庫中的圖片,我們不需要每次都重復(fù)將數(shù)據(jù)庫中的圖片喂給這個神經(jīng)網(wǎng)得到編碼,我們只需要計算一次,保存起來即可。 即我們只需要儲存原始圖像對應(yīng)的特征向量。
這樣可以節(jié)省大量的計算,每次只要計算想要識別圖像的編碼即可。
總結(jié)一下,把人臉驗證當成一個監(jiān)督學(xué)習(xí)問題,只要創(chuàng)建一個成對圖片的訓(xùn)練集。
然后使用反向傳播算法去訓(xùn)練Siamese神經(jīng)網(wǎng)絡(luò)。
什么是神經(jīng)風(fēng)格轉(zhuǎn)換
假設(shè)想用右邊的藝術(shù)圖片風(fēng)格來轉(zhuǎn)換左邊的圖片,得到這樣的圖片
神經(jīng)風(fēng)格轉(zhuǎn)換可以完成這件事情。為了更好的描述,這里用CCC表示內(nèi)容(Content)圖像,SSS表示風(fēng)格(Style)圖像,GGG表示生成(Generate)的圖像。
這是另一個例子。
為了實現(xiàn)神經(jīng)風(fēng)格轉(zhuǎn)換,你需要使用卷積網(wǎng)絡(luò)提取特征。
深度卷積網(wǎng)絡(luò)在學(xué)習(xí)什么
深度卷積網(wǎng)絡(luò)到底在學(xué)什么,本節(jié)通過一些可視化的例子來幫助大家了解。
這有助于理解如何實現(xiàn)神經(jīng)風(fēng)格遷移。
假設(shè)你訓(xùn)練了一個網(wǎng)絡(luò),你希望看到不同層之間隱藏單元的計算結(jié)果。
你可以這樣做,從第一層的某個隱藏單元開始,假設(shè)你遍歷了訓(xùn)練集,發(fā)現(xiàn)一些圖片或圖片塊,能最大程度的激活這個單元。
注意到一個特定的單元只能看到圖片中的一小部分,因此下面只畫出了一小塊:
如果你選擇了一個隱藏單元,要找出哪9個輸入圖像塊最大程度的激活了這個單元。你可能找到了上面這樣的9個圖像塊。
可以看到這個單元是在進行邊緣檢測,尋找上圖這9種邊緣。
然后可以選擇零一個隱藏單元,重復(fù)進行上面的步驟。
把第二個隱藏單元關(guān)心的圖像塊加到右邊,它尋找的邊緣線條看起來和第一個的傾斜程度是不同的。
以此類推,假設(shè)最終得到了9個不同的神經(jīng)元的結(jié)果:
現(xiàn)在我們得到了第一層網(wǎng)絡(luò)中某些隱藏單元的結(jié)果,那如何對剩下的所有深層的某些單元做這樣的操作會得到什么呢。
在更深的層中隱藏單元將看到更大一部分圖像,
這是第一層和第二層中某9個單元得到的結(jié)果,
左上角這9個格子里面是讓一個隱藏單元高度激活的九個圖塊,上面這個圖片展示了第2層的9個隱藏單元激活的圖塊。
對于更深層可以重復(fù)這個過程
我們分別放大這些圖片,下面是第二層:
看起來第2層在檢測更加復(fù)雜的形狀和模式,有尋找垂直紋理的,有尋找圓形的,還有尋找非常細的直線的。
那第3層呢
第三層就更加復(fù)雜,有的單元對汽車輪子比較感興趣,有的對人物上半身比較感興趣。
那下一層呢
第4層看起來比第3層還要復(fù)雜,左上角的9個格子好像說的是這個單元已經(jīng)實現(xiàn)了一個狗檢測器了。
我們經(jīng)歷了很長的過程從檢測相對簡單的東西到復(fù)雜的物體,比如從第1層的邊到第2層的紋理,再到更深層中檢測的非常復(fù)雜的物體。
神經(jīng)風(fēng)格轉(zhuǎn)換代價函數(shù)
要構(gòu)建一個神經(jīng)風(fēng)格轉(zhuǎn)換系統(tǒng),需要定義一個生成圖像的代價函數(shù),來判斷生成圖像的好壞。
那么怎么判斷生成圖像的好壞呢,我們把這個函數(shù)定義為兩部分。第一部分稱為內(nèi)容代價,用來度量生成的圖片和內(nèi)容圖片CCC有多相似。第二部分是風(fēng)格代價函數(shù),用來度量圖片GGG的風(fēng)格和圖片SSS有多相似。 最后用兩個超參數(shù)來確定兩部分之間的權(quán)重。
為了生成一個新圖像,接下來要做的是,
隨機初始化生成圖像GGG
使用梯度下降法來最小化J(G)J(G)J(G) ,這一步實際上更新的是圖像的像素值。
舉個例子,這里是想要轉(zhuǎn)換的圖片和藝術(shù)圖片。
假設(shè)第一步隨機生成的是這種像素點:
接下來運行梯度下降法最小化代價函數(shù)JJJ,逐步處理相似度,慢慢得到下面這樣一個圖片:
最后用越來越像的風(fēng)格畫出下面的圖片
下面我們來看下如何定義內(nèi)容代價函數(shù)。
內(nèi)容代價函數(shù)
我們整個代價函數(shù)是這樣的,我們來看下內(nèi)容代價函數(shù)是如何定義的。
假設(shè)你用隱藏層lll來計算內(nèi)容代價,如果lll很小,比如用隱藏層111,這樣這個代價函數(shù)就會使你的生成圖片,像素上非常接近于你的內(nèi)容圖片;如果用很深的層,如我們之前看到的,可能會變成判斷內(nèi)容圖片中是否含有狗。這樣它就會生成一個狗的圖片。
在實際中,我們不會選的太深,也不會選的太淺,通常會選網(wǎng)絡(luò)的中間層。
假設(shè)使用的是一個預(yù)訓(xùn)練的卷積模型。
現(xiàn)在你需要衡量一個內(nèi)容圖片和一個生成圖片它們在內(nèi)容上的相似度。
用a[l](C)a^{[l](C)}a[l](C)和a[l](G)a^{[l](G)}a[l](G)分別表示這兩個圖像lll層的激活值。
如果這兩個激活值很接近,那么就認為這兩張圖像在內(nèi)容上也很接近。
所以可以這樣定義內(nèi)容損失函數(shù):
這是按元素將這兩個激活值的差異平方進行求和。
所以之后你對J(G)J(G)J(G)使用梯度下降法來求GGG,這樣使這個算法找到一個圖像GGG使得這些隱藏層的激活值和你的內(nèi)容圖像比較接近。
下面我們來看看風(fēng)格代價函數(shù)的定義。
風(fēng)格代價函數(shù)
圖片的風(fēng)格是什么意思呢
假設(shè)你使用第lll層的激活值來衡量風(fēng)格。
我們要做的是將風(fēng)格定義為層中不同激活通道之間的相關(guān)系數(shù),假設(shè)選擇了激活層lll,它的激活矩陣是這樣的。
我們想知道的是不同的激活通道間的相關(guān)性有多大,在這個激活矩陣上,我們用不同的顏色來表示不同的通道。
假設(shè)我們有5個通道,我們先看下前兩個通道,即紅色和黃色通道,看這兩個激活通道的相關(guān)性多大,
具體的做法是遍歷這兩個通道對應(yīng)位置的激活值,組成一些成對的數(shù)。然后看當你遍歷所有這些位置,這些成對的數(shù)之間的相關(guān)性有多大。那為什么這能表示風(fēng)格呢
假設(shè)紅色通道對應(yīng)于上圖紅線框出的9個圖像塊,而黃色通道對應(yīng)于黃線框出的9個圖像塊。
相關(guān)系數(shù)描述的是當圖片某處出現(xiàn)紅線框出的這種垂直紋理時,改處同時又是橙色的可能性。
如果我們在通道之間使用相關(guān)系數(shù)來描述通道的風(fēng)格,你能做的就是測量你的生成圖像中,第一個通道是否與第二個通道有關(guān),
通過測量,你能知道在生成的圖像中,垂直紋理和橙色同時或不同時出現(xiàn)的頻率。這樣就能測量生成圖像的風(fēng)格和輸入的風(fēng)格圖像的相似程度。
對于也就是風(fēng)格圖像和生成圖像,你需要計算一個風(fēng)格矩陣,就是用lll層來測量風(fēng)格。
接著我們定義風(fēng)格圖像,設(shè)這個關(guān)于lll層的風(fēng)格圖像GGG如下
這里的kkk和k′k^{\prime}k′表示同一位置不同通道。然后再對生成圖像做同樣的定義
現(xiàn)在要做的就是計算出這張圖像的風(fēng)格矩陣,以便能測量出剛才所說的這些相關(guān)系數(shù)。
最后我們將SSS和GGG的損失函數(shù)定義為,
上圖看不清楚可以看下面這個圖片:
這就是對lll層定義的風(fēng)格代價函數(shù)。
如果你對各層都使用風(fēng)格代價函數(shù),會讓結(jié)果變得更好。
從一維到三維的推廣
我們之前學(xué)過二維卷積,其實類似的思路可以應(yīng)用于一維數(shù)據(jù)。
比如上圖左邊是一個心電圖,每個峰值與心跳相一致 ,比如你想要用心電圖去做醫(yī)學(xué)診斷,你會有一維的數(shù)據(jù)。如上面心電圖下方的數(shù)字所示,這是一個按照時間順序顯示每次電壓的序列。
這種情況下需要與5維的過濾器進行卷積,而不是5×55 \times 55×5的過濾器。
在一維過濾器中,需要用到你的5維過濾器,應(yīng)用到這維信號的每個不同位置。
那3維數(shù)據(jù)是怎樣的呢,假設(shè)接受CT掃描,它可以得到你身體的三維模型的X光掃描。
可以得到人體軀干的不同切面
所以3維數(shù)據(jù)通常除了高度和寬度外還有一個深度:
注意3維圖像中還是會有一個通道數(shù)的,這里假設(shè)是黑白圖片,所以通道數(shù)為1。
另一個可以作為3維數(shù)據(jù)的例子是視頻數(shù)據(jù),不同的幀在視頻中是按時間順序排列的。你可以用來檢測視頻中人的運動。
參考
總結(jié)
以上是生活随笔為你收集整理的吴恩达深度学习——人脸识别与神经风格转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat常用面试题
- 下一篇: 这篇文章太懂程序员了,扎心了