1 GAN & Cycle GAN
Ian Goodfellow 在2014年提出了原始的GAN模型,我这篇博客有初步介绍 $\rightarrow$ GAN Notes。
Cycle GAN是2017年ICCV上的一篇文章,以GAN为基础来实现图像的风格迁移,表现非常惊艳。
论文标题:Unpaired image-to-image translation using cycle-consistent adversarial networks.
Github项目主页:Cycle GAN。
2 Motivation
原始GAN学习到的是随机噪声分布$Z$到真实数据分布$X$的映射:$G(z)\approx x$。
但GAN模型所生成的数据是不可控的,以MINIST数据集为例,GAN无法生成指定label的数字图片。
那么,如果将label作为条件信息也加入模型进行训练呢?这个思路就是 conditional GAN。
具体到图像风格迁移,基于conditional GAN的pix2pix已经可以完成这项任务,但代价是训练样本必须是两两配对的。
Cycle GAN对pix2pix的改进是解决了对训练样本的限制,即不需要两个domain的样本是两两配对的。
以上就是Cycle GAN这个工作的意义。
3 How?
3.1 基础架构
-
$X$:来自domain $X$的数据;
-
$Y$:来自domain $Y$的数据;
-
$G(X)$:生成器,用来自$X$的数据仿造$Y$;
-
$D_Y$:判别器,判定数据来自$Y$的概率;
-
$F(Y)$:生成器,用来自$Y$的数据仿造$X$;
-
$D_X$:判别器,判定数据来自$X$的概率;
需要注意,原始GAN以随机噪声作为生成器的输入。
而Cycle GAN生成器的输入是另一个域的数据,因此不再需要随机噪声。
3.2 思路
Cycle GAN的解决方案很简单,一个GAN不行,我两个GAN行不行?
直观上,Cycle GAN就是训练两个GAN模型构成一个循环。
第一个GAN的生成器负责学习 $X\rightarrow Y$,第二个GAN的生成器负责学习 $Y\rightarrow X$。
然后保证数据在这个循环前后的一致性:$x\rightarrow G(x)\rightarrow F(G(x))\approx x$,$y\rightarrow F(y)\rightarrow G(F(y))\approx y$。
3.3 损失函数
对两个domain的数据${{X,Y}}$,学习过程分别是对称的两个循环:$F(G(x))\approx x$,$G(F(y))\approx y$。
这两个循环的损失函数定义为 cycle consistency loss,即循环一致性损失:
\[L_{cyc}(G,F)=E_{x\sim p_{data}(x)}[\Vert F(G(x))-x\Vert_1]+E_{y\sim p_{data}(y)}[\Vert G(F(y))-y\Vert_1]\tag{1}\]所以模型最终的Loss是两个GAN的Loss + 两个循环的Loss。 \(L(G,F,D_X,D_Y)=L_{GAN}(G,D_Y)+L_{GAN}(F,D_X)+L_{cyc}(G,F)\tag{2}\)
3.4 two details
-
GAN的损失函数,用OLS取代MLE(即假设了误差服从高斯分布)。
原始GAN的优化目标: \(\min_G \max_DV(D,G)=E_{x\sim p_r}[\log D(x)]+E_{x\sim p_g}[\log(1-D(x)]\tag{3}\) Cycle GAN的MSE loss: \(L_{GAN}(G,D_Y)=E_{x\sim p_r}[(1-D(x))^2]+E_{x\sim p_g}[D(x)^2]\tag{4}\)
-
使用有时延的$G(x)$来更新判别器。
4 Cycle GAN in PyTorch
作者公布了Cycle GAN的PyTorch源码,Github项目主页在此 $\rightarrow$ のPytorch Cycle GAN。
需要安装的两个额外库依赖
pip install dominate
pip install visdom
下载数据集
bash ./datasets/download_cyclegan_dataset.sh vangogh2photo
train & test,参数设定及说明见 options 文件夹
# train
python -m visdom.server
python train.py --dataroot ./datasets/vangogh2photo --name vangoph_cyclegan --model cycle_gan --gpu_ids 0,1 --batch_size 8 --display_id -1
# test
python test.py --dataroot ./datasets/vangogh2photo --name vangoph_cyclegan --model cycle_gan --gpu_ids 0,1
TBC
5 無駄無駄
このジョルノ・ジョバァーナには夢がある!