最近学习了生成对抗网络(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. BZOJ 5381 or & Codeforces 623E Transforming Sequence DP+NTT

    两道题题意都是一样的 不过$CF$的模数是$10^9+7$ 很简单的分析发现$A_i$项一定要有一个之前没有出现过的二进制位才能满足条件 考虑$DP$来做 设$f_{i,j}$表示$i$个数用了二进制 ...

  2. git配置SSH Key,上传本地代码至github

    git配置全局的name和email git config --global user.name "name" git config --global user.email &qu ...

  3. Simple PWM to Analog Circuit (0-10vdc)

    i just finished this simple circuit and am very satisfied with the result. The output is very stable ...

  4. delphi获取文件的创建/修改时间、按时间删除指定文件下的文件

    uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrl ...

  5. android 布局文件 ScrollView 中的 listView item 显示不全解决方案

    import android.content.Context;import android.util.AttributeSet;import android.widget.ListView; /** ...

  6. 【转】浅谈分布式服务协调技术 Zookeeper

    非常好介绍Zookeeper的文章, Google的三篇论文影响了很多很多人,也影响了很多很多系统.这三篇论文一直是分布式领域传阅的经典.根据MapReduce,于是我们有了Hadoop:根据GFS, ...

  7. 微信小程序 —— 动态决定页面元素显示或隐藏的技巧

    在微信小程序开发中,经常遇到一些由后台控制显示(is_open : 1)或者隐藏(is_open : 0),有俩种办法: 复杂办法 1.先在元素的class中 class=’{{show?’true’ ...

  8. 如何实现一个Java Class 解析器

    原文出处: tinylcy 最近在写一个私人项目,名字叫做ClassAnalyzer,ClassAnalyzer的目的是能让我们对Java Class文件的设计与结构能够有一个深入的理解.主体框架与基 ...

  9. iOS开发-NSUndoManager撤销(undo)和重做(redo)

    程序开发中我们经常会用到的两个快捷键Ctrl+Z和Ctrl+C,撤销和复制,Cocoa开发也可以实现这两个操作,为我们提供非常简单的操作类NSUndoManger,也可以称之为撤销管理器,NSUndo ...

  10. grid - 重复网格轨道

    使用repeat()可以创建重复的网格轨道.这个适用于创建相等尺寸的网格项目和多个网格项目 <view class="grid"> <view class='gr ...