50行代码实现GAN | 干货演练
2014年,Ian Goodfellow和他的同事发表了一篇论文,向世界介绍了生成对抗网络(GAN)。通过对计算图和博弈论的创新性组合,他们表明如果有足够的建模能力,两个相互对抗的模型可以通过普通的反向传播进行共同训练。
模型具有两个不同的角色。给定数据集R,生成器G试图创建类似真实数据的假数据,鉴别器D分辨真实数据或假数据,并计算它们的差异。Goodfellow将G比喻为一群伪造者试图创作真实的绘画作品,而D则是试图分辨真假绘画的侦探团队。(除了这个例子,G从没有接触到真实的数据,只有鉴别器D可以看到。)
理想情况下,D和G都会越来越好,直到G可以完全模仿真实的绘画,并且D不能分辨真假。
在实践中,Goodfellow展示了G使用真实数据集进行无监督学习,找到某种简单的方式表示该数据。正如Yann LeCun所说,无监督学习才是人工智能真正的“蛋糕”。
这种方法是否需要很多代码才能实现?实际上使用PyTorch,我们可以只用50行代码就可以创建一个非常简单的GAN。一共需要考虑5个部分:
R:原始数据集
I:输入生成器的随机噪声
G:模仿原始数据集的生成器
D:辨别器
不断训练G去欺骗D,而D进行分辨。
1.)R:我们从最简单的R - 正态分布曲线开始。该函数输入均值和标准差,返回一个生成样本数据的函数,这些数据使用带参数的高斯函数生成的。我们的代码中平均值为4.0,标准差为1.25。
2.)I:生成器的输入是随机的,但是为了增加一点难度,我们使用均匀分布而不是正态分布。这意味着模型G不能简单地通过转换或缩放得到R,而是必须以非线性方法生成数据。
3.)G:生成器是标准的前向传播图,两个隐藏层,三个全连接层,双曲正切激活函数。G从I中输入均匀分布的数据样本,以某种方式模仿R的正态分布,即使它没有接触过R。
4.)D:鉴别器与生成器G的代码非常相似。它是有两个隐藏层,三个全连接层的前向图。激活函数是sigmoid。它从R或G获取数据,并输出0到1之间的数字,用来表示“真”或“假”。换句话说,这也是一般的神经网络做的事情。
5.)最后,不断在这两个模型之间交替训练:首先使用用真实的数据集训练D分辨真实数据和虚假数据, 然后训练G生成虚假数据欺骗D。
即使你之前没有接触过PyTorch也可以大概了解上面代码的运行过程。在绿色部分,通过向D输入真实或虚假的数据,并在D的预测结果和真实标签之间应用交叉熵函数。这是“前向传播”的步骤; 然后调用'backward()'函数计算梯度,调用 d_optimizer.step() 更新D的参数。这里用到了G但没有对它进行训练。
在红色部分,对G做同样的过程。注意我们将G的输出作为D的输入(给伪造者一个侦探进行练习),但不对D进行优化,因为不能让辨别器D学习错误的标签。因此我们只调用 g_optimizer.step()。
上面就是所有的过程。当然还有一些其他代码,但GAN主要就是这5个部分。
经过几千轮的迭代,鉴别器D能力提高的很快(相对来说G提高的比较慢),但是一旦到达某种程度,生成器G就会因为有一个相当优秀的对手并开始迅速的提高能力。
经过5,000轮的训练,每轮都训练了生成器G20次,鉴别器D20次。G输出的均值超过了4.0,但随后回到了正确的范围(左)并稳定下来。同样的,标准差刚开始在较低的位置徘徊,但随后上升到正确的1.25范围(右),和数据集R相同。
最终结果的统计数据和数据集R相匹配。但是分布的形状是否相同呢?毕竟,也有均值4.0,标准差为1.25,但与R不同的均匀分布。看一下G的最终分布:
挺好。右下比左下胖一点,可能偏态和峰度受到了原始数据的影响。
生成器G几乎完美还原了原始数据集R,并且辨别器D几乎无法分辨。这正是我们想要的结果。实现这个一共只有不到50行的代码。
提醒:GAN比较挑剔,而且比较脆弱。当它们进入了某种状态,可能会得到其他奇怪的结果。运行示例代码十次(每次超过5,000轮迭代)后得到了下面十个分布结果:
可以看到十次运行中有八次结果符合分布。但有两次不符合。其中一种情况(第5次运行)出现了凹面的分布,均值约为6.0。最后一次运行结果(第10次运行),在值 -11 处有一个狭窄的峰值!当你在其他环境中使用GAN时,它并不像有监督学习那样稳定。但是当它们正常工作时,它们的效果就非常好。
50行代码实现GAN | 干货演练的更多相关文章
- python爬虫实战:利用scrapy,短短50行代码下载整站短视频
近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...
- 50行代码实现python计算器主要功能
实现功能:计算带有括号和四则运算的式子 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 基本思路:使用正则表达式提取出每一层 ...
- 50行代码实现缓存,JAVA内存模型原理
遇见这样的高人怎么办??下面是一个简单缓存的实现,相当牛叉!自己看吧,只有50行代码. 摘自:http://www.oschina.net/code/snippet_55577_3887 import ...
- HTML5游戏实战(1):50行代码实现正面跑酷游戏
前段时间看到一个"熊来了"的HTML5跑酷游戏,它是一个典型的正面2D跑酷游戏,这里借用它来介绍一下用Gamebuilder+CanTK开发正面跑酷游戏的基本方法. CanTK(C ...
- 基于requirejs+bluebird,50行代码实现轻巧实用的前端CMD加载器
首先是github地址,可以用git克隆命令也可以直接在git页面下载 https://github.com/kazetotori/js-requireAsync 下载下来后目录结构是这样的 -pac ...
- [Lua]50行代码的解释器,用来演示lambda calculus
嗯,来写写经过: 在知乎上看见用Belleve牛用javascript写了一个精简的lisp解释器 => 我也想写一个,用lua写,能多简单呢? => 写了一个阉割的scheme解释器,包 ...
- OpenCV图像识别初探-50行代码教机器玩2D游戏【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 50行代码仿backbone_todos
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 50行代码实现的高性能动画定时器 raf-interval
写在前面 raf-interval 是基于 window.requestAnimationFrame() 封装的定时器. Github: https://github.com/dntzhang/raf ...
随机推荐
- 最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/
最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/,帮忙找找bug,网站里有源码地址 网站说明 甲壳虫社区(Beetle Community) 一个开源 ...
- vim 编辑器技巧 打开多窗口编辑 vsp
我有两个配置文件 [root@gameserver1 conf]# ls auth_1.json auth_2.json 先打开auth_2.json 在vim编辑器中打开auth_1.json,在打 ...
- LeetCode 题解 | 面试题 10.01. 合并排序的数组
给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B. 编写一个方法,将 B 合并入 A 并排序. 初始化 A 和 B 的元素数量分别为 m 和 n. 示例: 输入: A = [ ...
- 8421BCD转余3码Verilog HDL的设计(1)
近期阅读Verilog HDL高级数字设计(第二版)中,遇到了串行比特流BCD码转余3码转换器的设计,比较独特的是: (1)该转换器的输入为1位串行比特流,输出也为1位串行比特流. BCD码与余三码的 ...
- 《即时消息技术剖析与实战》学习笔记11——IM系统如何保证服务高可用:流量控制和熔断机制
IM 系统的不可用主要有以下两个原因: 一是无法预测突发流量,即使进行了服务拆分.自动扩容,但流量增长过快时,服务已经不可用了: 二是业务中依赖的这些接口.资源不可用或变慢时,比如发消息可能需要依赖& ...
- Win10系统下安装tensorflow(cpu)+keras+jupyter notebook运行环境
记录,自用 1.安装Anaconda(这里安装的是python3.6版本) 2.创建tensorflow的conda环境 conda create -n tensorflow python=3.6 3 ...
- Docker Compose + Traefik v2 快速安装, 自动申请SSL证书 http转https 初次尝试
前言 昨晚闲得无聊睡不着觉,拿起服务器尝试部署了一下Docker + Traefik v2.1.6 ,以下是一些配置的总结,初次接触,大佬勿喷. 我的系统环境是 Ubuntu 18.04.3 LTS ...
- 02 layui 下载和搭建环境
Layui官方网站 官方网站:https://www.layui.com/ 下载地址:https://res.layui.com/static/download/layui/layui-v2.5.5. ...
- web实验二 ---通过jQuery实现用户注册身份验证
通过jQuery实现用户注册身份验证,当每个文本框失去焦点时进行该文本框内容校验,并将校验信息在文本框右侧显示出结果. 具体校验要求: 1.用户名由6-18位字符组成 2.密码由6-18位字符组成,且 ...
- HTTP中主要的头字段
HTTP中主要的头字段 头字段类型 含义 备注 通用头:适用于请求和响应消息的头字段 Date 表示请求和响应生成的日期 Pragma 表示数据是否允许缓存的通信选项 Cache-Contro ...