【Pytorch】Cycle GAN实战(一):风格转换--真实风景图像转换为VanGogh风格

一、Cycle GAN(CGAN)原理

  CycleGAN来自于uncongditional GAN,首先介绍一下conditional GAN和unconditional GAN。

1.1Conditional GAN

图片截取自李宏毅老师机器学习课程

(图片截取自李宏毅老师机器学习课程)
  Conditional GAN中generator的输入是成对的数据,(条件标签,噪声z),generator的作用是生成对应条件标签的图片,而Discriminator的作用则由原来的一个(判断生成的数据是否为真)变为两个(判断生成的数据是否为真+生成数据是否与对应的条件标签相匹配)。

在这里插入图片描述
  所以Dixcriminator判断为真的可能是:真实的图片+对应的标签;而判断为假的可能是:真实的图片+错误的条件标签,生成的图片+条件标签。
  由此我们可以得到损失函数:
  对于D来说:(就是从原来的两项变为了三项)当当当!
  Ⅰ:从真实数据集中抽样出数据对(label,image)也就是 { ( c 1 , x 1 ) , ( c 2 , x 2 ) , . . . , ( c m , x m ) } \left\{ \left( c^1,x^1 \right) ,\left( c^2,x^2 \right) ,...,\left( c^m,x^m \right) \right\} {(c1,x1),(c2,x2),...,(cm,xm)}

    得到: 1 m ∑ i = 1 m log ⁡ D ( c i , x i ) \frac{1}{m}\sum\nolimits_{i=1}^m{\log D\left( c^i,x^i \right)} m1i=1mlogD(ci,xi)

  Ⅱ:从真实数据集中抽样出数据 { x ^ 1 , x ^ 2 , . . . , x ^ m } \left\{ \hat{x}^1,\hat{x}^2,...,\hat{x}^m \right\} {x^1,x^2,...,x^m}

    得到: 1 m ∑ i = 1 m log ⁡ ( 1 − D ( c i , x ^ i ) ) \frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D\left( c^i,\hat{x}^i \right) \right)} m1i=1mlog(1D(ci,x^i))

  Ⅲ:由条件标签和噪声生成的fake数据 { x ~ 1 , x ~ 2 , . . . , x ~ m } , x ~ i = G ( c i , z i ) \left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G\left( c^i,z^i \right) {x~1,x~2,...,x~m},x~i=G(ci,zi)

    得到: 1 m ∑ i = 1 m log ⁡ ( 1 − D ( c i , x ~ i ) ) \frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D\left( c^i,\tilde{x}^i \right) \right)} m1i=1mlog(1D(ci,x~i))

  所以:

V ~ = 1 m ∑ i = 1 m log ⁡ D ( c i , x i ) + 1 m ∑ i = 1 m log ⁡ ( 1 − D ( c i , x ^ i ) ) + 1 m ∑ i = 1 m log ⁡ ( 1 − D ( c i , x ~ i ) ) \tilde{V}=\frac{1}{m}\sum\nolimits_{i=1}^m{\log D\left( c^i,x^i \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D\left( c^i,\hat{x}^i \right) \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D\left( c^i,\tilde{x}^i \right) \right)} V~=m1i=1mlogD(ci,xi)+m1i=1mlog(1D(ci,x^i))+m1i=1mlog(1D(ci,x~i)) θ d ← θ d + η ∇ V ~ ( θ d ) \theta _d\gets \theta _d+\eta \nabla \tilde{V}\left( \theta _d \right) θdθd+ηV~(θd)
  那么对于G来说呢:
Ⅰ:噪声 { z 1 , z 2 , . . . , z m } \left\{ z^1,z^2,...,z^m \right\} {z1,z2,...,zm},条件标签 { c 1 , c 2 , . . . , c m } \left\{ c^1,c^2,...,c^m \right\} {c1,c2,...,cm} V ~ = 1 m ∑ i = 1 m log ⁡ ( D ( G ( c i , z i ) ) ) , θ g ← θ g − η ∇ V ~ ( θ g ) \tilde{V}=\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( D\left( G\left( c^i,z^i \right) \right) \right)},\theta _g\gets \theta _g-\eta \nabla \tilde{V}\left( \theta _g \right) V~=m1i=1mlog(D(G(ci,zi))),θgθgηV~(θg)
在这里稍微补充一下,我们刚刚说到了D的作用有两个分别是判断是否为真以及判断数据与条件标签是否匹配,但是还有一种观点是:
在这里插入图片描述
  单独判断数据是否为真,以及再判断数据与条件是否匹配。李宏毅老师觉得这样更合理(我也这样想觉得哈哈哈哈)
  Conditional GAN应用的情况是:给出文本,生成对应文本的图片text-to-image)、色彩图到实物图、轮廓图到实物图(image-to-image)、去除噪声。

1.2Unsupervised Conditional GAN

  我这次尝试的是风格转换,是将一种风格A的图片转换成另一种风格B。一种风格的图片会有很多类,如果按照conditionalGAN的思想那么数据对则是对应类别的风格B的图片,但是显然如果我要将真实的图片转换为梵高大师的风格(在这里膜拜一下大师),不一定能在梵高大师的画作里找到我们对应的图片,而且你也不可能请梵高大师为你作画一幅是不是,除非你自己会画[狗头](天啊某大学生为学习深度学习亲自作画简直令闻者感动听者落泪啊)
  Ok说到这里呢,其实就是conditionalGAN已经不适用这种情况啦,那可如何是好呢?其实刚才纠结的点就是类别的问题,我们找不到对应类别的目标风格的照片,所以我们能不能不要标签呢,让机器自己学会目标风格的数据分布。啊这,这不就是无监督学习做擅长干的事情嘛!对,所以就有聪明的前辈们,利用高级生物的智慧让机器进行unsupervised conditional generation,期间呢就创造出大大小小,多多少少好多种GAN,主要是两种思路。

No.1 Direct Transformation,直接转换

在这里插入图片描述
  第一种思路最有名的就是我们今天要隆重介绍的cycleGAN啦!!整个网络的设计呢是这样滴:
在这里插入图片描述
  整个网络设计了2个Generators,2个Discriminators。我们已有的图片数据分布为DomainX,想要转换的目标风格的数据分布为DomainY。
  对于已有数据来说,2个Generators, G X → Y G_{X\rightarrow Y} GXY将目标风格图像转换为已有数据分布, G X → Y G_{X\rightarrow Y} GXY将生成的fake图像再转换为原来的图像,我们想要的是和原来目标风格的图像越接近越好。 D X D_X DX判断生成的fake图像是否属于X分布。
  我们先来说明一下各个数据符号表示及意义:
   X X X:已有的数据分布, x i x^i xi:已有的数据样本
   Y Y Y:目标风格数据分布, y i y^i yi:已有的目标风格的数据样本
   G X → Y G_{X\rightarrow Y} GXY:将 X X X分布的数据生成 Y Y Y分布的数据, y ~ i \tilde{y}^i y~i G X → Y G_{X\rightarrow Y} GXY生成的 Y Y Y分布的数据, x ~ i \tilde{x}^i x~i y ~ i \tilde{y}^i y~i又经 G Y → X G_{Y\rightarrow X} GYX生成的 X X X分布的数据
   G Y → X G_{Y\rightarrow X} GYX:将 Y Y Y分布的数据生成 X X X分布的数据, x ~ i \tilde{x}^i x~i G Y → X G_{Y\rightarrow X} GYX生成的 X X X分布的数据, y ~ i \tilde{y}^i y~i x ~ i \tilde{x}^i x~i又经 G X → Y G_{X\rightarrow Y} GXY生成的 Y Y Y分布的数据
   D Y D_Y DY:判断是否属于 Y Y Y分布的数据
   D X D_X DX:判断是否属于 X X X分布的数据
  由此我们可以得到损失函数:
  对于D来说:
  Ⅰ:从已有数据集 X X Xdomain抽取 { x 1 , x 2 , . . . , x m } \left\{ x^1,x^2,...,x^m \right\} {x1,x2,...,xm},从目标风格数据集 Y Y Ydomain抽取 { y 1 , y 2 , . . . , y m } \left\{ y^1,y^2,...,y^m \right\} {y1,y2,...,ym},对应生成的生成的fake数据 { y ~ 1 , y ~ 2 , . . . , y ~ m } , y ~ i = G X → Y ( x i ) \left\{ \tilde{y}^1,\tilde{y}^2,...,\tilde{y}^m \right\} ,\tilde{y}^i=G_{X\rightarrow Y}\left( x^i \right) {y~1,y~2,...,y~m},y~i=GXY(xi) { x ~ 1 , x ~ 2 , . . . , x ~ m } , x ~ i = G Y → X ( y i ) \left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G_{Y\rightarrow X}\left( y^i \right) {x~1,x~2,...,x~m},x~i=GYX(yi)得到: L G A N _ D ( G , D , X , Y ) = L G A N ( G X → Y , D Y , X , Y ) + L G A N ( G Y → X , D X , X , Y ) = [ 1 m ∑ i = 1 m log ⁡ D Y ( y i ) + 1 m ∑ i = 1 m log ⁡ ( 1 − D Y ( G X → Y ( x i ) ) ) ] + [ 1 m ∑ i = 1 m log ⁡ D X ( x i ) + 1 m ∑ i = 1 m log ⁡ ( 1 − D X ( G Y → X ( y i ) ) ) ] L_{GAN\_D}\left( G,D,X,Y \right) =L_{GAN}\left( G_{X\rightarrow Y},D_Y,X,Y \right) +L_{GAN}\left( G_{Y\rightarrow X},D_X,X,Y \right) \\ =\left[ \frac{1}{m}\sum\nolimits_{i=1}^m{\log D_Y\left( y^i \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D_Y\left( G_{X\rightarrow Y}\left( x^i \right) \right) \right)} \right] \\ +\left[ \frac{1}{m}\sum\nolimits_{i=1}^m{\log D_X\left( x^i \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log \left( 1-D_X\left( G_{Y\rightarrow X}\left( y^i \right) \right) \right)} \right] LGAN_D(G,D,X,Y)=LGAN(GXY,DY,X,Y)+LGAN(GYX,DX,X,Y)=[m1i=1mlogDY(yi)+m1i=1mlog(1DY(GXY(xi)))]+[m1i=1mlogDX(xi)+m1i=1mlog(1DX(GYX(yi)))]  所以: V ~ = L G A N _ G ( G , D , X , Y ) , θ d ← θ d + η ∇ V ~ ( θ d ) \tilde{V}=L_{GAN\_G}\left( G,D,X,Y \right),\theta _d\gets \theta _d+\eta \nabla \tilde{V}\left( \theta _d \right) V~=LGAN_G(G,D,X,Y)θdθd+ηV~(θd)   对于G来说:
  Ⅰ:从已有数据集 X X Xdomain抽取 { x 1 , x 2 , . . . , x m } \left\{ x^1,x^2,...,x^m \right\} {x1,x2,...,xm},从目标风格数据集 Y Y Ydomain抽取 { y 1 , y 2 , . . . , y m } \left\{ y^1,y^2,...,y^m \right\} {y1,y2,...,ym},以及对应生成的各自的fake数据 { y ~ 1 , y ~ 2 , . . . , y ~ m } , y ~ i = G X → Y ( x i ) \left\{ \tilde{y}^1,\tilde{y}^2,...,\tilde{y}^m \right\} ,\tilde{y}^i=G_{X\rightarrow Y}\left( x^i \right) {y~1,y~2,...,y~m},y~i=GXY(xi) { x ~ 1 , x ~ 2 , . . . , x ~ m } , x ~ i = G Y → X ( y i ) \left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G_{Y\rightarrow X}\left( y^i \right) {x~1,x~2,...,x~m},x~i=GYX(yi),得到: L G A N _ G ( G , D , X , Y ) = L G A N ( G X → Y , D Y , X ) + L G A N ( G Y → X , D X , Y ) = 1 m ∑ i = 1 m log ⁡ D Y ( G X → Y ( x i ) ) + 1 m ∑ i = 1 m log ⁡ D X ( G Y → X ( y i ) ) L_{GAN\_G}\left( G,D,X,Y \right) =L_{GAN}\left( G_{X\rightarrow Y},D_Y,X \right) +L_{GAN}\left( G_{Y\rightarrow X},D_X,Y \right) \\ =\frac{1}{m}\sum\nolimits_{i=1}^m{\log D_Y\left( G_{X\rightarrow Y}\left( x^i \right) \right)}+\frac{1}{m}\sum\nolimits_{i=1}^m{\log D_X\left( G_{Y\rightarrow X}\left( y^i \right) \right)} LGAN_G(G,D,X,Y)=LGAN(GXY,DY,X)+LGAN(GYX,DX,Y)=m1i=1mlogDY(GXY(xi))+m1i=1mlogDX(GYX(yi))  Ⅱ:从已有数据集 X X Xdomain抽取 { x 1 , x 2 , . . . , x m } \left\{ x^1,x^2,...,x^m \right\} {x1,x2,...,xm},从目标风格数据集 Y Y Ydomain抽取 { y 1 , y 2 , . . . , y m } \left\{ y^1,y^2,...,y^m \right\} {y1,y2,...,ym},以及最后reconstruct的fake数据 { x ~ 1 , x ~ 2 , . . . , x ~ m } , x ~ i = G Y → X ( G X → Y ( x i ) ) \left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G_{Y\rightarrow X}\left( G_{X\rightarrow Y}\left( x^i \right) \right) {x~1,x~2,...,x~m},x~i=GYX(GXY(xi)) { y ~ 1 , y ~ 2 , . . . , y ~ m } , y ~ i = G X → Y ( G Y → X ( y i ) ) \left\{ \tilde{y}^1,\tilde{y}^2,...,\tilde{y}^m \right\} ,\tilde{y}^i=G_{X\rightarrow Y}\left( G_{Y\rightarrow X}\left( y^i \right) \right) {y~1,y~2,...,y~m},y~i=GXY(GYX(yi)),得到: L c y c l e ( G X → Y , G Y → X , X , Y ) = L c y c l e ( G X → Y , G Y → X , X ) + L c y c l e ( G X → Y , G Y → X , Y ) = 1 m ∑ i = 1 m ∥ G Y → X ( G X → Y ( x i ) ) − x i ∥ L 1 + 1 m ∑ i = 1 m ∥ G X → Y ( G Y → X ( y i ) ) − y i ∥ L 1 L_{cycle}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X,Y \right) =L_{cycle}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X \right) +L_{cycle}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},Y \right) \\ =\frac{1}{m}\sum\nolimits_{i=1}^m{\left\| G_{Y\rightarrow X}\left( G_{X\rightarrow Y}\left( x^i \right) \right) -x^i \right\| _{L1}+}\frac{1}{m}\sum\nolimits_{i=1}^m{\left\| G_{X\rightarrow Y}\left( G_{Y\rightarrow X}\left( y^i \right) \right) -y^i \right\| _{L1}} Lcycle(GXY,GYX,X,Y)=Lcycle(GXY,GYX,X)+Lcycle(GXY,GYX,Y)=m1i=1mGYX(GXY(xi))xiL1+m1i=1mGXY(GYX(yi))yiL1  从已有数据集 X X Xdomain抽取 { x 1 , x 2 , . . . , x m } \left\{ x^1,x^2,...,x^m \right\} {x1,x2,...,xm},从目标风格数据集 Y Y Ydomain抽取 { y 1 , y 2 , . . . , y m } \left\{ y^1,y^2,...,y^m \right\} {y1,y2,...,ym},以及对应生成的各自的fake数据 { y ~ 1 , y ~ 2 , . . . , y ~ m } , y ~ i = G X → Y ( x i ) \left\{ \tilde{y}^1,\tilde{y}^2,...,\tilde{y}^m \right\} ,\tilde{y}^i=G_{X\rightarrow Y}\left( x^i \right) {y~1,y~2,...,y~m},y~i=GXY(xi) { x ~ 1 , x ~ 2 , . . . , x ~ m } , x ~ i = G Y → X ( y i ) \left\{ \tilde{x}^1,\tilde{x}^2,...,\tilde{x}^m \right\} ,\tilde{x}^i=G_{Y\rightarrow X}\left( y^i \right) {x~1,x~2,...,x~m},x~i=GYX(yi),得到: L i d e n t i t y ( G X → Y , G Y → X , X , Y ) = L i d e n t i t y ( G X → Y , X ) + L i d e n t i t y ( G Y → X , Y ) = 1 m ∑ i = 1 m ∥ G X → Y ( x i ) − x i ∥ L 1 + 1 m ∑ i = 1 m ∥ G Y → X ( y i ) − y i ∥ L 1 L_{identity}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X,Y \right) =L_{identity}\left( G_{X\rightarrow Y},X \right) +L_{identity}\left( G_{Y\rightarrow X},Y \right) \\ =\frac{1}{m}\sum\nolimits_{i=1}^m{\left\| G_{X\rightarrow Y}\left( x^i \right) -x^i \right\|}_{L1}+\frac{1}{m}\sum\nolimits_{i=1}^m{\left\| G_{Y\rightarrow X}\left( y^i \right) -y^i \right\|}_{L1} Lidentity(GXY,GYX,X,Y)=Lidentity(GXY,X)+Lidentity(GYX,Y)=m1i=1mGXY(xi)xiL1+m1i=1mGYX(yi)yiL1  所以: V ~ = L G A N _ G ( G , D , X , Y ) + L c y c l e ( G X → Y , G Y → X , X , Y ) + L i d e n t i t y ( G X → Y , G Y → X , X , Y ) \tilde{V}=L_{GAN\_G}\left( G,D,X,Y \right) +L_{cycle}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X,Y \right) +L_{identity}\left( G_{X\rightarrow Y},G_{Y\rightarrow X},X,Y \right) V~=LGAN_G(G,D,X,Y)+Lcycle(GXY,GYX,X,Y)+Lidentity(GXY,GYX,X,Y) θ g ← θ g − η ∇ V ~ ( θ g ) \theta _g\gets \theta _g-\eta \nabla \tilde{V}\left( \theta _g \right) θgθgηV~(θg)
  当然啦,任何网络都不是绝对完美的,同样的cycleGAN也存在着问题stenography,有人发现呢cycleGAN会把input的内容藏起来,output时再把内容呈现出来。以 x i → y ^ i → x ^ i x^i\rightarrow \hat{y}^i\rightarrow \hat{x}^i xiy^ix^i为例,在生成中间的 y ^ i \hat{y}^i y^i时, G X → Y G_{X\rightarrow Y} GXY有很强的能力把信息藏在人看不到的地方,在恢复的时候 G Y → X G_{Y\rightarrow X} GYX再把 x ^ i \hat{x}^i x^i呈现出来。这样的话cycle consistency可能就没有意义,因为尽管 x i x^i xi x i x^i xi相似,但中间真正传入 D Y D_Y DY y ^ i \hat{y}^i y^i可能已经很不同了。

No.2 Projection to Common Spcae,先编码出抽象特征,在解码转换为图像

在这里插入图片描述
  第二种也有很多的方法,在这里就不介绍啦。

二、代码部分

  原理部分已分析完,我们来看看程序部分是怎么实现的呢
  我现在已经看过并处理过几个完整的深度学习的神经网络啦,每次看的时候都会学到很多很多,除了基本的框架呢,有时候能感觉到作者的巧思,一些细节有花心思在上面,很让人惊叹!!而且在这个过程中,面对自己不懂的函数还有编程的思路呢,一点点分析就会有抽丝剥茧,按图索骥,最后恍然大悟的感觉!都说兴趣是最好的老师,我现在深以为然,之前我总觉得凡事都要系统的学习,但事实上现在的知识更多的是要靠自己呢由点及面逐步探索,而且在这个过程中,发现了数学思想带来的美妙,真的觉得很神奇!好啦说回程序部分吧。

2.1超参数

  我此次参考的程序是论文提供的代码(忍不住惊叹:真的是写得很好呢!)和上次实现的DCGAN生成二次元头像的思路是一样的,也是将超参数写进类中,但是论文代码不是自定义类,而是调用argparse库进行初始化。

2.2数据预处理

  是在__getitem__()函数里进行了改写,区分出了 X X Xdomain和 Y Y Ydomain的数据,返回字典 X , Y X,Y X,Y作为键名。

2.3网络

  网络这部分也是我觉得很新奇的写法。参考代码没有按照常规的一层一层列在Sequential()中,而是把一块一块放在blocklist中赋予一个变量model,有的块要好几次,就放在for循环里,model+=blocklist延长modellist,最后执行Sequential(*model)
另写了函数def Create_nets(),是不是看名字就知道啦!对吧,就是在这里把Generator和Discriminator实例化。
  可能是我孤陋寡闻了,但是看到这里真的挺兴奋的,就觉得咦还能这样写!真的是简洁易懂。

2.4优化器和损失函数

  还有这里!和def Create_nets()的想法一样,优化器和损失函数单独写了函数进行实例化。参考代码还写了更新学习率的函数,之前看的代码没有这一步呢。
  参考代码有一个utils的py文件,给人感觉像是小工具包哈哈哈,一些绘图等函数就放在这里。这个作者很精致呢,小东西也不乱放收拾得整整齐齐哈,我后来写的绘制Loss图像的的函数也放在这里啦!

三、运行结果

3.1CUDA占满问题

  OK这下我们代码部分也分析完啦,那么程序运行后的结果怎么样呢?
  首先是!!在我的电脑上是根本跑不通滴,但然我很震惊的是601服务器上也跑不了!但是我一看它的batch只有1呀,后来想Discriminator和Generator翻了两倍,而且生成的图片是256*256[震惊脸],那参数量可就太多了,而且Discriminator和Generator都有好多层,之前的DCGAN是没法比的。于是果断修改生成图片的size。
  下面是我记录的不同size下占用GPU,以及训练速度
在这里插入图片描述
后来我选用的是batch:45

3.2训练过程

  在这里说明一下Loss图中的第二个子图画的是Loss_GAN,Loss_cycle,Loss_identity,子图上的title忘记修改了呜呜。
  生成的图片8x4,一行4个是抽取4个样例,一列从上往下是:
   y i ( y i _ Y ) y^i\left( y^i\_Y \right) yi(yi_Y)
   x ~ i ( y i _ X ) = G Y → X ( y i ) \tilde{x}^i\left( y^i\_X \right) =G_{Y\rightarrow X}\left( y^i \right) x~i(yi_X)=GYX(yi)
   y ~ i ( y i _ R Y ) = G X → Y ( G Y → X ( y i ) ) \tilde{y}^i\left( y^i\_RY \right) =G_{X\rightarrow Y}\left( G_{Y\rightarrow X}\left( y^i \right) \right) y~i(yi_RY)=GXY(GYX(yi))
   x ^ i ( x i _ X ) = G Y → X ( x i ) \hat{x}^i\left( x^i\_X \right) =G_{Y\rightarrow X}\left( x^i \right) x^i(xi_X)=GYX(xi)
   x i ( x i _ X ) x^i\left( x^i\_X \right) xi(xi_X)
   y ~ i ( x i _ Y ) = G X → Y ( x i ) \tilde{y}^i\left( x^i\_Y \right) =G_{X\rightarrow Y}\left( x^i \right) y~i(xi_Y)=GXY(xi)
   x ~ i ( x i _ R X ) = G Y → X ( G X → Y ( x i ) ) \tilde{x}^i\left( x^i\_RX \right) =G_{Y\rightarrow X}\left( G_{X\rightarrow Y}\left( x^i \right) \right) x~i(xi_RX)=GYX(GXY(xi))
   y ^ i ( y i _ Y ) = G X → Y ( y i ) \hat{y}^i\left( y^i\_Y \right) =G_{X\rightarrow Y}\left( y^i \right) y^i(yi_Y)=GXY(yi)

(1)Epoch:10

在这里插入图片描述
在这里插入图片描述

(2)Epoch:20

在这里插入图片描述
在这里插入图片描述

(3)Epoch:50

在这里插入图片描述
在这里插入图片描述

(4)Epoch:100

在这里插入图片描述
在这里插入图片描述

(5)Epoch:200

在这里插入图片描述
在这里插入图片描述

(6)汇总

EpochLD_LG和LG_Lcycle_LidentityReal_Fake
10在这里插入图片描述在这里插入图片描述
20在这里插入图片描述在这里插入图片描述
50在这里插入图片描述在这里插入图片描述
100在这里插入图片描述在这里插入图片描述
200在这里插入图片描述在这里插入图片描述

  这次试验,也是复现代码,没有进行调参的工作。可以看到随着训练测试的增多,风格迁移的效果越来越好。而且Loss也是在按照期望的在减小,但训练到100epoch和200epoch的时候Loss有上升的趋势,此时应该是模型训练到一定程度之后出现的不稳定,不再随着梯度更新而进行减小。

四、小结

  从最开始实习对GAN一知半解,到现在比较清楚GAN的网络结构以及原理,而GAN的两大应用分类以及生成数据也都进行了尝试(不知道这里说的对不对嘻嘻)收获很多很多。而且最最开始,自己算是野路子对深度学习的尝试东一榔头西一棒槌,不成体系,现在回过头看自己也是走了一些弯路哦哈哈哈,不过现在呢,已经慢慢知道如果之后还继续学习深度学习的内容应该要怎么做啦!!这一阶段的学习我准备暂告一段落,之后还会带着浓厚的兴趣继续学习下去!

五、相关代码及参考资料

论文代码:https://codechina.csdn.net/mirrors/junyanz/pytorch-cyclegan-and-pix2pix?utm_source=csdn_github_accelerator
论文数据集:https://people.eecs.berkeley.edu/~taesung_park/CycleGAN/datasets/
论文:https://arxiv.org/pdf/1508.06576.pdf

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
CycleGAN 是一种无监督图像翻译模型,常用于将一类图像化为另一类图像,如将夏季风景图片化为冬季风景图片。CycleGAN 的性能可以通过多种指标进行定量分析,以下是常用的几种指标: 1. PSNR(Peak Signal-to-Noise Ratio):PSNR 是图像处理中常用的评价指标,用于衡量图像质量的好坏。在 CycleGAN 中,可以使用 PSNR 指标衡量生成图像与目标图像之间的相似程度,PSNR 越高,表示生成图像与目标图像越接近。 2. SSIM(Structural Similarity Index):SSIM 是一种结构相似度指标,用于衡量两个图像结构的相似程度。在 CycleGAN 中,可以使用 SSIM 指标衡量生成图像与目标图像之间的结构相似程度,SSIM 越高,表示生成图像与目标图像之间的结构越接近。 3. FID(Fréchet Inception Distance):FID 是一种用于衡量生成图像与目标图像之间的差异程度的指标。它通过计算生成图像与目标图像在特征空间中的距离来评估两者之间的相似程度,FID 越小,表示生成图像与目标图像越接近。 4. LPIPS(Learned Perceptual Image Patch Similarity):LPIPS 是一种通过学习感知图像块相似性来衡量图像相似程度的指标。在 CycleGAN 中,可以使用 LPIPS 指标衡量生成图像与目标图像之间的相似程度,LPIPS 越小,表示生成图像与目标图像越接近。 这些指标可以帮助我们评估和比较不同的 CycleGAN 模型的性能,以及优化模型的训练过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值