当前位置:   article > 正文

CycleGAN网络详解_cyclegan网络结构

cyclegan网络结构

注:CycleGAN的生成器和判别器结构大家都没有去详细介绍,这里我给补充一下哦
模型损失中与模型中存在差异,根据源码进行补充的,大家多注意一下哦

简介

[论文下载地址] [https://arxiv.org/abs/1703.10593]

前言

CycleGan是一种实现图像风格转换功能的GAN网络。早在它出现之前就存在着Pix2Pix实现图像风格转换,但pip2pip具有很大的局限性,主要是针对两种风格图像要对应出现,而现实中很难找到一些风格不同相同图像,也能难去拍摄获得,于是CycleGan就实现这个功能,在两种类型图像之间进行转换,而不需要对应关系,非常强大和实用!!!

这也属于是无配对数据(unpaired)产生的图片,也就是说你有一些名人名家的作品,也有一些你想转换风格的真实图片,这两种图片是没有任何交集的。在之前的文章(用AI增强人类想象力)中提到的Pix2Pix方法的关键是提供了在这两个域中有相同数据的训练样本。CycleGAN的创新点在于能够在源域和目标域之间,无须建立训练数据间一对一的映射,就可实现这种迁移
在这里插入图片描述
想要做到这点,有两个比较重要的点,第一个就是双判别器。如下图a所示,两个分布X,Y,生成器G,F分别是X到Y和Y到X的映射,两个判别器Dx,Dy可以对转换后的图片进行判别。第二个点就是cycle-consistency loss,用数据集中其他的图来检验生成器,这是防止G和F过拟合,比如想把一个小狗照片转化成梵高风格,如果没有cycle-consistency loss,生成器可能会生成一张梵高真实画作来骗过Dx,而无视输入的小狗。
在这里插入图片描述

生成器和判别器结构

下图是我根据相应的代码绘制的生成器的结构图,可以很好的看出生成器的结构还是比较简单的,主要分为编码器结构,其中,解码器采用了CIL(卷积,IN正则化、Leaky ReLU激活函数),另外使用了图像增强(ReflectionPad2d,这是将图像沿着边缘上下左右进行对称,增大图像的分辨率)的方式。在两个结构链接区域使用Residual block模块,默认是9个重复模块,将数据进行恢复增强。编码器部分使用反卷积、IN标准化、ReLU激活函数去恢复图像的大小,最后通过ReflectionPad2d将图像分辨率提升,通过卷积恢复到图像原大小,有效的解决对象边缘信息。
在这里插入图片描述
下图原版判别器是采用patchGAN结构的判别器,该判别器的重点是输出结构为NxN的矩阵进行比较,这种产生了全局比较的概念,考虑了全局感受野信息的差别。
在这里插入图片描述

注:下图是PatchGAN简化版,直接简化为一个判别,判别器结构很简单,直接一个链式结构,进行变换,最后展平成(b,1)结构,这是第二个github链接的判别器
在这里插入图片描述

网络下载

github链接:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
这是论文原作者的,里面含有两个模型cyclegan和pix2pix,基于Pytorch实现的。
根据作者的要求配置好环境,并且设置好运行代码即可运行,效果还可以?其实这主要是取决于风格之间转换的复杂程度,过于复杂转换的效果就会差一点,简单的,效果就会好一点。

上述模型看起来是比较复杂的,这里我提供一个复现的github链接会相对好理解很多
https://github.com/aitorzip/PyTorch-CycleGAN
上述的模型网络结构也是我根据代码进行绘制的,有问题请提出,我及时改正哦

模型损失

生成器和判别器的loss函数和GAN是一样的,判别器D尽力检测出生成器G产生的假图片,生成器尽力生成图片骗过判别器

对抗loss:

两部分组成:
在这里插入图片描述
L G A N ( G , D Y , X , Y ) = E y   p d a t a ( y ) [ D Y ( y ) ] 2 + E x   p d a t a ( x ) [ D Y ( G ( x ) ) − 1 n ∗ n ] 2 L_{GAN}(G,D_Y,X,Y) = E_{y~p_{data(y)}}[D_Y(y)]^2 + E_{x~p_{data(x)}}[D_Y(G(x))-1_{n*n}]^2 LGAN(G,DY,X,Y)=Ey pdata(y)[DY(y)]2+Ex pdata(x)[DY(G(x))1nn]2

D Y D_Y DY生成的是矩阵,所以这里对比的是矩阵,使用MSE损失计算loss

以及
在这里插入图片描述

Cycle Consistency 损失

作者说:理论上,对抗训练可以学习映射输出G和F,它们分别作为目标域Y和X产生相同的分布。然而,具有足够大的容量,网络可以将相同的输入图像集合映射到目标域中的任何图像的随机排列。因此,单独的对抗性loss不能保证可以映射单个输入。需要另外来一个loss,保证G和F不仅能满足各自的判别器,还能应用于其他图片。也就是说,G和F可能合伙偷懒骗人,给G一个图,G偷偷把小狗变成梵高自画像,F再把梵高自画像变成输入。Cycle Consistency loss的到来制止了这种投机取巧的行为,他用梵高其他的画作测试FG,用另外真实照片测试GF,看看能否变回到原来的样子,这样保证了GF在整个X,Y分布区间的普适性。
在这里插入图片描述
整体:

所以,整个loss就是下面的式子,就像训练两个auoto-encoder一样
在这里插入图片描述
注意两个细节:

  1. 对抗损失使用的损失函数为BCELoss
    在这里插入图片描述
    作者训练对抗损失时没有使用BCELoss(二分类交叉熵损失函数),而使用的时MSE(均方根误差),作者解释均方根误差的训练效果更好

  2. 论文中没有写identity损失,但是源码中是体现了Identity损失的,这个损失主要是训练网络的识别能力,表示为 A t o B ( r e a l B ) AtoB(real_B) AtoB(realB),解释一下,就是将真实的B输入到A生成B的判别器中,查看判别器的识别损失,希望越小越好!说明生成器网络真正的理解了B的结构。同理也存在 B t o A ( r e a l A ) BtoA(real_A) BtoA(realA)
    L i d e n t i t y = E y   p d a t a ( y ) [ ∣ ∣ D Y ( G ( y ) ) − y ∣ ∣ 1 ] + E x   p d a t a ( x ) [ ∣ ∣ D X ( G ( x ) ) − x ∣ ∣ 1 ] L_{identity} = E_{y~p_{data(y)}}[||D_Y(G(y))-y||_1]+E_{x~p_{data(x)}}[||D_X(G(x))-x||_1] Lidentity=Ey pdata(y)[∣∣DY(G(y))y1]+Ex pdata(x)[∣∣DX(G(x))x1]
    准确的说,
    L o s s = L G A N ( G , D Y , X , Y ) + L G A N ( G , D X , Y , X , ) + L c y c + L i d e n t i t y Loss = L_{GAN}(G,D_Y,X,Y) + L_{GAN}(G,D_X,Y,X,)+L_{cyc} + L_{identity} Loss=LGAN(G,DY,X,Y)+LGAN(G,DX,Y,X,)+Lcyc+Lidentity

看完源码后,总结一下Loss实现:
L G A N = 1 2 ∗ E x − p d a t a ( x ) [ D Y ( G ( X ) ) − 1 ] 2 + 1 2 ∗ E y − p d a t a ( y ) [ D X ( F ( Y ) ) − 1 ] 2 L_{GAN} = \frac{1}{2}*E_{x-p_{data}(x)}[D_Y(G(X))-1]^2+\frac{1}{2}*E_{y-p_{data}(y)}[D_X(F(Y))-1]^2 LGAN=21Expdata(x)[DY(G(X))1]2+21Eypdata(y)[DX(F(Y))1]2
L c y c l e = E x − p d a t a ( x ) [ ∣ ∣ F ( G ( X ) ) − X ∣ ∣ 1 ] + E y − p d a t a ( y ) [ ∣ ∣ G ( F ( Y ) ) − Y ∣ ∣ 1 ] L_{cycle}=E_{x-p_{data}(x)}[||F(G(X))-X||_1]+E_{y-p_{data}(y)}[||G(F(Y))-Y||_1] Lcycle=Expdata(x)[∣∣F(G(X))X1]+Eypdata(y)[∣∣G(F(Y))Y1]
L i d e n t i t y = E x − p d a t a ( x ) [ ∣ ∣ F ( X ) − X ∣ ∣ 1 ] + E y − p d a t a ( y ) [ ∣ ∣ G ( Y ) − Y ∣ ∣ 1 ] L_{identity}=E_{x-p_{data}(x)}[||F(X)-X||_1]+E_{y-p_{data}(y)}[||G(Y)-Y||_1] Lidentity=Expdata(x)[∣∣F(X)X1]+Eypdata(y)[∣∣G(Y)Y1]
L = L G A N + L c y c l e + L i d e n t i t y L=L_{GAN}+L_{cycle}+L_{identity} L=LGAN+Lcycle+Lidentity

总结

CycleGAN的应用很多,很丰富,我认为可以与各位的领域相结合,尤其是数据集可以扩充部分,一定能取到很强的功效。另外,我认为CycleGAN网络也可以进行调整,还有很多不足之处,改进模型是一个不错的提议哦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/400158
推荐阅读
相关标签
  

闽ICP备14008679号