生成對(duì)抗網(wǎng)絡(luò)(GAN)是一個(gè)十分有效的深度學(xué)習(xí)模型,由此衍生了CycleGAN。
先簡(jiǎn)單介紹一下GAN。
GAN——Generative Adversarial Networks
網(wǎng)絡(luò)中有生成器G(generator)和鑒別器(Discriminator)。
有兩個(gè)數(shù)據(jù)域分別為X,Y。G 負(fù)責(zé)把X域中的數(shù)據(jù)拿過(guò)來(lái)拼命地模仿成真實(shí)數(shù)據(jù)并把它們藏在真實(shí)數(shù)據(jù)中,而 D 就拼命地要把偽造數(shù)據(jù)和真實(shí)數(shù)據(jù)分開。經(jīng)過(guò)二者的博弈以后,G 的偽造技術(shù)越來(lái)越厲害,D 的鑒別技術(shù)也越來(lái)越厲害。直到 D 再也分不出數(shù)據(jù)是真實(shí)的還是 G 生成的數(shù)據(jù)的時(shí)候,這個(gè)對(duì)抗的過(guò)程達(dá)到一個(gè)動(dòng)態(tài)的平衡。
傳統(tǒng)的GAN是單向的:
GAN損失
訓(xùn)練這個(gè)單向GAN需要兩個(gè)loss:生成器的重建Loss和判別器的判別Loss。
1.重建Loss:希望生成的圖片Gba(Gab(a))與原圖a盡可能的相似。
2.判別Loss:生成的假圖片和原始真圖片都會(huì)輸入到判別器中。公式為0,1二分類的損失。
CycleGAN
CycleGAN本質(zhì)上是兩個(gè)鏡像對(duì)稱的GAN,構(gòu)成了一個(gè)環(huán)形網(wǎng)絡(luò)。
兩個(gè)GAN共享兩個(gè)生成器,并各自帶一個(gè)判別器,即共有兩個(gè)判別器和兩個(gè)生成器。一個(gè)單向GAN兩個(gè)loss,兩個(gè)即共四個(gè)loss。

論文里最終使用均方誤差損失表示:
CycleGAN的網(wǎng)絡(luò)架構(gòu)如圖所示:


可以實(shí)現(xiàn)無(wú)配對(duì)的兩個(gè)圖片集的訓(xùn)練是CycleGAN與Pixel2Pixel相比的一個(gè)典型優(yōu)點(diǎn)。但是我們?nèi)匀恍枰ㄟ^(guò)訓(xùn)練創(chuàng)建這個(gè)映射來(lái)確保輸入圖像和生成圖像間存在有意義的關(guān)聯(lián),即輸入輸出共享一些特征。
簡(jiǎn)而言之,該模型通過(guò)從域DA獲取輸入圖像,該輸入圖像被傳遞到第一個(gè)生成器GeneratorA→B,其任務(wù)是將來(lái)自域DA的給定圖像轉(zhuǎn)換到目標(biāo)域DB中的圖像。然后這個(gè)新生成的圖像被傳遞到另一個(gè)生成器GeneratorB→A,其任務(wù)是在原始域DA轉(zhuǎn)換回圖像CyclicA,這里可與自動(dòng)編碼器作對(duì)比。這個(gè)輸出圖像必須與原始輸入圖像相似,用來(lái)定義非配對(duì)數(shù)據(jù)集中原來(lái)不存在的有意義映射。
生成器
-
生成器由編碼器、轉(zhuǎn)換器和解碼器構(gòu)成。
生成器結(jié)構(gòu) - 編碼:第一步利用卷積神經(jīng)網(wǎng)絡(luò)從輸入圖象中提取特征。將圖像壓縮成256個(gè)64*64的特征向量。
- 轉(zhuǎn)換:通過(guò)組合圖像的不相近特征,將圖像在DA域中的特征向量轉(zhuǎn)換為DB域中的特征向量。作者使用了6層Reset模塊,每個(gè)Reset模塊是一個(gè)由兩個(gè)卷積層構(gòu)成的神經(jīng)網(wǎng)絡(luò)層,能夠達(dá)到在轉(zhuǎn)換時(shí)同時(shí)保留原始圖像特征的目標(biāo)。
- 解碼:利用反卷積層(decovolution)完成從特征向量中還原出低級(jí)特征的工作,最后得到生成圖像。
鑒別器
鑒別器將一張圖像作為輸入,并嘗試預(yù)測(cè)其為原始圖像或是生成器的輸出圖像。

鑒別器本身屬于卷積網(wǎng)絡(luò),需要從圖像中提取特征,再通過(guò)添加產(chǎn)生一維輸出的卷積層來(lái)確定提取的特征是否屬于特定類別。
man2woman實(shí)驗(yàn)
分別有大約2萬(wàn)張男人與女人的臉作為輸入的訓(xùn)練集。
TensorFlow上CycleGAN的實(shí)現(xiàn)代碼:
https://github.com/vanhuyz/CycleGAN-TensorFlow.git
工具:pycharm+python3.6+TensorFlow
數(shù)據(jù)集
將圖片轉(zhuǎn)換為tfrecords格式
項(xiàng)目中提供了build_data.py腳本,修改訓(xùn)練集的路徑,運(yùn)行即可。
訓(xùn)練
導(dǎo)出模型
對(duì)單張圖片進(jìn)行轉(zhuǎn)換
將data/test.jpg替換為對(duì)應(yīng)的輸入圖片地址
訓(xùn)練時(shí)踩了比較多坑。由于急于看結(jié)果用了比較高的學(xué)習(xí)率。大概迭代五萬(wàn)次的時(shí)候可以有一點(diǎn)能看的結(jié)果,10萬(wàn)次時(shí)多數(shù)還可以接受。但是仍然有許多問(wèn)題,比如戴眼鏡,臉上亮度不均勻,角度奇異等都可能引起生成的圖像中噪聲較大的問(wèn)題。
轉(zhuǎn)換的特征通常為面部五官特征以及膚色亮度等,不包括發(fā)型,因此男女轉(zhuǎn)化之后顯得比較詭異。。
比如

未完待續(xù)。。
