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

1. 前言

本小节算是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 L =∥ x − G ( 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(μ,Σ)) L =∥ X − G ( z ) ∥ p + K L ( Π P i ∥ N ( μ , Σ ) )

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

vae

也用服装数据集做生成:

这里写图片描述

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

这里写图片描述

3 小结

上边介绍了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则更符合人们的认知!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值