talk is cheap, show me the code——dcgan,wgan,wgan-gp的tensorflow实现
最近学习了生成对抗网络(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实现的更多相关文章
- [ 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& ...
- [ Talk is Cheap Show me the CODE ] : jQuery Mobile页面布
[ Talk is Cheap Show me the CODE ] : jQuery Mobile页面布局 当我们专注地研究人类生活的空虚,并考虑荣华富贵空幻无常时,或许我们正在阿谀逢迎自己懒惰的天 ...
- [ Talk is Cheap Show me the CODE ] : jQuery Mobile页面布局
当我们专注地研究人类生活的空虚,并考虑荣华富贵空幻无常时,也许我们正在阿谀逢迎自己懒惰的天性. Written In The Font 为了app的手机端,我选择了 jQuery Mobile ,学 ...
- Talk is cheap. Show me the code.
Talk is cheap. Show me the code. -- Linux创始人 Linus Torvalds 2000-08-25 Stay hungry Stay foolish -- 乔 ...
- 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 ...
- 第13讲 | 套接字Socket:Talk is cheap, show me the code
第13讲 | 套接字Socket:Talk is cheap, show me the code 基于 TCP 和 UDP 协议的 Socket 编程.在讲 TCP 和 UDP 协议的时候,我们分客户 ...
- DCGAN、WGAN、WGAN-GP、LSGAN、BEGAN原理总结及对比
DCGAN.WGAN.WGAN-GP.LSGAN.BEGAN原理总结及对比 from:https://blog.csdn.net/qq_25737169/article/details/7885778 ...
- 花果山第一届猿类分级考试实录--Talk is cheap,Show me the code
本故事纯属虚构,如有雷同,纯属巧合! 故事背景 悟空师徒4人取经回来后,因不耐收到管教,就回到了花果山,带领一帮猴子猴孙逍遥自在的过日子,奈何因在阎王殿里将生死薄中的猴子猴孙的名字都划去了,猴子猴孙是 ...
- [code segments] OpenCV3.0 SVM with C++ interface
talk is cheap, show you the code: /***************************************************************** ...
随机推荐
- LED类代码
/* led.c文件 标题: 点亮一个了LED灯 电路:开发板中P2口已接到LED灯的阴极 */ #include <reg52.h> #include "led1.h&qu ...
- lambda、map、reduce、filter函数讲解
# coding:utf-8 """ 几个特殊的函数: lambda lambda后面直接跟变量 变量后面是冒号 冒号后面是表达式,表达式计算结果就是本函数的返回值 作用 ...
- android: 使用本地广播
前面我们发送和接收的广播全部都是属于系统全局广播,即发出的广播可以被其他任何 的任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播.这样就很容 易会引起安全性的问题,比如说我们发送的一 ...
- 【springboot】【socket】spring boot整合socket,实现服务器端两种消息推送
参考地址:https://www.cnblogs.com/hhhshct/p/8849449.html
- JVM Debugger Memory View for IntelliJ IDEA
Posted on August 19, 2016 by Andrey Cheptsov Every day we try to find new ways to improve developer ...
- ubuntu代替方案
你在使用Ubuntu,可是希望桌面体验……来得更眩目一点.虽说你总是可以添加新的桌面背景,或者索性切换桌面,但是你还有这个选择:换成一种全然不同的发行版. 本文就介绍了五个极其出色的Ubuntu替代发 ...
- Python中Queue模块及多线程使用
Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个 ...
- 用户人品预测大赛--getmax队--竞赛分享
用户人品预测大赛--getmax队--竞赛分享 DataCastle运营 发表于 2016-3-24 14:49:32 533 0 0 答辩PPT
- Android夜间模式的几种实现
一.直接修改widget颜色,这种方式实现起来最简单,但需要每个控件都去修改,太过复杂.例如: /** * 相应交互,修改控件颜色 * @param view */public void onMeth ...
- grid - gap
grid-gap默认还有两个参数 如果grid写默认方式,则行.列都会使用相同的单位 如果grid写两个参数,则行和列各自生效 如果grid写行方式,则仅有行生效 如果grid写列方式,则仅有列生 ...