前段时间看了一下CycleGan网络,最近还是想稍微总结一下,毕竟如果不记下的话很容易忘记。个人觉得玩Gan网络就是玩其loss,尤其发现CycleGan网络的loss设定还是蛮有趣的, 但是还是蛮绕的~
一、 GAN网络介绍
-
应用场景
GAN网络现在还是蛮火的,尤其是最近抖音使用到gan网络来进行旧照片以及旧的影视进行高清处理,看起来还是蛮的。
下面举几个简单的例子:
- 网络概念框架
比如说左边是一个犯罪分子(生成器),他肯定希望他造出来的假币越真越好,但是右边(判别器)的警察肯定希望自己能判别出假币的真伪准确率越高越好。犯罪分子肯定不断提升自己的造假币技术的能力,希望自己造的假币越真越好,但是作为警察的判别器来说,肯定也希望自己的判别能力能随着遭假币水平的提升也随之提升。
- GAN的常见变种及应用场景。
GAN提出来一直是各行业顶会的投稿热点,现在业界也提出了GAN的各种变种。常见的变种包括Pix2pix, CycleGAN, TPGAN, StackGAN和StarGAN.
(1) Pix2pix作用就是一幅图像转换成另外一幅图像,说白了就是一种图像翻译框架。 例如高清图像↔素描图像,之间的相互转换。
(2) CycleGAN其实是一种新的无监督的一种图像迁移框架,它的优势就是在没有承兑训练数据集的情况下将图像数据从原目标区域迁移到目标区域。其主要用于风格迁移。例如现实风格↔抽象风格。
(3) TPGAN中提出后的双路径生产对抗网络包括生成器(包含局部生成器负责细节特征和全局生成器负责结构特征)和识别器。主要可以用于侧面人脸↔正面人脸转换。
(4) StackGAN融合自然语言和图像生产的两项任务,可以通过对文本语义的理解来控制图像的生成。 StackGAN分两个阶段处理任务:第一个阶段的生成对抗生成网络利用文本描述粗略地勾画出物体的主要形状和颜色,其输出是低分辨率的图像;第二阶段的生成对抗网络将第一阶段的输出和文本描述作为输入,生成细节丰富的高分辨率图像。
(5)StarGAN 是CycleGAN在输入输出多样性的扩展,其实现了多样性的扩展,其实现了多类输入到多类输出的风格迁移。
二、CycleGAN原理
从图中可以看出real A图通过生成fake B图与下面的real B图通过我们的去判断我们生成B是否是正式的,以此来训练我们的判别器以及我们的生成器。不知道说到这里我们有没有发现一个问题,就是我们的fake B训练到最后会越来越像real B倾斜,而无法兼顾我们部分像real A的期望。因此我们在这里在fake B后接一个网络,使得我们的real A 与通过还原网络产生的Reconstructed A进行loss计算,使得其能很好的让产生的图像也能兼顾部分A的特征。
这里需要强调的是生成网络一般采用下采样的卷积网络,还原网络一般采用上采样的反卷积网络,但是我们的反卷积还原出得图片的通道数需要为3,以对应彩色图。
在判别网络的时候我们需要将的矩阵转成的矩阵,这是为了我们在后面进行PatchGAN操作方便。
下面我们来整体看下网络模型的整体结构
其实就是上图中输入A生成fake B, 在这里我们也可以输入B 生成fake A 即有两个路线。
在这里涉及到4中损失函数:
- Identity loss
- G(生成器)网络 loss
- Cycle loss
- D(判别器)网络 loss
上面所述的4个网络都有两个过程分别是A↔️B以及B↔️A. 记住这里每一个损失是由顺序的。我们需要按照顺序理解。
identity loss ➡️ G网络loss➡️ Cycle loss ➡️ D网络loss
- identity loss
通过网络输入是A图片生成gen B图片,但是我们希望我们假设这个时候我们输入是real B图但是希望输出也应该是gen B图片,所以我们用L1 loss
通过网络输入是A图片生成gen A图片,但是我们希望我们假设这个时候我们输入是real A图但是希望输出也应该是gen A图片,所以我们用L1 loss
- G网络loss
将A输入到生成的fake B进入到判别器里面,我们希望我们fake B更像real B。 所以fake B放入判别器希望器判断为True。 这里我们是采用MSE loss
将B输入到生成的fake A进入到判别器里面,我们希望我们fake A更像real A。 所以fake A放入判别器希望器判断为True。 这里我们是采用MSE loss
这里需要注意一点我们经过判别器的时候采用了PatchGAN我们。PatchGAN可以这么理解。
GAN一般情况下的网络结构,在一些人的实验中已经表明对于要求高分辨率、高细节保持的图像领域中并不适合,有些人根据这一情况设计了PatchGAN的思路。这种GAN的差别主要是在于Discriminator上,一般的GAN是只需要输出一个true or fasle 的矢量,这是代表对整张图像的评价;但是PatchGAN输出的是一个N x N的矩阵,这个N x N的矩阵的每一个元素,比如a(i,j) 只有True or False 这两个选择(label 是 N x N的矩阵,每一个元素是True 或者 False),这样的结果往往是通过卷积层来达到的,因为逐次叠加的卷积层最终输出的这个N x N 的矩阵,其中的每一个元素,实际上代表着原图中的一个比较大的感受野,也就是说对应着原图中的一个Patch,因此具有这样结构以及这样输出的GAN被称之为Patch GAN。
Cycle loss
real A图像通过G_{BA}生成gen A, 此时我们需要通过L1 loss
real B图像通过G_{AB}生成gen B, 此时我们需要通过L1 lossD网络loss
此时我们将判别器梯度计算改为True, 分别将real A, fake A放入判别器,我们再将real B, fake B放入判别器。分别计算各自的MSE loss, MSE loss , MSE loss , MSE loss
参考
- 关于PatchGAN的理解
- TensorFlow2.0 深度学习应用变成快速入门