GAN快速入门(Pytorch based, 二维点集生成)

简介

GAN的主要结构包括一个生成器G(Generator)和一个判别器D(Discriminator)。生成器接受一段从各向同性高斯分布中采样的噪声向量,输出我们的目标产物。判别器负责给这个产物打分,判断它像不像真实的物体。
我们的训练方法就是,让判别器尽可能地分辨真假,也就是以真实物体标签为1,虚假的产物标签为0,训练判别器。与此同时,让生成器的参数学会欺骗判别器,也就是虚假的产物标签为1,训练生成器。
一般来说,为了让生成器的训练更高效,我们会先更新k次判别器的参数,再去训练一次生成器,这样生成器将能从判别器中学到更多东西。如果判别器的质量并不好,生成器的更新很有可能是朝着一个不利的方向进行的。
在这里插入图片描述

原理

在这里插入图片描述

上图的概率分布表示比较直观地体现了训练过程,黑色虚线表示真实样本,蓝色虚线表示判别器概率分布,绿色实线表示生成器分布。我们要用绿线拟合黑线;首先,可以看到生成器处于真是分布偏左的位置。判别器训练,从a到b的过程让判别器形成了左高右低的分布。然后训练生成器,生成器会让概率分布趋向于判别器分布高的一侧,也就是左侧,即c图。反复迭代这个过程,就能让判别器变成一个无法分辨真假的判别器,而与此同时生成器也拟合了真实概率分布。
如我们上面说的,损失函数写做
在这里插入图片描述
GAN有着不同于过去的生成式模型的独特性质,它不再是简单的用概率分布去近似数据分布,而是创造一个崭新的数据分布,同时我们要求这个数据分布具有原数据分布的必要性质。
一般来说,如果我们搭建高斯混合模型或者自编码器这种概率模型去无监督近似数据分布,我们相当于是把原数据分布的概率大小记在了模型中。这种模型在做分类、数据修复、数据降维等任务时能取得不错的成效,但当我们只是从这个模型的概率分布中采样,则只能遗憾的得到和训练数据几乎相同的输出,这并称不上创造,最多只是学习。
我们想要的是,从原数据中提取出必要的特征,并让生成模型能生成一个和训练数据不同,但同时具有这些特征的新数据。为此,GAN从零开始学习数据的特征,但GAN不是直接从数据中学习;我们先通过其他模型在数据集上训练一个区分生成器生成的数据和原数据的二分类器,再用这个二分类器提取出的特征,手把手让生成器学会这些特征,让生成的数据能在判别器上取得欺骗的效果。
从概率角度解释GAN,GAN可以拟合向训练点分配0概率的概率分布,生成器网络学习的不是最大化训练集上数据点的最大似然,而是类似训练点的流形。这也让GAN的学习是更"缓和"的,在图像生成任务中我们会发现,GAN不断向图片中添加更多细节,让图片更逼真。就像拟合任务中,一般的生成式模型是用很多Dirac函数标记所有训练数据点,实现最大似然,而GAN更像是用曲线逼近所有数据点。
GAN的不收敛问题是训练的一大难点,如果网络架构或参数初始化不合理,这种轮换训练两个网络的方式将很有可能面临在某些数据点中来回跳动,而不是收敛到最优。

动手实作

也许你看了上面的这个一维图像仍然不是很明白GAN为什么能拟合数据的概率分布,那么我们不妨试一试自己实现一个简单的GAN,并且实时观察判别器的概率分配和生成器的生成情况。
这里的GAN使用全连接网络搭建,基于Pytorch进行。首先我们生成1k个二维空间中的点

import numpy as np
import matplotlib.pyplot as plt

def get_circle_dataset(n = 1000):
    dr,angle = np.random.randn(n)*0.05,1.5*np.pi*np.random.rand(n)
    r = dr+1.3
    x = r*np.sin(angle)
    y = r*np.cos(angle)
    data = np.concatenate([x[np.newaxis,:],y[np.newaxis,:]]).T
    return data

circle_data = get_circle_dataset()
plt.scatter(circle_data[:,0],circle_data[:,1])

在这里插入图片描述
这是一个有缺口的圆环,然后我们搭建两个简单的网络作为生成器和判别器。

latent_size = 16

# Discriminator
D = nn.Sequential(
    nn.Linear(2, 64)
  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值