生成性对抗网络技术实现

Generative Adversarial Networks

以某种形式,使用深度神经网络学习从数据点到标签的映射。这种学习被称为区别性学习,因为希望能够区分猫和狗的照片。量词和回归词都是区别学习的例子。而由反向传播训练的神经网络颠覆了认为在大型复杂数据集上进行区分学习的一切。在仅仅5-6年的时间里,高分辨率图像的分类精度已经从无用的提高到了人类的水平(有一些警告)。将为提供另一个关于所有其区分性任务的细节,在这些任务中,深层神经网络做得非常好。

但是机器学习不仅仅是解决有区别的任务。例如,给定一个没有任何标签的大型数据集,可能需要学习一个简洁地捕捉这些数据特征的模型。给定这样一个模型,就可以抽取与训练数据分布相似的合成数据点。例如,给定大量的人脸照片,可能希望能够生成一个新的照片级真实感图像,看起来似乎似乎来自同一个数据集。这种学习被称为生成性建模。

直到最近,还没有一种方法可以合成新的真实感图像。但是,深度神经网络在区分学习中的成功开辟了新的可能性。在过去三年中,一个大趋势是应用有区别的深层网络来克服通常不认为是有监督学习问题的问题的挑战。递归神经网络语言模型是一个使用判别网络(训练以预测下一个字符)的一个例子,一旦训练,就可以作为一个生成模型。 2014年,一篇突破性的论文介绍了生成性对抗性网络(GAN)[Goodfello等人,2014],这是一种巧妙的新方法,可以利用区分模型的能力来获得良好的生成模型。GANs的核心思想是,如果不能区分假数据和真实数据,那么数据生成器是好的。在统计学中,这被称为两个样本测试-一个用来回答是否有数据集的测试

X={x1,…,xn} and X′={x′1,…,x′n}

来自同一分布。大多数统计论文与GAN的主要区别在于后者以建设性的方式运用了这一观点。换句话说,不只是训练一个模型说“嘿,这两个数据集看起来不像来自同一个分布”,而是使用两个样本测试为生成模型提供训练信号。这允许改进数据生成器,直到生成与实际数据相似的内容。至少,需要愚弄分类器。即使分类器是最先进的深层神经网络。

Fig. 1 Generative Adversarial Networks

GAN架构如图1所示。正如所看到的,在GAN架构中有两个部分-首先,需要一个设备(比如说,一个深度网络,但实际上可以是任何东西,比如游戏渲染引擎),可能有可能生成看起来像真实的数据。如果要处理图像,就需要生成图像。如果在处理语音,需要生成音频序列,等等。称之为发启generator网络。第二部分是鉴别器网络。试图区分假数据和真数据。这两个网络互相竞争。生成器网络试图欺骗鉴别器discriminator网络。此时,鉴别器discriminator网络适应新的假数据。这些信息,反过来又被用来改进generator网络,等等。


%matplotlib inline

from d2l import mxnet as d2l

from mxnet import autograd, gluon, init, np, npx

from mxnet.gluon import nn

npx.set_np()

  1. Generate some “real” data

由于这将是世界上最蹩脚的例子,只需从高斯函数中生成数据。

X = np.random.normal(size=(1000, 2))

A = np.array([[1, 2], [-0.1, 0.5]])

b = np.array([1, 2])

data = X.dot(A) + b

让看看得到了什么。这应该是高斯位移,平均值b,以某种相当任意的方式平均协方差矩阵ATA。

d2l.set_figsize((3.5, 2.5))

d2l.plt.scatter(data[:100, 0].asnumpy(), data[:100, 1].asnumpy());

print(“The covariance matrix is\n%s” % np.dot(A.T, A))

The covariance matrix is

[[1.01 1.95]

[1.95 4.25]]

batch_size = 8

data_iter = d2l.load_array((data,), batch_size)

  1. Generator

发启Generator网络将是最简单的网络-单层线性模型。这是因为将用高斯数据Generator驱动线性网络。因此,实际上只需要学习参数就可以完美地伪造东西。

net_G = nn.Sequential()

net_G.add(nn.Dense(2))

  1. Discriminator

对于鉴别器Discriminator,将更具鉴别力:将使用一个3层的MLP使事情变得更有趣。

net_D = nn.Sequential()

net_D.add(nn.Dense(5, activation=‘tanh’),

      nn.Dense(3, activation='tanh'),nn.Dense(1))
  1. Training

首先定义了一个函数来更新鉴别器discriminator。

#@save

def update_D(X, Z, net_D, net_G, loss, trainer_D):

"""Update discriminator."""batch_size = X.shape[0]ones = np.ones((batch_size,), ctx=X.ctx)zeros = np.zeros((batch_size,), ctx=X.ctx)with autograd.record():real_Y = net_D(X)fake_X = net_G(Z)# Do not need to compute gradient for net_G, detach it from# computing gradients.fake_Y = net_D(fake_X.detach())loss_D = (loss(real_Y, ones) + loss(fake_Y, zeros)) / 2loss_D.backward()trainer_D.step(batch_size)

return float(loss_D.sum())

生成器也同样更新。但是从这里的重复使用熵的标签改变了假数据0到 1。

#@save

def update_G(Z, net_D, net_G, loss, trainer_G): # saved in d2l

"""Update generator."""batch_size = Z.shape[0]ones = np.ones((batch_size,), ctx=Z.ctx)with autograd.record():# We could reuse fake_X from update_D to save computation.fake_X = net_G(Z)# Recomputing fake_Y is needed since net_D is changed.fake_Y = net_D(fake_X)loss_G = loss(fake_Y, ones)loss_G.backward()trainer_G.step(batch_size)

return float(loss_G.sum())

鉴别器Discriminator和产生器Generator都执行带有交叉熵损失的二元逻辑回归。用Adam来平滑训练过程。在每次迭代中,首先更新鉴别器Discriminator,然后更新生成器Generator。将损失和产生的例子都形象化。

def train(net_D, net_G, data_iter, num_epochs, lr_D, lr_G, latent_dim, data):

loss = gluon.loss.SigmoidBCELoss()net_D.initialize(init=init.Normal(0.02), force_reinit=True)net_G.initialize(init=init.Normal(0.02), force_reinit=True)trainer_D = gluon.Trainer(net_D.collect_params(),'adam', {'learning_rate': lr_D})trainer_G = gluon.Trainer(net_G.collect_params(),'adam', {'learning_rate': lr_G})animator = d2l.Animator(xlabel='epoch', ylabel='loss',xlim=[1, num_epochs], nrows=2, figsize=(5, 5),legend=['generator', 'discriminator'])animator.fig.subplots_adjust(hspace=0.3)for epoch in range(1, num_epochs+1):# Train one epochtimer = d2l.Timer()metric = d2l.Accumulator(3)  # loss_D, loss_G, num_examplesfor X in data_iter:batch_size = X.shape[0]Z = np.random.normal(0, 1, size=(batch_size, latent_dim))metric.add(update_D(X, Z, net_D, net_G, loss, trainer_D),update_G(Z, net_D, net_G, loss, trainer_G),batch_size)# Visualize generated examplesZ = np.random.normal(0, 1, size=(100, latent_dim))fake_X = net_G(Z).asnumpy()animator.axes[1].cla()animator.axes[1].scatter(data[:, 0], data[:, 1])animator.axes[1].scatter(fake_X[:, 0], fake_X[:, 1])animator.axes[1].legend(['real', 'generated'])# Show the lossesloss_D, loss_G = metric[0]/metric[2], metric[1]/metric[2]animator.add(epoch, (loss_D, loss_G))print('loss_D %.3f, loss_G %.3f, %d examples/sec' % (loss_D, loss_G, metric[2]/timer.stop()))

现在指定超参数来拟合高斯分布。

lr_D, lr_G, latent_dim, num_epochs = 0.05, 0.005, 2, 20

train(net_D, net_G, data_iter, num_epochs, lr_D, lr_G,

  latent_dim, data[:100].asnumpy())

loss_D 0.693, loss_G 0.693, 577 examples/sec

5. Summary

Generative adversarial networks (GANs) composes of two deep networks, the generator and the discriminator.
The generator generates the image as much closer to the true image as possible to fool the discriminator, via maximizing the cross-entropy loss, i.e., maxlog(D(x′))maxlog⁡(D(x′)).
The discriminator tries to distinguish the generated images from the true images, via minimizing the cross-entropy loss, i.e., min−ylogD(x)−(1−y)log(1−D(x))

生成性对抗网络技术实现相关推荐

  1. 生成性对抗网络(GAN) 和styleGan

    生成性对抗网络(GAN)是机器学习中一个相对较新的概念,于2014年首次引入.他们的目标是合成与真实图像无法区分的人工样本,如图像.GAN应用程序的一个常见示例是通过从名人面孔数据集学习来生成人造人脸 ...

  2. 【小白学习PyTorch教程】十一、基于MNIST数据集训练第一个生成性对抗网络

    「@Author:Runsen」 GAN 是使用两个神经网络模型训练的生成模型.一种模型称为生成网络模型,它学习生成新的似是而非的样本.另一个模型被称为判别网络,它学习区分生成的例子和真实的例子. 生 ...

  3. MM2018/风格迁移-Style Separation and Synthesis via Generative Adversarial Networks通过生成性对抗网络进行风格分离和合成

    Style Separation and Synthesis via Generative Adversarial Networks通过生成性对抗网络进行风格分离和合成 0.摘要 1.概述 2.相关工 ...

  4. 【论文翻译】Auto-painter:基于条件Wasserstein生成性对抗网络的草图卡通形象生成

    Auto-painter: Cartoon image generation from sketch by using conditional Wasserstein generative adver ...

  5. 生成神经对抗网络(GAN)的基本认识及应用

    视频讲解GANr简单的了解:5分钟秒懂生成对抗网络 - 知乎 生成对抗网络(GAN)是生成模型的一种神经网络架构. GAN是使用两个神经网络模型训练而成的一种生成模型.其中一个称为"生成器& ...

  6. 了解生成对抗网络(GAN)

    2019-01-08 23:29:25 介绍 什么是Generative Adversarial Networks(生成对抗性网络)?本文中,我们将看到对抗性训练是一种很有启发性的想法,其简单而实用, ...

  7. 判别两棵树是否相等 设计算法_一文看懂生成对抗网络 - GANs?(附:10种典型算法+13种应用)...

    生成对抗网络 – GANs 是最近2年很热门的一种无监督算法,他能生成出非常逼真的照片,图像甚至视频.我们手机里的照片处理软件中就会使用到它. 本文将详细介绍生成对抗网络 – GANs 的设计初衷.基 ...

  8. 一文看懂「生成对抗网络 - GAN」基本原理+10种典型算法+13种应用

    生成对抗网络 – Generative Adversarial Networks | GAN 文章目录 GAN的设计初衷 生成对抗网络 GAN 的基本原理 GAN的优缺点 10大典型的GAN算法 GA ...

  9. 【论文分享】MAD-GAN :基于生成对抗网络的时间序列数据多元异常检测

    2019年ICANN文章 MAD-GAN: Multivariate Anomaly Detection for Time Series Data with Generative Adversaria ...

最新文章

  1. 2021年大数据Spark(五十一):Structured Streaming 物联网设备数据分析
  2. 关于互联网技术基层绩效管理的一些思考
  3. 黑客都用Python?学习Python的4个理由!
  4. opencv jni Android 实例笔记
  5. php 上个月天数,php日期所在月的天数_PHP教程
  6. [architecture]-spin_unlock中是怎样让cpu退出standby模式的?
  7. redux中间件的用法
  8. 查看NTFS文件系统版本号
  9. ETL异构数据源Datax_使用querySql_08
  10. MyBatis学习总结(19)——Mybatis传多个参数(三种解决方案)
  11. 华为机试HJ15:求int型正整数在内存中存储时1的个数
  12. 批量修改图片格式类型
  13. City2vec:一种学习人口迁徙网络知识的新方法
  14. ecshop模板构建说明
  15. c语言程序设计小球弹跳,C语言实现弹跳小球
  16. 关于TDataSet和TFDJsonDataSets在处理数据库字段的字符集和执行效率方面的比较
  17. Linux之Platform设备驱动
  18. 世界各国坐标、中国各省会坐标、echars世界各国中英映射和省市区联动数据
  19. Python小虫收集箱
  20. 怎么证明:向量组A1,A2…As可由向量组B1,B2…Bt线性表出,且s>t,那么A…As线性相关?

热门文章

  1. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin
  2. python二进制打开(rb)和文本格式打开(r)什么区别?
  3. 2019秋招面试常考题目
  4. SpringCloud Alibaba微服务实战(一) - 基础环境搭建
  5. bert as service
  6. 正则表达式 - 语法
  7. 单步调试 step into/step out/step over 区别
  8. LeetCode简单题之反转单词前缀
  9. LLVM 编译器和工具链技术
  10. IaaS、PaaS 和 SaaS:云服务模型概述