# CycleGAN論文閱讀
CycleGAN 論文:[(Paper)](https://arxiv.org/pdf/1703.10593.pdf)
CycleGAN Github:[(Github)](https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix)
## Introduction
CycleGAN 是一種將GAN應用於影像風格轉換(Image translation)的非監督式學習演算法。與Pix2Pix不同,CycleGAN的輸入資料不是pair-to-pair的資料,即只要提供兩個不同domain的影像資料,因此CycleGAN演算法可以解決不同domain的成對資料獲取困難的問題。

## Method
CycleGAN演算法是由兩個GAN (即兩個Generator與兩個Discriminator)所組成,如下圖(a)所示,${G}$, ${F}$為Generator;而${Dx}$, ${Dy}$為Discriminator。${G}$的輸入為x domain影像,經過模型後會生成y domain的影像;${F}$的輸入則是y domain影像,經模型後會生成x domain影像;${Dy}$ 為判別經${G}$轉換後的影像${G(x)}$是否屬於y domain;${Dx}$ 則判斷經${F}$轉換後的影像${F(x)}$是否屬於X domain。

### Objective Function
CycleGAN 的目標函數由Adversarial loss, cycle consistency loss, identity loss(可不用) 所組成:

#### Adversarial Loss
GAN的優化函數

#### Cycle consistency loss
計算某個domain影像經過G, F兩生成器轉換後回到原始domain時與原始影像的L1 loss

#### Identity loss
計算影像經G,F轉換後影像與原始影像的L1 loss,目的是為了保持轉換後影像的顏色組成

### 訓練流程

#### Generator
1. x domain 影像由${G}$經過轉換後得到$\hat{Y}$;y domain 影像由${F}$經過轉換後得到$\hat{X}$
2. $\hat{Y}$及$\hat{X}$再分別經過${F}$及${G}$後得到$\hat{x}$及$\hat{y}$
4. 藉由minimize $maxL_{GAN}$及$L_{cyc}$優化${G}$及${F}$

#### Discriminator
1. 輸入x domain影像及$\hat{X}$並以${Dx}$辨別兩者使二者差距越大越好;輸入y domain影像及$\hat{Y}$並以${Dy}$辨別兩者使二者差距越大越好
2. 藉由maximize $L_{GAN}$優化${Dx}$與${Dy}$
### 模型架構
#### Generator
Generator提供兩種不同架構:(1) 包含6層residual blocks (2) 包含9層residual blocks
(1) 架構如下:$c7s1-64$, $d128$, $d256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $u128$, $u64$, $c7s1-3$
(2) 架構如下:$c7s1-64$, $d128$, $d256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $R256$, $u128$, $u64$, $c7s1-3$
* $c7s1-k$ 代表一kernel size=$7x7$; stride=$1$; filter=$k$的 Convolution-InstanceNorm-ReLU層
* $dk$ 代表一kernel size=$3x3$; stride=$2$; filter=$k$的 Convolution-InstanceNorm-ReLU層
* $Rk$ 代表一kernel size=$3x3$; filter=$k$的residual blcok
* $u3$ 代表一kernel size=$3x3$; stride=$0.5$; filter=$k$的fractional-strided-ConvolutionInstanceNorm-ReLU層
* leaky ReLU的斜率均為$0.2$
#### Discriminator
引用70x70的[PatchGAN](https://arxiv.org/pdf/1611.07004.pdf) discriminator架構:C64-C128-C256-C512,Ck為由一kernel size=4x4; stride=2 的 convolution-InstanceNorm-LeakyReLU層所組成,僅有C64例外為convolution-LeakyReLU組成
* leaky ReLU的斜率均為0.2
### Implementation Detail
* Learning rate: $0.0002$; starting linearly decay the rate to zero at $100$ epoch
* Epoch: $200$
* Batch size: $1$
* λ: $10$ (Eq. 3)