1. 程式人生 > >生成對抗網路GAN系列(六)--- CycleGAN---文末附程式碼

生成對抗網路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。因為成對的影象資料集其實並不多。這裡的XY不要求有什麼較好的關聯性,可以是毫不相干的兩幅影象。

對比關係如下:

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版本的程式碼: