生成對抗網路GAN系列(六)--- CycleGAN---文末附程式碼
Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
Jun-Yan Zhu Taesung Park Phillip Isola Alexei A. Efros
Berkeley AI Research (BAIR) laboratory, UC Berkeley
1.概述
本篇提出的cycleGAN其實也是在做image to image translation,之前已經有較為成功的網路pix2pix了(其實是同一個團隊的人做的),本篇論文的出發點和pix2pix的不同在於:
①pix2pix網路要求提供 image pairs,也即是要提供x和y,整個思路為:從噪聲z,根據條件x,生成和真實圖片y相近的y’。條件x和影象y是具有一定關聯性的!
②而本篇cycleGAN不要求提供pairs,如題目中所說:Unpaired。因為成對的影象資料集其實並不多。這裡的X和Y不要求有什麼較好的關聯性,可以是毫不相干的兩幅影象。
對比關係如下:
2.核心思想
從X生成Y,再從Y生成回X,如此迴圈往復,故名為cycleGAN
3.具體實現
兩個Generator網路:G和F
兩個Discriminator網路,Dx和Dy,如下圖:
①所以Adversarial Loss 有兩部分,
因為是要對兩個D和G進行優化:
②另外還有一個Cycle Consistency Loss,
這個說直白一點,就是希望:從X生成Y’再重新生成的X’,能夠接近X:
此過程得到的稱為forward cycleloss
此過程得到的稱為backward cycleloss
採用的L1損失函式:
總得損失函式就是:
補充!!!!!!
在作者給的程式碼中,還加入了一個identity loss!!!也有兩部分:
詳細點說:
本來我要從X經過G生成fake_Y,
但如果我把Y輸入進G呢?它還是應該生成fake_Y,我們可以稱為fake_Y2;
也就是說,本來生成器G是用來生成Y這種風格的影象的,如果輸入本身就是Y,那麼就更應該生成Y這個影象了,
這就是要讓這個生成器G能夠做到identity mapping,所以可以計算fake_Y2和輸入Y的L1-loss,稱之為identity-loss;
同理,對於生成器F,如果輸入Y,就會生成fake_X;
但如果我把X輸入F,那麼就得到fake_X2,也要讓生成器F具備identity mapping的能力;
計算二者的L1-loss,也是作為identity-loss的一部分
所以總得來說,可以參考如下圖:
4.網路結構
Generator採用的是Perceptual losses for real-time style transfer and super-resolution 一文中的網路結構;
簡而言之,就是一個resblock組成的網路,降取樣部分採用stride 卷積,增取樣部分採用反捲積;
注意採用的是instance normalization
Discriminator採用的仍是pix2pix中的PatchGANs結構,大小為70x70
詳細結構參考程式碼
5.一些實驗細節:
①具體的損失函式採用的不是log而是 least-squares loss,具體來說:
關於採用此損失函式的好處,在我的此係列中第(四)篇博文中講過,即是LSgan
②為了減少震盪,使用歷史生成圖片而不是最新生成圖片來進行D的訓練。具體為快取50張歷史生成影象;
③令λ = 10 ,使用Adam優化,base learning rate = 0.0002. We keep the same learning rate for the first 100 epochs and linearly decay the rate to zero over the next 100 epochs.
6.程式碼:
論文作者寫的pytorch版本的程式碼:
。
。