生成对抗网络系列(0)――生成模型

匿名 (未验证) 提交于 2019-12-03 00:32:02

本小节算是GAN的预备篇,主要介绍目前几个主流的生成模型,以及他们各自的优势。现有的使用较多的生成模型主要有以下5个,他们的源代码如下:

https://github.com/wiseodd/generative-models

这里给出的代码主要是CPU实现。不太适合我们现在要处理的任务,基于他们的代码,我改编出了GPU版,目前只实现了AE、VAE和部分GAN,代码会持续更新中…

https://github.com/Cuiyirui/Generative-Model-with-pytorch-GPU

2.1 Auto-encoder

先来看Auto-Encoder也就是我们说的AE,它的主要思路是把输入的vector编码成code,再把code解码成vector. 其中的编码器和解码器部分一般是Neural Network,可以是简单的线型神经元,也可以是CNN。为了训练函数用p-范数做损失函数:

L=‖xG(z)p

p取1就是我们熟悉的L1 loss,p取2就是L2 loss.
把NN换成简单的3层神经网络:

这里的图像编码是3位。用到的数据集主要是MNIST和我们自己的服装数据集。
我们先看MNIST上的例子

从上边的结果发现,随着训练次数的增加,生成的图像在逐渐变清晰。但我们随机给一个长度为3的变量作为编码时,就会生成一些不是特别合理的结果。其实AE更像是一种非线性插值,输入训练集中的图片就会得到比较好的结果,如果我们输入随机编码,则得到的是一些过度的结果。再来个图能更说明AE产生的主要是训练数据的中间结果:

固定其中的一个值,变化另外两个,我们就能看出数字的变化规律,如果随机选取点的编码值是已有编码的中间值,就会生成一些不合理的结果。我们再来看服装的结果:

第一个epoch的时候,所有的图像都会出现相同的轮廓,之后到50个epoch的时候逐渐出现了颜色信息,最后随着epoch的增加,生成的服装图像会出现一些个性化的特征,如已经可以出现了长袖、短袖。从某个角度看服装图像的生成,有点像胚胎的演化,所有动物的胚胎在初期都是很相似的,之后才慢慢分化出自己的形态。
把NN换成复杂的convNet

得到以下的服装生成效果:

任意给一组编码得到以下结果:

可以发现,跟线型神经元不同,用CNN做encoder和decoder的AE在1个epoch的时候就能还原出服装的形态,随着训练次数的增加,服装重建的结果也在慢慢变好。但也许是我自己设计的网络结构不太合理,生成的图像颗粒化很严重,能看到明显的像素块!,最后,我用随机输入的一串编码做测试,发现效果很差,这是因为服装之间的过渡关系远没有数字那么明显!为了能给随机输入的结果一个合理的结果,我们接着介绍VAE

2.2 Variational auto-encoder(VAE)

在GAN没出现之前,VAE是最popular的无监督学习方法。举个简单的例子,

真实的数据分布是大圆,我们的训练集是随机获取的真实数据一部分,因此只能反映真实分布中的侧面。因此用AE时,如果我们输入一张真实的图片,并得到它的编码能得到很好的结果,因为产生的编码属于小圆。但我们在小圆外随机选取1点,得到的就是一下不存在的结果。这个问题会随着特征向量维度增加而变得更糟,VAE的基本思想则是,我们假设是原始数据是一个很复杂的分布,我们高斯分布来逼近这个分布。这样一来,真实数据中的点就跟高斯分布上的点对应起来了!我们只需要利用现有的训练集去找出这个高斯分布的参数μ,σ。这里要注意一下用已知分布逼近未知分布的思想,这个也是GAN的理论基础!除了原始的VAE,目前还有一些VAE的变种,包括:
conditional VAE, Denoising VAE,
Adversarial VAE,
Adversarial Variational Bayes

我们只介绍原始的VAE。与AE不同,VAE中编码器不再产生图片的编码,而是产生两个向量,一个表示均值,一个表示方差。如图

利用图中公式,就可以计算出code。整个网络的训练是要让生成器生成的分布与随机噪声分布(一般选标准高斯分布)接近,同时保证输入的图片与输出的图片越接近越好。因此训练网络时的loss为:

L=‖XG(z)p+KL(PiN(μ,))

我们知道,如果随机变量是独立同分布的,则联合分布就是由每个变量分布的乘积。在图像生成中,我们可以随机变量是服从高斯分布的,编码器产生的是均值和方差,利用均值和方差可以构造联合高斯分布,这个联合分布与标准高斯分布越接近越好。我们的code是从任意噪声结合的均值和方差生成的,因此我们输入任意噪声作为code,都能产生出一种图片。同样的,设计简单的线型网络结构:

也用服装数据集做生成:

实验结果如图所示,用VAE产生的图片相比于VE有一些模糊,因为VAE拟合的是分布。但给一些随机噪声作为编码,输入到网络后并不会出现不合理的结果,基本上也还保留着服装的形态

上边介绍了auto-encoder跟variational auto-encoder,我们发现,生成的图片是在比较模糊。这有一部分原因是使用基于pixel-wise的是L2 loss造成的。举个很简单的例子:

ground truth是手写字符2,上边两幅图中都是有1个pixel的错误,用L2 loss
都是1,下边两幅图都是多出来6个像素,用L2 loss是36.下边的loss大,但我们从直觉上看下边的图更真一点!
其实,我们发现,AE和VAE这两个模型的生成器都是静态的,就是定义好loss,用训练数据让loss最小从而求出参数,用这些参数来描述generator。而我们接下来要讲的GAN则是动态的过程,generator是动态更新的,GAN更像是提出一种全新的loss,而这种loss则更符合人们的认知!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!