卷積神經(jīng)網(wǎng)絡(luò):(二)風(fēng)格遷移——原理部分
引言
本文是在第一步配置完環(huán)境后基礎(chǔ)上運行的。使用的為系統(tǒng)直裝的python環(huán)境(在anaconda環(huán)境下一樣適用,后面注意的點會提示的。)。若想查看環(huán)境配置步驟,請點擊https://blog.csdn.net/weixin_41108515/article/details/103636284,因原理部分篇幅較多,所以將所有代碼,知識部分移到第三篇博客上,若是對于該原理了解熟悉,或只想操作不需深入的,可以直接跳過。所有操作都在第三篇上。
?
轉(zhuǎn)載請注明出處:https://blog.csdn.net/weixin_41108515/article/details/103650964
?
這里引用的是:
http://zh.gluon.ai/chapter_computer-vision/neural-style.html
https://blog.csdn.net/aaronjny/article/details/79681080
這兩篇都非常詳細(xì),并且經(jīng)調(diào)試可以使用。
涉及到的相關(guān)原理:
1、神經(jīng)網(wǎng)絡(luò)部分原理:
1.1 神經(jīng)網(wǎng)絡(luò)基礎(chǔ)介紹
神經(jīng)網(wǎng)絡(luò)基本可以分成兩種:一種為生物神經(jīng)網(wǎng)絡(luò),一種為人工神經(jīng)網(wǎng)絡(luò)。
神經(jīng)網(wǎng)絡(luò)的研究內(nèi)容相當(dāng)廣泛,反映了多學(xué)科交叉技術(shù)領(lǐng)域的特點。主要的研究工作集中在以下幾個方面:
(1)生物原型研究。從生理學(xué)、心理學(xué)、解剖學(xué)、腦科學(xué)、病理學(xué)等生物科學(xué)方面研究神經(jīng)細(xì)胞、神經(jīng)網(wǎng)絡(luò)、神經(jīng)系統(tǒng)的生物原型結(jié)構(gòu)及其功能機理。
(2)建立理論模型。根據(jù)生物原型的研究,建立神經(jīng)元、神經(jīng)網(wǎng)絡(luò)的理論模型。其中包括概念模型、知識模型、物理化學(xué)模型、數(shù)學(xué)模型等。
(3)網(wǎng)絡(luò)模型與算法研究。在理論模型研究的基礎(chǔ)上構(gòu)作具體的神經(jīng)網(wǎng)絡(luò)模型,以實現(xiàn)計算機模擬或準(zhǔn)備制作硬件,包括網(wǎng)絡(luò)學(xué)習(xí)算法的研究。這方面的工作也稱為技術(shù)模型研究。
(4)人工神經(jīng)網(wǎng)絡(luò)應(yīng)用系統(tǒng)。在網(wǎng)絡(luò)模型與算法研究的基礎(chǔ)上,利用人工神經(jīng)網(wǎng)絡(luò)組成實際的應(yīng)用系統(tǒng),例如,完成某種信號處理或模式識別的功能、構(gòu)造專家系統(tǒng)、制成機器人等等。
1.2 卷積神經(jīng)網(wǎng)絡(luò)基本結(jié)構(gòu)
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)是一種前饋神經(jīng)網(wǎng)絡(luò),它的人工神經(jīng)元可以對周圍單元的一部分進(jìn)行響應(yīng),并能很好的處理大型的圖片。卷積神經(jīng)網(wǎng)絡(luò)是近幾年來發(fā)展起來的一種高效的識別方法,并引起了廣泛的關(guān)注[16]。正是由于高效的識別準(zhǔn)確率,對卷積神經(jīng)網(wǎng)絡(luò)的研究才層出不窮。20世紀(jì)60年代,胡貝爾和魏塞爾發(fā)現(xiàn),獨特的網(wǎng)絡(luò)結(jié)構(gòu)可以有效地減少反饋神經(jīng)網(wǎng)絡(luò)在大腦皮層神經(jīng)元研究中的局部敏感性和方向性選擇的復(fù)雜性,從而提出了卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks簡稱CNN)的概念。目前,卷積神經(jīng)網(wǎng)絡(luò)已成為許多科學(xué)領(lǐng)域的熱點話題。由于內(nèi)部算法避免了對圖像進(jìn)行復(fù)雜的預(yù)處理,所以它可以直接輸入原始圖片。
1.2.1 輸入層
卷積神經(jīng)網(wǎng)絡(luò)的輸入層可以處理多維數(shù)據(jù),常見地,一維卷積神經(jīng)網(wǎng)絡(luò)的輸入層接收一維或二維數(shù)組,其中一維數(shù)組通常為時間或頻譜采樣;二維數(shù)組可能包含多個通道;二維卷積神經(jīng)網(wǎng)絡(luò)的輸入層接收二維或三維數(shù)組;三維卷積神經(jīng)網(wǎng)絡(luò)的輸入層接收四維數(shù)組。
1.2.2 隱含層
1.卷積層
(1)卷積層
利用乘法卷積代替矩陣乘法。在圖像處理的過程中,一張“小貓”的圖片可以被看作是一個“薄餅”,它包括圖片的高度、寬度和深度(即顏色的三原色,以RGB表示)。如上圖所示,若權(quán)重不變,把這個上方具有k個輸出的小神經(jīng)網(wǎng)絡(luò)對應(yīng)的小塊滑遍整個圖像,可以得到一個寬度、高度、深度都不同的新圖像。得到的新圖像如下圖所示。
(2)卷積層參數(shù)
卷積層參數(shù)包括卷積核大小、步長和填充,三者共同決定了卷積層輸出特征圖的尺寸,是卷積神經(jīng)網(wǎng)絡(luò)的超參數(shù)。其中卷積核大小可以指定為小于輸入圖像尺寸的任意值,卷積核越大,可提取的輸入特征越復(fù)雜。
卷積步長定義了卷積核相鄰兩次掃過特征圖時位置的距離,卷積步長為1時,卷積核會逐個掃過特征圖的元素,步長為n時會在下一次掃描跳過n-1個像素。
由卷積核的交叉相關(guān)計算可知,隨著卷積層的堆疊,特征圖的尺寸會逐步減小,例如16×16的輸入圖像在經(jīng)過單位步長、無填充的5×5的卷積核后,會輸出12×12的特征圖。為此,填充是在特征圖通過卷積核之前人為增大其尺寸以抵消計算中尺寸收縮影響的方法。常見的填充方法為按0填充和重復(fù)邊界值填充。填充依據(jù)其層數(shù)和目的可分為四類:
有效填充(valid padding):即完全不使用填充,卷積核只允許訪問特征圖中包含完整感受野的位置。輸出的所有像素都是輸入中相同數(shù)量像素的函數(shù)。使用有效填充的卷積被稱為“窄卷積”,窄卷積輸出的特征圖尺寸為(L-f)/s+1。
相同填充/半填充:只進(jìn)行足夠的填充來保持輸出和輸入的特征圖尺寸相同。相同填充下特征圖的尺寸不會縮減但輸入像素中靠近邊界的部分相比于中間部分對于特征圖的影響更小,即存在邊界像素的欠表達(dá)。使用相同填充的卷積被稱為“等長卷積。
全填充:進(jìn)行足夠多的填充使得每個像素在每個方向上被訪問的次數(shù)相同。步長為1時,全填充輸出的特征圖尺寸為L+f-1,大于輸入值。使用全填充的卷積被稱為“寬卷積”。
任意填充:介于有效填充和全填充之間,人為設(shè)定的填充,較少使用。
(3)激勵函數(shù)
一個合適的激勵函數(shù)可以有效地提高卷積神經(jīng)網(wǎng)絡(luò)的運行性能。激活函數(shù)應(yīng)當(dāng)具有的性質(zhì):
1)可微性:當(dāng)優(yōu)化方法是基于梯度的時候,這個性質(zhì)是必不可少的。
2)單調(diào)性:當(dāng)激活函數(shù)為單調(diào)函數(shù)時,能夠確保單層網(wǎng)絡(luò)為凸函數(shù)。
3)輸出值的范圍:當(dāng)激活函數(shù)的輸出值受到限制時,基于梯度的優(yōu)化方法將更加穩(wěn)定,因為特征的表示更受有限權(quán)重的影響。當(dāng)激活函數(shù)的輸出是無限時,模型的訓(xùn)練將更加油效率,但在這種情形下,通常需要較小的學(xué)習(xí)速率。
經(jīng)常使用的非線性激活函數(shù)有sigmid、tanh、Relu等等,前兩者sigmid與tanh在全連接層 比較常見,后者ReLU常見于卷積層。
2.池化層
池化層是卷積神經(jīng)網(wǎng)絡(luò)的一個重要組成部分,它通過減少卷積層之間的連接數(shù)量來降低計算的困難度。包括以下幾種池化:
(1)一般池化(General Pooling)
1)mean-pooling,即只要求鄰域中特征點的平均值;
2)max-pooling,即在鄰域中提取最大特征點;
3)Stochastic-pooling,介于兩者之間,根據(jù)數(shù)值給出像素的概率,并根據(jù)概率進(jìn)行二次采樣。
特征提取的誤差主要來自兩個方面:
1)鄰域大小受限造成的估計值方差增大;
2)卷積層參數(shù)誤差導(dǎo)致估計均值的偏移。
一般來說,mean-pooling能減小第一種誤差并保留圖像的背景信息,max-pooling能減小第二類的錯誤,并保留更多的紋理信息。在平均意義上,與mean-
pooling近似,在局部意義上,則服從max-pooling的準(zhǔn)則。如圖下圖所示,
(2)空間金字塔池化(Spatial pyramid pooling)
一般的卷積神將網(wǎng)絡(luò)都需要輸入圖像的大小是固定的,這是因為全連接層的輸入需要一個固定的維度。幾乎所有作者提出了空間金字塔池化,先讓圖像進(jìn)行卷積,然后變換為要輸入到全連接層的維度,這樣可以把卷積神經(jīng)網(wǎng)絡(luò)擴展到任意大小的圖像。
空間金字塔池化可以把任何尺度的卷積特征轉(zhuǎn)化成同一維,這不僅可以讓卷積神經(jīng)網(wǎng)絡(luò)處理任意大小的圖像,還能避免裁剪和扭曲操作,這具有重要意義。
3.全連接層
卷積神經(jīng)網(wǎng)絡(luò)中的全連接層等價于傳統(tǒng)前饋神經(jīng)網(wǎng)絡(luò)中的隱含層。全連接層通常搭建在卷積神經(jīng)網(wǎng)絡(luò)隱含層的最后部分,并只向其它全連接層傳遞信號。特征圖在全連接層中會失去三維結(jié)構(gòu),被展開為向量并通過激勵函數(shù)傳遞至下一層。
1.2.3 輸出層
卷積神經(jīng)網(wǎng)絡(luò)中輸出層的上游通常是全連接層,因此其結(jié)構(gòu)和工作原理與傳統(tǒng)前饋神經(jīng)網(wǎng)絡(luò)中的輸出層相同。對于圖像分類問題,輸出層使用邏輯函數(shù)或歸一化指數(shù)函數(shù)輸出分類標(biāo)簽。在物體識別問題中,輸出層可設(shè)計為輸出物體的中心標(biāo)、大小和分類。在圖像語義分割中,輸出層直接輸出每個像素的分類結(jié)果。
1.3 卷積神經(jīng)網(wǎng)絡(luò)的卷積過程
卷積神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)有很多種,但是其基本結(jié)構(gòu)是類似的。如下圖,它包含三個主要的層——卷積層(convolutional layer)、池化層(pooling layer)、全連接層(fully-connected layer)。
圖中的卷積網(wǎng)絡(luò)工作流程如下, 輸入圖片是像素是32×32的來組成輸入層。然后,計算流程在卷積和抽樣之間交替進(jìn)行,如下所述:
第一隱藏層進(jìn)行卷積的工作,它由6個特征圖組成,每個特征圖由28×28個神經(jīng)元組成,每個神經(jīng)元指定5×5 的接受域。
第二隱藏層實現(xiàn)子采樣和局部平均,它同樣由 6個特征圖組成,但其每個特征圖由14×14 個神經(jīng)元組成。每個神經(jīng)元具有2×2 的接受域。
第三隱藏層進(jìn)行第二次卷積,它由 16個特征圖組成,每個特征圖由 10×10個神經(jīng)元組成。隱藏層中的每個神經(jīng)元可以具有與下一隱藏層的多個特征圖相關(guān)聯(lián)的突觸連接,其操作方式類似于第一層隱藏層的卷積過程。
第四個隱藏層進(jìn)行第二次子采樣和局部平均計算。它由 16個特征圖組成,但每個特征圖由 5×5個神經(jīng)元構(gòu)成,它以與第一次采樣相同的方式進(jìn)行工作。
第五個隱藏層實現(xiàn)了卷積的最后階段,它由 120個神經(jīng)元組成,每個神經(jīng)元指定5×5 的接受域。
端部是個全連接層,得到輸出向量。
卷積和采樣之間的計算層的連續(xù)交替是“雙尖塔”的結(jié)果,即在每個卷積或采樣層中,與先前的層相比,特征圖的數(shù)目隨著空間分辨率的減小而增加[17]。
卷積層研究輸入數(shù)據(jù)的特征。卷積層由卷積核(convolutional kernel)組成,卷積核用來計算不同的特征圖;激勵函數(shù)(activation function)給卷積神經(jīng)網(wǎng)絡(luò)引入了非線性,常用的有sigmid、tanh、 ReLU函數(shù);池化層減少了卷積層輸出的特征向量,改良結(jié)果(使結(jié)構(gòu)不易過擬合),典型應(yīng)用有average pooling 和 max pooling;全連接層將卷積層和池化層組合起來以后,然后可以形成層或多層全連接層,從而可以完成更高水平的特征取得。
2、遷移學(xué)習(xí)相關(guān)原理
2.1 遷移學(xué)習(xí)
在深度學(xué)習(xí)中,所謂的遷移學(xué)習(xí)是將一個問題A上訓(xùn)練好的模型通過簡單的調(diào)整使其適應(yīng)一個新的問題B。在實際使用中,往往是完成問題A的訓(xùn)練出的模型有更完善的數(shù)據(jù),而問題B的數(shù)據(jù)量偏小。而調(diào)整的過程根據(jù)現(xiàn)實情況決定,可以選擇保留前幾層卷積層的權(quán)重,以保留低級特征的提?。灰部梢员A羧康哪P?,只根據(jù)新的任務(wù)改變其fc層。被遷移的模型往往是使用大量樣本訓(xùn)練出來的,比如Google提供的Inception V3網(wǎng)絡(luò)模型使用ImageNet數(shù)據(jù)集訓(xùn)練,而ImageNet中有120萬標(biāo)注圖片,然后在實際應(yīng)用中,很難收集到如此多的樣本數(shù)據(jù)。而且收集的過程需要消耗大量的人力無力,所以一般情況下來說,問題B的數(shù)據(jù)量是較少的。所以,同樣一個模型在使用大樣本很好的解決了問題A,那么有理由相信該模型中訓(xùn)練處的權(quán)重參數(shù)能夠很好的完成特征提取任務(wù)。遷移學(xué)習(xí)具有如下優(yōu)勢:更短的訓(xùn)練時間,更快的收斂速度,更精準(zhǔn)的權(quán)重參數(shù)。但是一般情況下如果任務(wù)B的數(shù)據(jù)量是足夠的,那么遷移來的模型效果會不如訓(xùn)練的到,但是此時起碼可以將底層的權(quán)重參數(shù)作為初始值來重新訓(xùn)練。
2.2TensorFlow
TensorFlow是谷歌基于DistBelief進(jìn)行研發(fā)的第二代人工智能學(xué)習(xí)系統(tǒng)。Tensor(張量)意味著N維數(shù)組,F(xiàn)low(流)意味著基于數(shù)據(jù)流圖的計算,TensorFlow為張量從流圖的一端流動到另一端計算過程。TensorFlow是將復(fù)雜的數(shù)據(jù)傳遞到人工智能神經(jīng)網(wǎng)絡(luò)進(jìn)行處理和分析的系統(tǒng)。
TensorFlow 表達(dá)了高層次的機器學(xué)習(xí)計算,大幅簡化了第一代系統(tǒng),并且具備更好的靈活性和可延展性。TensorFlow一大亮點是支持異構(gòu)設(shè)備分布式計算,它能夠在各個平臺上自動運行模型,從手機、單個CPU / GPU到成百上千GPU卡組成的分布式系。TensorFlow支持CNN、RNN和LSTM算法,這都是目前在Image,Speech和NLP最流行的深度神經(jīng)網(wǎng)絡(luò)模型。
TensorFlow可被用于像機器學(xué)習(xí)和深度學(xué)習(xí)的許多領(lǐng)域,如語音識別或者是圖像處理,以及對深度學(xué)習(xí)的基礎(chǔ)設(shè)施的各個方面進(jìn)行改進(jìn)。它能夠運行在小到一個只能電話或數(shù)以百萬計的CEN上。TensorFlow將是完全開源的,可以被任何人使用。這也是選擇TensorFlow這個平臺的主要原因。
(1)支持多種硬件的平臺
例如,它支持CPU、GPU混合數(shù)據(jù)中心的訓(xùn)練平臺,并且還支持?jǐn)?shù)據(jù)中心的訓(xùn)練模型,它相對方便地部署到不同的移動端應(yīng)用程序,并且可以支持由谷歌自主開發(fā)的TPU處理器。這種多硬件支持平臺會大大給用戶帶來方便。
(2)支持多種開發(fā)環(huán)境
支持各種硬件的平臺是基礎(chǔ),也是TensorFlow始終能夠幫助盡可能多的開發(fā)人員利用深度學(xué)習(xí)技術(shù)并最終受益于廣大用戶的原因?;谶@一思想,TensorFlow一直都非常重視各種程序員開發(fā)環(huán)境。例如,開發(fā)人員可以在各式各樣的、位于主要的位置的開發(fā)環(huán)境中使用TensorFlow環(huán)境。
目前TensorFlow仍處于快速開發(fā)迭代中,有大量新功能及性能優(yōu)化在次持續(xù)研發(fā)。
2.3VGG卷積神經(jīng)網(wǎng)絡(luò)模型
VGG全稱是Visual Geometry Group屬于牛津大學(xué)科學(xué)工程系,其發(fā)布了一些列以VGG開頭的卷積網(wǎng)絡(luò)模型,可以應(yīng)用在人臉識別、圖像分類等方面,分別從VGG16~VGG19[20]。VGG研究卷積網(wǎng)絡(luò)深度的初衷是想搞清楚卷積網(wǎng)絡(luò)深度是如何影響大規(guī)模圖像分類與識別的精度和準(zhǔn)確率的,最初是VGG-16號稱非常深的卷積網(wǎng)絡(luò)全稱為(GG-Very-Deep-16 CNN),VGG在加深網(wǎng)絡(luò)層數(shù)同時為了避免參數(shù)過多,在所有層都采用3x3的小卷積核,卷積層步長被設(shè)置為1。VGG的輸入被設(shè)置為224x244大小的RGB圖像,在訓(xùn)練集圖像上對所有圖像計算RGB均值,然后把圖像作為輸入傳入VGG卷積網(wǎng)絡(luò),使用3x3或者1x1的filter,卷積步長被固定1。VGG全連接層有3層,根據(jù)卷積層+全連接層總數(shù)目的不同可以從VGG11 ~ VGG19,最少的VGG11有8個卷積層與3個全連接層,最多的VGG19有16個卷積層+3個全連接層,此外VGG網(wǎng)絡(luò)并不是在每個卷積層后面跟上一個池化層,還是總數(shù)5個池化層,分布在不同的卷積層之下,下圖是VGG11 ~GVV19的結(jié)構(gòu)圖:
在圖中,A列是最基本的模型,有8個卷積層,3個全連接層,一共11層。B列是在A列的基礎(chǔ)上,在stage1和stage2基礎(chǔ)上分別增加了一層33卷積層,一共13層。C列是在B的基礎(chǔ)上,在stage3,stage4和stage5基礎(chǔ)上分別增加了一層11的卷積層。一共16層。D列是在B的基礎(chǔ)上,在stage3,stage4和stage5基礎(chǔ)上分別增加了一層33的卷積層,一共16層。E層是在D的基礎(chǔ)上,在stage3,stage4和stage5基礎(chǔ)上分別增加33的卷積層,一共19層。模型E就是VGG19網(wǎng)絡(luò)。
3、通過VGG實現(xiàn)風(fēng)格遷移
3.1 圖像風(fēng)格遷移的原理
VGGNET是一種圖像識別模型,它也擁有者卷積層和全連接層??梢赃@樣理解VGG的結(jié)構(gòu):前面的卷積層是從圖像中提取“特征”,而后面的全連接層把圖片的“特征”轉(zhuǎn)換為類別概率。其中VGGNET中的淺層(conv1_1,conv1_2 ),提取的特征往往是比較簡單的(比如提取檢測點、線、亮度),VGGNET中的深層(c比如onv5_1,conv5_2),提取的特征往往比較復(fù)雜(如是否存在人臉、某種特定物體)。
VGGNET的本意是輸入圖像,提取特征,然后輸出圖像類別。圖像風(fēng)格遷移恰好與其相反,輸入特征,之后輸出對應(yīng)這種特征的圖片。兩種過程的對比圖片如下圖所示:
具體來說,風(fēng)格遷移使用卷積層的中間特征還原出對應(yīng)這種特征的原始圖像。具體過程就是:先選取一副原始圖像,經(jīng)過VGGNET計算后得到各個卷積層的特征。之后,根據(jù)這些卷積層的特征,還原出對應(yīng)這種特征的原始圖像.研究發(fā)現(xiàn):淺層的還原效果往往比較好,卷積特征基本保留了所有原始圖像中形狀、位置、顏色、紋理等信息;深層對應(yīng)的還原圖像丟失了部分顏色和紋理信息,但大體保留原始圖像中物體的形狀和位置。
3.2 代價函數(shù)
要構(gòu)建一個神經(jīng)風(fēng)格遷移系統(tǒng),首先需要為生成的圖像定義一個代價函數(shù),通過最小化代價函數(shù),可以大大縮短圖片生成所需要的時間。為了實現(xiàn)神經(jīng)風(fēng)格遷移,需要定義一個關(guān)于G的代價函數(shù),J用來評判某個生成圖像的好壞,我們將使用梯度下降法去最小化J(G),以便于生成這個圖像。那么如何去判斷生成圖像的好壞,在這里把這個代價函數(shù)定義為兩個部分。
Jcontent(C,G)
第一部分被稱作內(nèi)容代價,這是一個關(guān)于內(nèi)容圖片和生成圖片的函數(shù),它是用來度量生成圖片G的內(nèi)容與內(nèi)容圖片C的內(nèi)容有多相似。
Jstyle(S,G)
然后會把結(jié)果加上一個風(fēng)格代價函數(shù),也就是關(guān)于S和G的函數(shù),用來度量圖片G的風(fēng)格和圖片S的風(fēng)格的相似度。
J(G)=αJcontent(C,G)+βJstyle(S,G)
最后用兩個超參數(shù)α和β來來確定內(nèi)容代價和風(fēng)格代價,兩者之間的權(quán)重用兩個超參數(shù)來確定。
3.3 內(nèi)容代價函數(shù)
風(fēng)格遷移網(wǎng)絡(luò)的代價函數(shù)有一個內(nèi)容代價部分,還有一個風(fēng)格代價部分。
首先定義內(nèi)容代價部分。
用隱含層m來計算內(nèi)容代價,如果m是個很小的數(shù),比如用隱含層 1,這個代價函數(shù)就會使生成圖片像素上非常接近內(nèi)容圖片。然而如果使用很深的層,那么可能在內(nèi)容圖片里面有一個具體的物體,在生成的圖片里就會存在這個物體。比如是一只小貓,那么在生成的圖片里就一定會有一個小貓。所以在實際中,這個層m在網(wǎng)絡(luò)中既不會選的太淺也不會選的太深。通常??會選擇在網(wǎng)絡(luò)的中間層,既不太淺也不很深,然后用一個預(yù)訓(xùn)練的卷積模型,本篇論文使用的是 VGG 網(wǎng)絡(luò)。
之后需要衡量假如有一個內(nèi)容圖片和一個生成圖片他們在內(nèi)容上的相似度,令這個代表這兩個圖片α([L][C])和α([L][G])的l層的激活函數(shù)值。如果這兩個激活值相似,那么就意味著兩個圖片的內(nèi)容相似。

為兩個激活值不同或者相似的程度,取l層的隱含單元的激活值,按元素相減,內(nèi)容圖片的激活值與生成圖片相比較,然后取平方,也可以在前面加上歸一化或者不加,比如1/2或者其他的,都影響不大,因為這都可以由這個超參數(shù)α來調(diào)整。
3.4 風(fēng)格代價函數(shù)
圖像的風(fēng)格可以用使用圖像的卷積層特征的Gram矩陣來進(jìn)行表示。在線性代數(shù)中這種矩陣被稱為Gram矩陣,在這里可以稱之為風(fēng)格矩陣。
風(fēng)格矩陣是一組向量的內(nèi)積對稱矩陣,比如向量組

的Gram矩陣是

取內(nèi)積即歐幾里得空間上的標(biāo)準(zhǔn)內(nèi)積,即

假設(shè)卷積層的輸出為F_ij^l,那么這個卷積特征對應(yīng)的Gram矩陣的第i行第j個元素定義為

設(shè)在第l層中,卷積特征的通道數(shù)為N_l,卷積的高、寬乘積數(shù)為M_l,那么F_ij^l滿足
l≤i≤N_l,l≤j≤M_l
Gram矩陣在一定程度上可以體現(xiàn)圖片的風(fēng)格。多層的風(fēng)格損失是單層風(fēng)格損失的加權(quán)累加。
3.5 模型訓(xùn)練過程
首先,使用VGG中的一些層的輸出來表示圖片的內(nèi)容特征和風(fēng)格特征。
使用[‘conv4_2’,’conv5_2’]表示內(nèi)容特征,使用[‘conv1_1’,’conv2_1’,’conv3_1’,’conv4_1’]表示風(fēng)格特征。
將內(nèi)容圖片輸入網(wǎng)絡(luò),計算內(nèi)容圖片在網(wǎng)絡(luò)指定層上的輸出值。
計算內(nèi)容損失??梢赃@樣定義內(nèi)容損失:內(nèi)容圖片在指定層上提取出的特征矩陣,與噪聲圖片在對應(yīng)層上的特征矩陣的差值的L2范數(shù)。即求兩兩之間的像素差值的平方。
對應(yīng)每一層的內(nèi)容損失函數(shù):

其中,X是噪聲圖片的特征矩陣,P是內(nèi)容圖片的特征矩陣。M是P的長*寬,N是信道數(shù)。最終的內(nèi)容損失為,每一層的內(nèi)容損失加權(quán)和,再對層數(shù)取平均。
將風(fēng)格圖片輸入網(wǎng)絡(luò),計算風(fēng)格圖片在網(wǎng)絡(luò)指定層上的輸出值。
計算風(fēng)格損失。使用風(fēng)格圖像在指定層上的特征矩陣的GRAM矩陣來衡量其風(fēng)格,風(fēng)格損失可以定義為風(fēng)格圖像和噪音圖像特征矩陣的格萊姆矩陣的差值的L2范數(shù)。
對于每一層的風(fēng)格損失函數(shù):

其中M是特征矩陣的長*寬,N是特征矩陣的信道數(shù)。G為噪音圖像特征的Gram矩陣,A為風(fēng)格圖片特征的GRAM矩陣。
最終的風(fēng)格損失為,每一層的風(fēng)格損失加權(quán)和,再對層數(shù)取平均。
函數(shù)為內(nèi)容損失和風(fēng)格損失的加權(quán)和:

當(dāng)訓(xùn)練開始時,根據(jù)內(nèi)容圖片和噪聲,生成一張噪聲圖片。并將噪聲圖片傳送給網(wǎng)絡(luò),計算loss,再根據(jù)loss調(diào)整噪聲圖片。將調(diào)整后的圖片發(fā)給網(wǎng)絡(luò),重新計算loss,再調(diào)整,再計算,直到達(dá)到指定迭代次數(shù),這時,噪聲圖片已兼具內(nèi)容圖片的內(nèi)容和風(fēng)格圖片的風(fēng)格,進(jìn)行保存即可,其訓(xùn)練過程如圖下所示,訓(xùn)練順序依次從左向右。