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: /***************************************************************** ...
随机推荐
- java中的文件下载
package com.pb.down;import java.io.File;import java.io.FileInputStream;import java.io.IOException; i ...
- CocosCreator资源工作流程
--摘自官方文档 资源工作流程 添加资源 资源管理器 提供了三种在项目中添加资源的方式: 通过 创建按钮 添加资源 在操作系统的文件管理器中,将资源文件复制到项目资源文件夹下,之后再打开或激活 Coc ...
- 简单理解Linux的Loopback接口
Linu支持环回接口( Loopback Interface),以允许运行在同一台主机上的客户程序和服务器程序通TCP/IP进行通信. A 类网络127就是为环回接口预留的 .根据惯例,大多数系统把I ...
- C#编程(八十一)---------- 捕获异常
捕获异常 前面主要说了关于异常的一些基础和理论知识,没有进入到正真的异常案例,这一讲通过几个案例来描述一下异常的捕获和处理. 案例代码: using System; using System.Coll ...
- 慎用ArrayList的contains方法,使用HashSet的contains方法代替
在启动一个应用的时候,发现其中有一处数据加载要数分钟,刚开始以为是需要load的数据比较多的缘故,查了一下数据库有6条左右,但是单独写了一个数据读取的方法,将这6万多条全部读过来,却只需要不到10秒钟 ...
- 修改Unity中Lua文件的默认打开程序
项目中引用了XLua,而Lua文件又是以txt文件结尾的,当修改系统的扩展脚本编辑器为vs后双击lua文件(xx.txt)默认也使用vs打开了,无提示的黑白文本编辑 昨办? -. 后来看到网上有写Un ...
- C#调试心经
我们在做程序开发时,难免会遇到错误异常.如何快速地找到出错的地方.分析错误的原因以及找到解决问题的方案,是许多初级程序员困扰的问题,这也正是经验的宝贵之处.下面我将简单介绍在Visual Studio ...
- 了解 JavaScript (2)- 需要了解的一些概念
Ajax 是什么 Ajax 是一种创建交互式 Web 应用程序的方式. Ajax 是 Asynchronous JavaScript and XML 缩写(异步的 JavaScript 和 XML), ...
- 【机器学习算法-python实现】採样算法的简单实现
1.背景 採样算法是机器学习中比較经常使用,也比較easy实现的(出去分层採样).经常使用的採样算法有下面几种(来自百度知道): 一.单纯随机抽样(simple random samp ...
- vue中使用some删除list中的数据
在vue中可以使用some方法查找需要删除的所以 this.list.some((item, i) => { if (item.id == id) { this.list.splice(i, 1 ...