最近学习了生成对抗网络(GAN),基于几个经典GAN网络结构做了些小实验,包括dcgan,wgan,wgan-gp。坦率的说,wgan,wgan-gp论文的原理还是有点小复杂,我也没有完全看明白,因此在此就不详细介绍了,如果感兴趣可以阅读参考部分的论文,本篇博客主要着重于记录如何利用tensorflow实现这几种网络的训练、预测。下面先简单介绍下GAN的原理和个人理解,以及dcgan,wgan,wgan-gp的改进,最后给出代码。

1.GAN原理和个人理解

Generative Adversarial Nets(GAN),生成对抗网络,是2014年由Goodfellow等人提出的一个深度学习框架,这个框架的目的是生成和真实图片概率分布一致的输出,也就是所谓的生成模型。该框架包含两部分:生成网络(Generator,简称G)、判别网络(Discriminator,简称D)。假设G的输入是z,输出是x’,真实数据是x,则G要尽量将输入映射到输出数据的分布上,即利用z尽量生成和x接近的x’。而D要尽量将x’和x区分开。具体公式如下:

上面公式中,G(z)是G的输出即x’。D要最大化这个公式,其实就是区分生成数据和真实数据之间的真假,是个二分类问题,也就是尽量将x分为1类、x’分为0类。另一方面,G又想尽量生成和真实数据近似的x’,这个就体现在欺骗D上,如果D无法分辨x’和x,就说明D成功生成了符合x分布的x’,因此G的目的是要让x'都被D分为1类(而不是0类)。又因第一部分logD(x)和G没关系,所以G的目标是最小化下面这个式子,

根据论文的说法,上面这个式子容易saturates,导致G训练出现困难,所以转化成最大化log(D(G(z)))。因为一般做优化都是求目标函数的最小值(当然tf也支持最大值),因此实际编程中是这么写的:

1. min[-log(D(x))-log(1-D(G(z)))]

2. min[-log(1-D(G(z)))]

实际上就是加了个负号。另外,在做前向后向的时候,一般是分别对D、G进行更新,也就是说在后向误差传播更新梯度的时候,会先固定G的参数(权重、偏置等),然后前向计算式1并做后向误差传播,更新G的参数。接着再固定G的参数,前向计算式2并做后向误差传播,更新D的参数。

最后再说下输入z,在没有label的经典gan中,z是一个符合正态分布的随机高维向量,至于在其他经典gan的变体中,z可以是正态分布的随机高维向量加上label,或者是纯label。

2.dcgan、wgan、wgan-gp

Dcgan于2015年提出,相比于最早的GAN相比,主要做了网络结构方面的改进,例如:引入bm层,去掉pooling以strided conv层代之,去掉fc层,引入relu和leakyRelu等等。这些改进效果带来了更好的生成图片效果,不过和早期GAN相比,依然很难训练,所以这个阶段也引入了训练时的一些小窍门,比如每个stepG迭代两次,D迭代一次。在一开始的时候D不能训练的太好,防止G难以收敛等等。

wgan在2017年横空出世,通过理论分析,wgan指出了传统gan的为什么训练时难以收敛,并进行了改进,使其训练难度大幅降低、收敛速度加快。主要有两点改进:一是把目标函数中的log去掉,二是每次迭代更新权重后做weight clipping,把权重限制到一个范围内(例如限定范围[-0.1,+0.1],则超出这个范围的权重都会被修剪到-0.1或+0.1)。

同年,wgan-gp又基于wgan提出了改进方案,因为wgan虽然降低了gan的训练难度,但在一些设定下仍然难以收敛,并且生成图片效果相比dcgan还要差,wgan-gp将weight clipping改为penalize the norm of the gradient of the critic with respect to its input(根据D的输入后向计算出权重梯度,并针对梯度的范数进行惩罚),解决了上述问题。

3.基于tf的代码实现

https://github.com/handspeaker/gan_practice

每种结构的代码都比较简洁,属于实验性质,没有加太多东西,看起来比一些github上很大的工程容易懂些。

4.参考

Generative Adversarial Nets

Wasserstein GAN

Improved Training of Wasserstein GANs

https://github.com/shekkizh/WassersteinGAN.tensorflow

https://github.com/igul222/improved_wgan_training

talk is cheap, show me the code——dcgan,wgan,wgan-gp的tensorflow实现的更多相关文章

  1. [ Talk is Cheap Show me the CODE ] : jQuery Mobile工具栏

    [ Talk is Cheap Show me the CODE ] : jQuery Mobile工具栏 Written In The Font " Wirte less Do more& ...

  2. [ Talk is Cheap Show me the CODE ] : jQuery Mobile页面布

    [ Talk is Cheap Show me the CODE ] : jQuery Mobile页面布局 当我们专注地研究人类生活的空虚,并考虑荣华富贵空幻无常时,或许我们正在阿谀逢迎自己懒惰的天 ...

  3. [ Talk is Cheap Show me the CODE ] : jQuery Mobile页面布局

    当我们专注地研究人类生活的空虚,并考虑荣华富贵空幻无常时,也许我们正在阿谀逢迎自己懒惰的天性. Written In The Font 为了app的手机端,我选择了 jQuery Mobile  ,学 ...

  4. Talk is cheap. Show me the code.

    Talk is cheap. Show me the code. -- Linux创始人 Linus Torvalds 2000-08-25 Stay hungry Stay foolish -- 乔 ...

  5. Talk is cheap. Show me the code的由来

    Date: Fri, 25 Aug 2000 11:09:12 -0700 (PDT) From:Linus Torvalds Subject Re: SCO: "thread creati ...

  6. 第13讲 | 套接字Socket:Talk is cheap, show me the code

    第13讲 | 套接字Socket:Talk is cheap, show me the code 基于 TCP 和 UDP 协议的 Socket 编程.在讲 TCP 和 UDP 协议的时候,我们分客户 ...

  7. DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理总结及对比

    DCGAN.WGAN.WGAN-GP.LSGAN.BEGAN原理总结及对比 from:https://blog.csdn.net/qq_25737169/article/details/7885778 ...

  8. 花果山第一届猿类分级考试实录--Talk is cheap,Show me the code

    本故事纯属虚构,如有雷同,纯属巧合! 故事背景 悟空师徒4人取经回来后,因不耐收到管教,就回到了花果山,带领一帮猴子猴孙逍遥自在的过日子,奈何因在阎王殿里将生死薄中的猴子猴孙的名字都划去了,猴子猴孙是 ...

  9. [code segments] OpenCV3.0 SVM with C++ interface

    talk is cheap, show you the code: /***************************************************************** ...

随机推荐

  1. [洛谷U40581]树上统计treecnt

    [洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...

  2. [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树

    [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树 题目大意: 给定一个\(n(n\le50)\)个点,\(m(m\le1000 ...

  3. python 数字

    python数字: 本文主要讲解常用的数字类型转换, 数字函数和随机数字函数. # coding:utf-8 # python数字类型转换 def data_conversion(): "& ...

  4. Android:ImageView控件

    ImageView 是用于在界面上展示图片的一个控件,通过它可以让我们的程序界面变得更加 丰富多彩.学习这个控件需要提前准备好一些图片,由于目前 drawable 文件夹下已经有一张 ic_launc ...

  5. error LNK1104:无法打开文件"lua51.lib"

    今天学习C++与Lua通信,遇到了问题:fatal error LNK1104: 无法打开文件“lua51.lib” 开发环境: VS2012 cocos版本:cocos2d-x-3.0 已经按书&l ...

  6. 你应该更新的 Java 知识之常用程序库【转载】

    在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进.如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东 ...

  7. ELK菜鸟手记 (一) 环境配置+log4j日志记录

    1. 背景介绍 在大数据时代,日志记录和管理变得尤为重要. 以往的文件记录日志的形式,既查询起来又不方便,又造成日志在服务器上分散存储,管理起来相当麻烦, 想根据一个关键字查询日志中某个关键信息相当困 ...

  8. JNI学习小结

    Java中类型与C/C++中对应关系   Java中的类的对应   Sign签名, 用来识别对应各个方法. JDK下的javap.exe能输出签名.用法javap -s -p 完整类名     下面是 ...

  9. Redis资料整理

    1.Redis命令參考中文简体版. 2.java操作redis.jedis使用api 3.Redis学习笔记. 4.浅谈Redis数据库的键值设计 5.Redis资料汇总专题 6.MongoDB资料汇 ...

  10. python + django + dwebsocket 实现简单的聊天室

    使用库dwebsocket,具体参考此处 views.py: from dwebsocket.decorators import accept_websocket,require_websocket ...