GAN总结
GAN总结
本篇文章主要是根据GitHub上的GAN代码库[PyTorch-GAN]进行GAN的复习和回顾,对于之前GAN的各种结构的一种简要的概括。
Code
关于评价GAN模型的标准
Inception score。对模型生成的图片做一个抽样,将图片输入一个分类器中(一般是google的inception model),对于每个类别,计算生成图像分布的KL散度的指数平均值,得到每个类别的Inception Score。公式如下:
\(IS = \exp\left(\mathbb{E}_{x \sim p_{\text{data}}(x)} [D_{KL}(p(y|x) || p(y))] \right)\)
其中,\(D_{KL}(p(y|x) || p(y))\)表示生成图像分布和真实图像分布之间的KL散度,\(p(y|x)\)表示给定图像\(x\)生成的类别分布,\(p(y)\)表示真实图像的类别分布。
Fréchet Inception Distance,FID和IS不同的是它需要和真实图像进行对比,而不仅仅是评价生成图像之前的差异。使用真实图像的均值向量和协方差矩阵,以及生成图像的均值向量和协方差矩阵之间的差异,计算FID。公式如下:
\(FID = ||\mu_{\text{real}} - \mu_{\text{gen}}||^2 + \text{Tr}(\Sigma_{\text{real}} + \Sigma_{\text{gen}} - 2(\Sigma_{\text{real}}\Sigma_{\text{gen}})^{1/2})\)
其中,\(\mu_{\text{real}}\)和\(\mu_{\text{gen}}\)分别表示真实图像和生成图像的均值向量,\(\Sigma_{\text{real}}\)和\(\Sigma_{\text{gen}}\)表示它们的协方差矩阵,\(\text{Tr}\)表示迹运算。
ACGAN
acgan的全称是auxiliary classifier gan,辅助分类器gan,是一种有监督的生成对抗网络,其主要思想是在生成器和判别器中加入分类器,使得生成器和判别器都能够学习到数据的类别信息,从而提高生成器和判别器的性能。相比于CGAN直接进行分类loss的反向传播,acgan在生成器和判别器中都加入了分类损失,除了GAN loss,还引入了分类器loss.
生成器(Generator):
\]
生成器接受输入的噪声向量 z 和类别标签 y,并生成伪造的图像 x̃。
判别器(Discriminator):
\]
判别器接受真实图像 x 和对应的类别标签 y,以及生成图像 x̃ 和对应的类别标签 y,并输出概率值表示真实图像或生成图像的可能性。
鉴别器损失函数(Discriminator Loss):
\]
鉴别器的目标是最小化真实图像的误分类概率和最大化生成图像的误分类概率。
生成器损失函数(Generator Loss):
\]
生成器的目标是最大化生成图像被判别为真实图像的概率。
分类器损失函数(Auxiliary Classifier Loss):
\]
ACGAN还具有一个分类器 C,它使用生成图像和真实图像的类别标签进行训练。分类器的目标是最小化生成图像和真实图像之间的类别预测误差。
总体损失函数:
\]
其中,λ 是用于平衡生成器和分类器损失的超参数。
ACGAN模型通过引入类别信息,能够生成具有特定类别属性的图像,并且通过分类器提供了更好的控制和可解释性。
Adversarial Autoencoders
AAE 实在VAE上的变种,回想VAE的架构。
VAE分为Encoder和Decoder,Encoder将输入的数据映射到潜在空间(将训练数据的分布映射为一个多维高斯分布 ),Decoder将潜在空间的向量映射到原始数据空间,VAE的目标是最小化重构误差和潜在空间的正则项,从而使得潜在空间的向量能够更好的表示原始数据。
VAE的损失函数主要来自两个方面:
- 重构损失,数据经过Encoder和Decoder的重构误差。
- KL散度,数据经过Encoder映射到潜在空间的向量分布与高斯分布的差异,这个loss强制潜空间的分布符合高斯分布。
AAE就针对第二点提出了一个新的想法,使用GAN来代替KL散度。它通过训练一个额外的判别器来强制潜在空间的向量分布符合高斯分布,判别器会分辨Encoder输出的latent Embedding是否符合特定分布。然后按照GAN的范式来交替更新Encoder、Decoder和判别器。
上述是用于重构的AAE,用于VAE的一些技术也可以用于AAE,例如添加分类信息、使用半监督学习、无监督学习等,下面给出半监督学习和无监督学习的架构,看图应该就可以理解了。
引入分类信息
引入半监督
WGAN
WGAN(Wasserstein Generative Adversarial Networks)是一种生成对抗网络模型,其具有以下创新点:
使用Wasserstein距离代替传统的JS散度:WGAN引入了Wasserstein距离作为衡量真实分布与生成分布之间差异的指标。相比于传统的JS散度,Wasserstein距离具有更好的数值稳定性和连续性,能够提供更可靠的梯度信号,从而使训练过程更加稳定。
判别器的权重剪裁:为了满足Wasserstein距离的要求,WGAN通过对判别器的权重进行剪裁,将权重限制在一个预定义的范围内。这种权重剪裁机制有助于避免梯度消失或爆炸问题,并促使判别器学习到更加平滑且良好的输出。
去除了传统GAN中的sigmoid函数和log损失函数:WGAN不使用sigmoid函数作为判别器的最后一层激活函数,也不使用二元交叉熵损失函数。取而代之的是,判别器只需线性输出,同时使用Wasserstein距离作为损失函数。这种改变避免了训练过程中的梯度消失问题,提高了训练的稳定性。
基于梯度惩罚的正则化方法:为了满足Wasserstein距离的Lipschitz连续性要求,WGAN引入了梯度惩罚的正则化方法。该方法通过对判别器在真实图像和生成图像之间的采样点上计算的梯度进行惩罚,来推动判别器的参数满足Lipschitz条件。
这些创新点使得WGAN能够更好地解决传统GAN中存在的训练不稳定、模式崩溃等问题,并提供了一种理论上更可靠的损失函数及训练策略。WGAN的引入对生成对抗网络的发展具有重要意义。
他还有具有一些变种,例如WGAN-GP,WGAN-DIV,WGAN-LP等,这些变种都是在WGAN的基础上进行改进,例如WGAN-GP是在WGAN的基础上引入了梯度惩罚,WGAN-DIV是在WGAN的基础上引入了KL散度,WGAN-LP是在WGAN的基础上引入了Lp范数。
WGAN:对于每一个中间参数的梯度都进行剪裁,使得梯度的范数不超过一个固定的常数c,这样就可以保证判别器满足Lipschitz连续性。
WGAN-GP:在WGAN上修改了梯度惩罚的方式,相比于直接计算loss相对于图片的loss,这篇论文将生成的FakeImg和真实Img按照一定的比例混合,然后计算梯度惩罚。
WGAN-DIV:相比于裁剪梯度,这篇论文换成了梯度正则化,求loss相对于图片的梯度,并将它的L2范数添加进loss。
Improved Techniques for Training GANs
这篇文章主要是用来改进GAN训练的稳定性、多样性和图像质量的。
它提出了多种方法:
- Feature Matching:要求生成的图像在判别器的中间层的输出也要尽量一致,添加了一个额外的loss,使得生成的图像在判别器的中间层的输出也要尽量一致
\]
- minibatch discrimination:在判别器的中间层加入了minibatch discrimination,就是要求一份Batch内部产生的图像的差异性要尽量大,这样可以避免模式崩溃的问题。
- Historical Averaging:\(||\boldsymbol{\theta}-\frac1t\sum_{i=1}^t\boldsymbol{\theta}[i]||^2\),要求更新的参数需要记住之前的经验,而不是完全的更新,这个灵感是从博弈论中学习到的,博弈论中的一个重要的概念就是Nash Equilibrium,就是要求每一个人都要记住之前的经验,而不是完全的更新,这样才能够达到一个平衡的状态。
- One-sided label smoothing,就是将真实的标签设置为0.9或者更小,而不是1,这样可以避免让模型过于自信,这个时候loss也会该改变。
- Vitual batch normalization.这个小trick基本没啥用
- Inception Score。IS就是在这一片论文中提出的。
Pix2Pix:Image-to-Image Translation with Conditional Adversarial Networks
之前做图像翻译,类似于图像分割,语义分割之类的都是使用Unet,然后再翻译之后的图像做MSEloss,pix2pix则将GAN的方法用在了这种方向上。pix2pix将unet得到的图像和真实图像一起放入判别器中,,使用GAN的范式来对生成器Unet进行训练。
它的主要创新点就是下面的loss:
GAN loss如下
x是真实图像,y是真实图像的标签,z是噪声,G是生成器,D是判别器
\]
再加上L1 loss
\]
最终得到的loss
\]
在pix2pix中还采用了patchGAN的discriminator,它的创新点在于与其判定整张图片是是否是真实的,不如判定一张图片的一小块是不是真实的,这样可以使得判别器更加细致,更加关注图片的细节。
cycleGAN:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
GAN总结的更多相关文章
- (转) How to Train a GAN? Tips and tricks to make GANs work
How to Train a GAN? Tips and tricks to make GANs work 转自:https://github.com/soumith/ganhacks While r ...
- 不要怂,就是GAN (生成式对抗网络) (一)
前面我们用 TensorFlow 写了简单的 cifar10 分类的代码,得到还不错的结果,下面我们来研究一下生成式对抗网络 GAN,并且用 TensorFlow 代码实现. 自从 Ian Goodf ...
- GAN
GAN(Generative Adversarial Nets),产生式对抗网络 存在问题: 1.无法表示数据分布 2.速度 3.resolution太小,大了无语义信息 4.无reference 5 ...
- 不要怂,就是GAN (生成式对抗网络) (二)
前面我们了解了 GAN 的原理,下面我们就来用 TensorFlow 搭建 GAN(严格说来是 DCGAN,如无特别说明,本系列文章所说的 GAN 均指 DCGAN),如前面所说,GAN 分为有约束条 ...
- 不要怂,就是GAN (生成式对抗网络) (四):训练和测试 GAN
在 /home/your_name/TensorFlow/DCGAN/ 下新建文件 train.py,同时新建文件夹 logs 和文件夹 samples,前者用来保存训练过程中的日志和模型,后者用来保 ...
- 用GAN生成二维样本的小例子
同步自我的知乎专栏:https://zhuanlan.zhihu.com/p/27343585 本文完整代码地址:Generative Adversarial Networks (GANs) with ...
- 提高驾驶技术:用GAN去除(爱情)动作片中的马赛克和衣服
同步自我的知乎专栏:https://zhuanlan.zhihu.com/p/27199954 作为一名久经片场的老司机,早就想写一些探讨驾驶技术的文章.这篇就介绍利用生成式对抗网络(GAN)的两个基 ...
- 学习笔记GAN003:GAN、DCGAN、CGAN、InfoGAN
GAN应用集中在图像生成,NLP.Robt Learning也有拓展.类似于NLP中的Actor-Critic. https://arxiv.org/pdf/1610.01945.pdf . Gen ...
- 用MXNet实现mnist的生成对抗网络(GAN)
用MXNet实现mnist的生成对抗网络(GAN) 生成式对抗网络(Generative Adversarial Network,简称GAN)由一个生成网络与一个判别网络组成.生成网络从潜在空间(la ...
- 从一篇ICLR'2017被拒论文谈起:行走在GAN的Latent Space
同步自我的知乎专栏文章:https://zhuanlan.zhihu.com/p/32135185 从Slerp说起 ICLR'2017的投稿里,有一篇很有意思但被拒掉的投稿<Sampling ...
随机推荐
- Python遥感影像叠加分析:基于一景数据提取另一数据
本文介绍基于Python中GDAL模块,实现基于一景栅格影像,对另一景栅格影像的像元数值加以叠加提取的方法. 本文期望实现的需求为:现有一景表示6种不同植被类型的.tif格式栅格数据,以及另一 ...
- python Django项目以Debug模式启动和外网访问启动
一.Django介绍 介绍: 完善的web框架,包括前端和后端的管理,django项目管理: 管理后台访问:后面补充 前端页面访问:根据app/settings.py文件下配置的访问地址 1.1 项目 ...
- UITableView的使用样例(简易向)
功能实现 构建一个UITableView,并使其默认显示a,b,c--.. 构建一个按钮,点击后列表变为英文字母 构建一个按钮,点击后列表变为数字 基本概念 实现前头文件需要签订协议(如何签订向后看) ...
- Jetpack Compose(7)——触摸反馈
目录 一.点按手势 1.1 Modifier.clickable 1.2 Modifier.combinedClickable 二.滚动手势 2.1 滚动修饰符 Modifier.verticalSc ...
- 嵌入式ARM端测试手册——全志T3+Logos FPGA评估板(下)
前 言 本指导文档适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit Linux开发环境:Ubuntu18.04.4 64bit 虚拟机:VMwa ...
- 复习 - ajax
复习呢有一个很直观的感受,就是以前学的东西,萌懂半懂的,这一来全部都清楚了,你以前以为你学的并不好但是复习一次把以前的案例一做,居然能够自己独立完成,知识点看着掌握的还不错. 1. 两天时间就把整个a ...
- P5327 题解
考虑把贡献摊到每个点上计算,每个点带来的贡献实际上是经过它的路径并大小,算完求和之后在除以 \(2\) 就得到了答案. 考虑怎么计算路径并大小. 考虑这样一个办法,将所有路径的起始点和终点按照 DFS ...
- TypeScript 学习笔记 — 模板字符串和类型体操(十五)
目录 基本介绍 字符串类型体操实操环节 1. 字符串首字母大写 CapitalizeString 2. 获取字符串第一个字符 FirstChar 3. 获取字符串最后一个字符 LastChar 4. ...
- 辅助分类器生成对抗网络( Auxiliary Classifier Generative Adversarial Network,ACGAN)(附带pytorch代码)
1 ACGAN基本原理 1.2 ACGAN模型解释 ACGAN相对于CGAN使的判别器不仅可以判别真假,也可以判别类别 .通过对生成数据类别的判断,判别器可以更好地传递loss函数使得生成器能够更加准 ...
- 小狼毫&雾凇拼音安装及部署-Windows(图文)
小狼毫输入法和雾凇拼音主题安装以及配置步骤 先上资源链接 小狼毫官网:RIME | 中州韻輸入法引擎 小狼毫Github地址:rime/weasel: [小狼毫]Rime for Windows (g ...