生成对抗网络(GAN)
GAN的全称是 Generative Adversarial Networks,中文名称是生成对抗网络。原始的GAN是一种无监督学习方法,巧妙的利用“博弈”的思想来学习生成式模型。
1 GAN的原理
GAN的基本原理很简单,其由两个网络组成,一个是生成网络G(Generator) ,另外一个是判别网络D(Discriminator)。它们的功能分别是:
生成网络G:负责生成图片,它接收一个随机的噪声 $z$,通过该噪声生成图片,将生成的图片记为 $G(z)$。
判别网络D:负责判别一张图片是真实的图片还是由G生成的假的图片。其输入是一张图片 $x$ ,输出是0, 1值,0代表图片是由G生成的,1代表是真实图片。
在训练过程中,生成网路G的目标是尽量生成真实的图片去欺骗判别网络D。而判别网络D的目标就是尽量把G生成的图片和真实的图片区分开来。这样G和D就构成了一个动态的博弈过程。这是GAN的基本思想。
在最理想的状态下,G可以生成足以“以假乱真”的图片 $G(z)$。对于D来说,它难以判断G生成的图片究竟是不是真实的,因此 $D(G(z)) = 0.5$ (在这里我们输入的真实图片和生成的图片是各一半的)。此时得到的生成网络G就可以用来生成图片。
2 GAN损失函数
从数学的角度上来看GAN,假设用于训练的真实图片数据是 $x$,图片数据的分布为 $p_{data}(x)$,生成网络G需要去学习到真实数据分布 $p_{data}(x)$。噪声 $z$ 的分布假设为$p_z(z)$,在这里 $p_z(z)$是已知的,而 $p_{data}(x)$ 是未知的。在理想的状态下$G(z)$ 的分布应该是尽可能接近$p_{data}(x)$,G将已知分布的$z$ 变量映射到位置分布 $x$ 变量上。
根据交叉熵损失,可以构造下面的损失函数:
$ V(D,G) = E_{x~p_{data}(x)} [ln D(x)] + E_{z~p_z(z)} [ln(1-D(G(z)))] $
其实从损失函数中可以看出和逻辑回归的损失函数基本一样,唯一不一样的是负例的概率值为 $ 1-D(G(z))$。
损失函数中加号的前一半是训练数据中的真实样本,后一半是从已知的噪声分布中取的样本。下面对这个损失函数详细描述:
1)整个式子有两项构成。 $x$表示真实图片,$z$表示输入G网络的噪声,而$G(z)$ 表示G网络生成的图片。
2)$D(x)$ 表示D网络判断真实图片是否真实的概率 ,即 $P(y=1 | x)$。而$D(G(z))$ 是D网络判断$G$生成的图片是否真实的概率。
3)G的目的:G应该希望自己生成的图片越真实越好。也就是说G希望 $D(G(z))$ 尽可能大,即$P(G(z) = 1 | x)$,这时 $V(D, G)$ 尽可能小。
4)D的目的:D的能力越强,$D(x)$ 就应该越大,$D(G(x))$应该越小(即假的图片都被识别为0)。因此D的目的和G的目的不同,D希望 $V(D, G)$ 越大越好。
3 GAN建模流程
在实际训练中,使用梯度下降法,对D和G交替做优化,具体步骤如下:
1)从已知的噪声分布 $p_z(z)$中选取一些样本
${z_1, z_2, ......, z_m}$
2)从训练数据中选出同样个数的真实图片
${x_1, x_2, ......, x_m}$
3)设判别器D的参数为 $\theta_d$,其损失函数的梯度为
$ \nabla \frac{1}{m} \sum_{i=1}^m [lnD(x_i) + ln(1-D(G(Z_I)))] $
4)设生成器G的参数为 $\theta_g$,其损失函数的梯度为
$ \nabla \frac{1}{m} \sum_{i=1}^m [ln(1-D(G(Z_I)))] $
在上面的步骤中,每更新一次D的参数,紧接着就更新一次G的参数,有时也可以在更新 $k$ 次D的参数,再更新一次G的参数。
生成对抗网络(GAN)的更多相关文章
- 用MXNet实现mnist的生成对抗网络(GAN)
用MXNet实现mnist的生成对抗网络(GAN) 生成式对抗网络(Generative Adversarial Network,简称GAN)由一个生成网络与一个判别网络组成.生成网络从潜在空间(la ...
- TensorFlow从1到2(十二)生成对抗网络GAN和图片自动生成
生成对抗网络的概念 上一篇中介绍的VAE自动编码器具备了一定程度的创造特征,能够"无中生有"的由一组随机数向量生成手写字符的图片. 这个"创造能力"我们在模型中 ...
- 人工智能中小样本问题相关的系列模型演变及学习笔记(二):生成对抗网络 GAN
[说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] [再啰嗦一下]本文衔接上一个随笔:人工智能中小样本问题相关的系列模型演变及学习 ...
- 生成对抗网络GAN介绍
GAN原理 生成对抗网络GAN由生成器和判别器两部分组成: 判别器是常规的神经网络分类器,一半时间判别器接收来自训练数据中的真实图像,另一半时间收到来自生成器中的虚假图像.训练判别器使得对于真实图像, ...
- 生成对抗网络(GAN)
基本思想 GAN全称生成对抗网络,是生成模型的一种,而他的训练则是处于一种对抗博弈状态中的. 譬如:我要升职加薪,你领导力还不行,我现在领导力有了要升职加薪,你执行力还不行,我现在执行力有了要升职加薪 ...
- 深度学习-生成对抗网络GAN笔记
生成对抗网络(GAN)由2个重要的部分构成: 生成器G(Generator):通过机器生成数据(大部分情况下是图像),目的是“骗过”判别器 判别器D(Discriminator):判断这张图像是真实的 ...
- 深度学习框架PyTorch一书的学习-第七章-生成对抗网络(GAN)
参考:https://github.com/chenyuntc/pytorch-book/tree/v1.0/chapter7-GAN生成动漫头像 GAN解决了非监督学习中的著名问题:给定一批样本,训 ...
- 科普 | 生成对抗网络(GAN)的发展史
来源:https://en.wikipedia.org/wiki/Edmond_de_Belamy 五年前,Generative Adversarial Networks(GANs)在深度学习领域掀起 ...
- 利用tensorflow训练简单的生成对抗网络GAN
对抗网络是14年Goodfellow Ian在论文Generative Adversarial Nets中提出来的. 原理方面,对抗网络可以简单归纳为一个生成器(generator)和一个判断器(di ...
- 原始的生成对抗网络GAN
论文地址:https://arxiv.org/pdf/1406.2661.pdf 1.简介: GAN的两个模型 判别模型:就是图中右半部分的网络,直观来看就是一个简单的神经网络结构,输入就是一副图像, ...
随机推荐
- Log4j的扩展RollingFileAppender、DailyRollingFileAppender
最常用的Appender--RollingFileAppender RollingFileAppender的一个Log4j配置样例: log4j.appender.R=org.apache.log4j ...
- [HTML/CSS]三角形
CSS盒子模型 当我们把padding和width,height全部设置为0,border设为一个较大的像素时 即:我们需要什么方向的三角形,只需把其余的三角形背景色设置为transparent:
- CSS3的媒体查询(Media Queries)与移动设备显示尺寸大全
媒体查询介绍 我今天就总结一下响应式设计的核心CSS技术Media(媒体查询器)的用法. 先看一个简单的例子: <link rel="stylesheet" media=&q ...
- HTML5效果:实现树叶飘落
实现如图所示的东西效果(落叶下落): html代码: <!DOCTYPE html> <html> <head> <title>HTML5树叶飘落动画& ...
- 洛谷P3245 [HNOI2016]大数(莫队)
题意 题目链接 Sol 莫队板子题.. 维护出每个位置开始的字符串\(mod P\)的结果,记为\(S_i\) 两个位置\(l, r\)满足条件当且仅当\(S_l - S_r = 0\),也就是\(S ...
- window.print()小知识
window.print() 实际上,是浏览器打印功能菜单的一种程序调用.与点击打印功能菜单一样,不能精确分页,不能设置纸型,套打的问题更加无从谈起,只不过,可以让用户不用去点菜单,直接点击网页中的 ...
- Dynamics 365 Online-Virtual Entities
转载来源https://blogs.technet.microsoft.com/lystavlen/2017/09/08/virtual-entities/,使用当前Dynamics 365环境,亲测 ...
- PyCharm快捷键使用
- Java判断一个字符是否是数字的几种方法的代码
在工作期间,将写内容过程经常用到的一些内容段做个记录,下面内容是关于Java判断一个字符是否是数字的几种方法的内容,希望能对码农们有好处. public class Test{ public stat ...
- 「破解」Xposed强
「破解」Xposed强 Hook Hook Hook! 两张图片,第一张是我的微信截图,第二张是我从微信Hook出的一些类名. 一段代码,Hook这些类名出来的源码. 知道这些我们能干嘛,当然是分析( ...