介绍
CycleGAN是2018年发表于ICCV17的一篇论文,可以让2个图片相互转化,也就是风格迁移,如马变为斑马,斑马变为马。
网络结构
CycleGAN总结构有4个网络,第一个为生成网络G:X—>Y;第二个网络为生成网络F:X—>Y。第三个网络为对抗网络命名为Dx,鉴别输入图像是否为X;第四个网络为对抗网络命名为Dy,鉴别输入图像是不是Y。如图,以马(X)和斑马(Y)为例,G网络将马的图像转化为斑马图像;F网络将斑马的图像转化为马的图像;Dx网络鉴别输入的图像是不是马;Dy网络鉴别输入图像是不是斑马。这4个网络仅有2个网络结构,即G和F都是生成网络,这两者的网络结构相同,Dx和Dy都是对抗性网络,这两者的网络结构相同。
Generator-生成网络
以上网络主要有3种操作,卷积,反卷积和残差模块;卷积和反卷积后通常还有BN,**函数等。
卷积
反卷积
残差模块
残差网络最先是在ResNet中引出的可以有效的避免梯度消失,实现网络深度的提升。
Discriminator-对抗网络
卷积后面通道都有BN层和**函数,另外Discriminator的最终输出并不是0.0-1。0间的值,而是一个1616的矩阵,因此定义了这个1616矩阵的各个元素越接近0.9,则Loss越小,即是真值的概率越大。
Loss
G_loss
网络G的loss函数,由2部分组成,分别是cycle_loss和g_loss。
- cycle_loss:G(x)生成了y’,F(G(x))即是生成的x’,则F(G(x))-x的绝对值的均值定为loss_x;F(y)生成x’,G(F(y))生成y’,则G(F(y))-y的绝对值的均值定为loss_y;cycle_loss=loss_x+loss_y;
- g_loss:G(x)是y’,则Dy(y’)每个元素减去0.9取平方,然后取平方均值定义为g_loss;
G_loss=cycle_loss+g_loss;
Dy_loss
网络Dy的loss函数,由2部分组成,分别是loss_real_y和loss_fake_y;
- loss_real_y:Dy(y)是一个16x16矩阵,每个元素减去0.9后取平方,则各平方均值定义为loss_real_y;
- loss_fake_y:G(x)生成一个y’,则Dy(G(x))相当于Dy(y’),也是一个16x16矩阵,矩阵每个元素取平方,则各平方均值定义为loss_fake_y;
Dy_loss=loss_real_y+loss_fake_y;
F_loss
网络F的Loss函数,由2部分组成,分别是cycle_loss和f_loss;
- cycle_loss同G_loss中的定义
- f_loss:F(y)生成一个x’,Dx(x’)即Dx(F(y))是一个16x16的矩阵,每个元素减去0.9后取平方,各平方均值定义为f_loss;
F_loss=cycle_Loss+f_loss;
Dx_loss
网络Dx的loss函数,由两部分组成,分别是loss_real_x和loss_fake_x;
- loss_real_x:Dx(x)是一个16x16矩阵,每个元素减去0.9后取平方,则各平方均值定义为loss_real_x;
- loss_fake_x:F(y)生成一个x’,则Dx(F(y))相当于Dx(x’),也是一个16x16矩阵,矩阵每个元素取平方,则各平方均值定义为loss_fake_x;
Dx_loss= loss_real_x+ loss_fake_x;
训练
最小化[G_loss,Dy_loss,F_loss,Dx_loss]变量,实现网络优化训练。