PaperNotes(6)-GAN/DCGAN/WGAN/WGAN-GP/WGAN-SN-网络结构/实验效果

GAN模型网络结构+实验效果演化

  • 1.GAN
    • 1.1网络结构
    • 1.2实验结果
  • 2.DCGAN
    • 2.1网络结构
    • 2.2实验结果
  • 3.WGAN
    • 3.1网络结构
    • 3.2实验结果
  • 4.WGAN-GP
    • 4.1网络结构
    • 4.2实验结果
  • 5.WGAN-SN
    • 5.1网络结构
    • 5.2实验结果
  • 小结

1.GAN

文章: https://arxiv.org/pdf/1406.2661.pdf
代码: Pylearn2, theano, https://github.com/goodfeli/adversarial

1.1网络结构

多层感知机器(没有在文章中找到)
G: ReLU, sigmoid
D:maxout, dropout

1.2实验结果

1.数据集:MNIST,the Toronto Face Database (TFD) , CIFAR-10

2.Gaussian Parzen window 拟合样本,输出对应的log-likelihood.

3.直接展示了在三个图像集合上的效果,最右遍一列显示的是与第二列最相似的训练样本(具体如何衡量相近,需要查论文)

在这里插入图片描述
a) MNIST,b) TFD, c) CIFAR-10 (fully connected model), d) CIFAR-10 (convolutional discriminatorand “deconvolutional” generator)

训练次数呢?
这时候的cifar数据集基本不能看·

2.DCGAN

文章:https://arxiv.org/pdf/1511.06434.pdf
代码:https://pytorch.org/tutorials/beginner/dcgan_faces_tutorial.html,pytorch 官网DCAGAN教程,示例是人脸图像生成

2.1网络结构

P3:网络结构表
1.去除所有的poling层
2.D,G中都使用batchnorm
3.移除全联接结构
4.G激活函数:ReLU+Tanh(最后一层)
5.D激活函数:LeakyReLU(所有层)

2.2实验结果

Lsun–视觉效果,300万张图像
Cifar10-分类实验
人脸加减法实验

3.WGAN

文章:https://arxiv.org/pdf/1701.07875.pdf
代码:https://github.com/martinarjovsky/WassersteinGAN,作者github 提供的代码,pytorch

3.1网络结构

p9:以DCGAN为baseline, baseline 损失使用-logD 技巧
lipschitz约束实现:clip D网络参数

3.2实验结果

Lsun-bedromm 稳定性视觉实验

WGAN本身是为了提高GAN模型训练的稳定性而生的。文章强调的两个优点啊:有意义的loss+稳定训练过程。同一作者的后续文章(improved Training of Wasserstein GANs) 图3,展示了clip 版本WGAN IS指标确实比不上DCGAN。
在这里插入图片描述

4.WGAN-GP

文章:https://arxiv.org/pdf/1704.00028.pdf
代码:https://github.com/igul222/improved_wgan_training,作者github 提供的代码,tensorflow(明明是同一个作者写的平台还不一样)
自己复现代码时使用的是:https://github.com/eriklindernoren/PyTorch-GAN/tree/master/implementations WGAN_GP中写的GP方法。

4.1网络结构

1.G网络带BN,D网络不实用Batch normalization, 转而使用 layer Normalization
2.clip 会使优化变得困难,惩罚D网络的梯度,使其不至于太大
3.在cifar-10 数据集合上D和G都使用resnet 结构

4.2实验结果

在这里插入图片描述
WGAN-GP能看出来一个轮廓,算是比较好的一个视觉效果了。

本人用pytroch 复现WGAN_GP ,参考了作者梯度惩罚的源码(https://github.com/igul222/improved_wgan_training.)主体代码是在WGAN的基础上(https://github.com/martinarjovsky/WassersteinGAN),注释了CLIP部分的代码,在D损失函数的计算上增加了梯度惩罚项目(计算方式参考了网上的实现博文)。虽然生成的图像视觉指标轮廓不错,但是IS曲线(与baseline-WGAN 相比)并没特别的优势。

现在WGAN实现的时候,D网络的更新次数在100/5之间切换,直接换成5 试一试

仓库:https://github.com/caogang/wgan-gp (1000star)是pytorch复现的WGAN_GP具体效果没有考察。

// 梯度惩罚的计算法函数
def compute_gradient_penalty(D, real_samples, fake_samples):"""Calculates the gradient penalty loss for WGAN GP"""# Random weight term for interpolation between real and fake samplesalpha = torch.Tensor(np.random.random((real_samples.size(0), 1, 1, 1))).cuda()# Get random interpolation between real and fake samples# print(real_samples.size(),fake_samples.size())# interpolates = (alpha * real_samples + ((1 - alpha) * fake_samples)).requires_grad_(True)interpolates = (alpha * fake_samples + ((1 - alpha) * real_samples)).requires_grad_(True)d_interpolates = D(interpolates)# d_interpolates = d_interpolates.resize(d_interpolates.size()[0],1)fake = Variable(torch.Tensor(real_samples.shape[0], 1).fill_(1.0), requires_grad=False).cuda()# Get gradient w.r.t. interpolatesgradients = torch.autograd.grad(outputs=d_interpolates,inputs=interpolates,grad_outputs=fake,create_graph=True,retain_graph=True,only_inputs=True,)[0]gradients = gradients.view(gradients.size(0), -1)gradient_penalty = ((gradients.norm(2, dim=1) - 1) ** 2).mean()return gradient_penalty
...
// 判别器的损失函数的计算
gradient_penalty = utils.compute_gradient_penalty(netD,inputv_real,inputv_fake)
gradient_penalty *= lambda_gp
gradient_penalty.backward()
errD = errD_real - errD_fake - gradient_penalty
optimizerD.step()
d_iterations += 1

5.WGAN-SN

文章:https://arxiv.org/pdf/1802.05957.pdf
代码:https://pytorch.org/docs/stable/generated/torch.nn.utils.spectral_norm.html?highlight=nn%20utils%20spectra#torch.nn.utils.spectral_norm,pytorch 官网上实现了D网络参数谱正则化的代码,直接在定义层的时候调用就可以了。

5.1网络结构

D卷积结构,没有BN
G卷积结构+BN
(没有LN的情况)

5.2实验结果

在这里插入图片描述
cifar-10 上的结构,虽然也只能是看一个大致轮廓,但是,效果还是比较好的。

小结

1.BN 在mini-batch 较小或者RNN等动态网络里效果不好,因为少量样本的均值和方差无法反应整体的情况。BN强调了mini-batch 样本之间的联系。D网络本身是将一个输入映射到一个得分输出,不应该考虑样本之间的联系,所以不应该使用BN,在WGAN-GP中转而使用layer-normalization,对同一个样本的各个通道做归一化。

2.网络越深,其生成能力越强,WGAN-GP论文中cifar-10 IS可以达到7左右,WGAN-Sn中也可以达到6.41,都是因为网络结构不同,所以在浅层只有卷积的G(DCGAN,WGAN)想要达到那么高的IS一般是不可能的。

3.尝试人脸生成数据集合the Toronto Face Database (TFD)

4.整理一下各个实验的G训练次数。

5.stack gan 的网络结构基本还行。在做GP实验的时候,至少得吧BN该成LN,再看看SN中是如何做的。


涉及WGAN的论文总共三篇:

WGAN前作:Towards Principled Methods for Training Generative Adversarial Networks
论文链接:https://arxiv.org/abs/1701.04862

WGAN:Wasserstein GAN
论文链接:https://arxiv.org/abs/1701.07875

WGAN后作:Improved Training of Wasserstein GANs
论文链接:https://arxiv.org/abs/1704.00028v3
都是神人Ishaan Gulrajani 写的,连GAN之父Ian Goodfellow都十分惊叹WGAN的改进内容。

神员各种类型GAN代码实现(TensorFlow框架):https://github.com/LynnHo/AttGAN-Tensorflow

这三篇论文理论性都比较强,尤其是第一篇,涉及到比较多的理论公式推导。知乎郑华滨的两个论述,Wasserstein GAN最新进展:从weight clipping到gradient penalty,更加先进的Lipschitz限制手法在理论方面已经做了一个很好的介绍。不过对于很多数学不太好的同学(包括我自己),看着还是不太好理解,所以这里尽量站在做工程的角度,理一下这三篇文章的思路,这样可以对作者的思路有一个比较清晰的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security使用

Spring Security 在web应用开发中,安全无疑是十分重要的,选择Spring Security来保护web应用是一个非常好的选择。 Spring Security 是spring项目之中的一个安全模块,可以非常方便与spring项目无缝集成。特别是在spring boot项目中加入sprin…

nginx python webpy 配置安装

安装webpy$ wget http://webpy.org/static/web.py-0.34.tar.gz$ tar xvzf web.py-0.34.tar.gz$ cd web.py-0.34$ sudo python setup.py install安装 Fluphttp://www.saddi.com/software/flup/dist/flup-1.0.2.tar.gz$ wget http://www.saddi.com/software/flup/dist/flup-1.0.2…

PaperNotes(7)-GANs模式坍塌/训练不稳定

GANs-模式坍塌-训练不稳定1.训练不稳定问题相关文章1.1 DCGAN1.2Big-GAN1.3WGAN 、WGAN-GP、SN-WGAN1.4其他工作2.模式坍塌问题相关文章2.1 MAD-GAN2.2 Unrolled GAN2.3 DRAGAN2.4 D2GAN2.5 InfoGAN2.6 Deligan2.7 EBGAN2.8 Maximum Entropy Generators for Energy-Based Model…

thinkphp框架起步认识

先看看thinkphp的文档吧:这是我在网上找的一个不错的链接地址,对自己有用,同时相信对读者也有用吧。 http://doc.thinkphp.cn/manual/class.html ThinkPHP 跨模块调用操作方法(A方法与R方法) 跨模块调用操作方法 前面说…

leetcode403 青蛙过河

一只青蛙想要过河。 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有)。 青蛙可以跳上石头,但是不可以跳入水中。 给定石子的位置列表(用单元格序号升序表示)&#xff…

PaperNotes(8)-Stein Variational Gradient Descent A General Purpose Bayesian Inference Algorithm

通用贝叶斯推理算法-Stein Variational Gradient DescentAbstract1 Introduction2 Background3 Variational Inference Using Smooth Transforms3.1 Stein Operator as the Derivative of KL Divergence定理3.1引理3.23.2 Stein Variational Gradient Descent4 Related Works5 …

thinkphp的增删改查

ThinkPHP 添加数据 add 方法 ThinkPHP 内置的 add 方法用于向数据表添加数据,相当于 SQL 中的 INSERT INTO 行为。ThinkPHP Insert 添加数据添加数据 add 方法是 CURD(Create,Update,Read,Delete / 创建,修改,读取,删除)中的 Create 的实现&a…

leetcode115 不同的子序列

给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数。 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是…

ThinkPHP 模板循环输出 Volist 标签

volist 标签用于在模板中循环输出数据集或者多维数组。volist 标签在模块操作中&#xff0c;select() 方法返回的是一个二维数组&#xff0c;可以用 volist 直接输出&#xff1a;<volist name"list" id"vo"> 用 户 名&#xff1a;{$vo[username]}&l…

MachineLearning(9)-最大似然、最小KL散度、交叉熵损失函数三者的关系

最大似然-最小KL散度-最小化交叉熵损失-三者的关系问题缘起&#xff1a;给定一组数据(x1,x2,...,xm)(x^1,x^2,...,x^m)(x1,x2,...,xm),希望找到这组数据服从的分布。此种情况下&#xff0c;分布规律用概率密度p(x)表征。 问题归处&#xff1a;如果能够建模/近似建模p(x)&#…

ThinkPHP redirect 页面重定向使用详解与实例

ThinkPHP redirect 方法ThinkPHP redirect 方法可以实现页面的重定向&#xff08;跳转&#xff09;功能。redirect 方法语法如下&#xff1a;$this->redirect(string url, array params, int delay, string msg) 参数说明&#xff1a;url 必须&#xff0c;重定向的 URL 表达…

PaperNotes(9)-Learning deep energy model: contrastive divergence vs. Amortized MLE

Learning deep energy model: contrastive divergence vs. Amortized MLEabstract1 Introduction2 Background2.1 stein variational gradient descent2.2 learning energy model**contrastive Divergence**abstract 受SVGD算法的启发,本文提出两个算法用于从数据中学习深度能…

windows下的gvim配置

首要任务是下载安装Gvim7.3 。 安装完后&#xff0c;gvim菜单中文出现乱码&#xff0c;在_vimrcset文件中增加&#xff1a; " 配置多语言环境,解决中文乱码问题 if has("multi_byte") " UTF-8 编码 set encodingutf-8 set termencodingutf…

leetcode104 二叉树的最大深度

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 / \ 15 7 返回它的最大深度…

C++的安全类型转换的讨论

关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_ca…

PaperNotes(10)-Maximum Entropy Generators for Energy-Based Models

Maximum Entropy Generators for Energy-Based ModelsAbstract1 Introduction2 Background3 Maximum Entropy Generators for Energy-Based Models4 Experiments5 Related Work6 Conclusion7 AcknowledgementsAbstract 由于对数似然梯度的难以计算&#xff0c;能量模型的最大似…

leetcode105 前序中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a; 3 / \ 9 20 / \ 15 7 思路&#xff1a; 1、…

c++的虚拟继承 的一些思考吧

虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class …

对于linux socket与epoll配合相关的一些心得记录

对于linux socket与epoll配合相关的一些心得记录 没有多少高深的东西&#xff0c;全当记录&#xff0c;虽然简单&#xff0c;但是没有做过测试还是挺容易让人糊涂的int nRecvBuf32*1024;//设置为32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int))…

leetcode144 二叉树的前序遍历

给定一个二叉树&#xff0c;返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 思路&#xff1a;模仿递归的思路压栈即可。 /*** Definition for a bi…