13.2 GAN系统架构

GAN最重要的应用就是图像的自动生成,我们就以自动生成MNIST图像为例介绍其基本架构。如图13-1所示,GAN包括噪音源、Generator和Discriminator,数据集包含真实样本即可,这里真实样本就是MNIST。

图13-1 GAN基本原理 [1]

13.2.1 噪音源

噪音源随机产生指定维度的噪音,或者说是满足一定分布的随机数。噪音作为生成器的输入,激发Generator产生样本。最常见的噪音就是分布满足平均分布和正态分布的随机数。

1.平均分布

Python中实现平均分布通常使用NumPy的uniform函数,实现从一个均匀分布[low,high]中随机采样,其定义如下:


numpy.random.uniform(low,high,size)

我们随机产生1200维的随机数,满足随机分布,取值范围在0~1之间,图像如图13-2所示。代码如下:


s = np.random.uniform(0, 1, 1200)
count, bins, ignored = plt.hist(s, 12, normed=True)
plt.plot(bins, np.ones_like(bins), linewidth=2, color='r')
plt.show()

图13-2 平均分布示例

2.正态分布

Python中实现正态分布通常使用numpy.random.randn,我们生成一个mu为10,sigma为10的正态分布,图像如图13-3所示。代码如下:


mu, sigma = 10, 10
x = mu + sigma * np.random.randn(5000)
n, bins, patches = plt.hist(x, 20, normed=1, facecolor='blue', alpha=0.8)
y = MLA.normpdf(bins, mu, sigma)
l = plt.plot(bins, y, 'g--', linewidth=3)
plt.xlabel('samples')
plt.ylabel('p')
plt.title(r'$Normal\ pdf\ m=10,\ \sigma=10$')
plt.axis([-30, 50, 0, 0.042])
plt.grid(True)
plt.show()

13.2.2 Generator

Generator的原理图如图13-4所示。

图13-3 正态分布示例

图13-4 Generator原理图 [2]

Generator在噪音源的激发下,生成样本数据,在本例中模仿MNIST生成手写数字图片。

13.2.3 Discriminator

Discriminator的原理图如图13-5所示。

Discriminator类似我们之前接触的图像分类模型,不过它产生的是该图片是真是假的分类结果,所以通常它的输出是一个概率,0代表肯定是假,1代表肯定是真。

图13-5 Discriminator原理图

13.2.4 对抗模型

GAN之所以可以生成逼真的样本,很大程度上依赖于对抗模型(如图13-6所示),所谓的对抗模型其实就是Generator和Discriminator结合在一起,前者的输出作为后者的输入,然后使用欺骗性的标记,企图欺骗Discriminator。

图13-6 对抗模型

[1] https://www.leiphone.com/news/201703/Y5vnDSV9uIJIQzQm.html

[2] https://towardsdatascience.com/gan-by-example-using-keras-on-tensorflow-backend-1a6d515a60d0