GAN最重要的应用就是图像的自动生成,我们就以自动生成MNIST图像为例介绍其基本架构。如图13-1所示,GAN包括噪音源、Generator和Discriminator,数据集包含真实样本即可,这里真实样本就是MNIST。
图13-1 GAN基本原理 [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()
Generator的原理图如图13-4所示。
图13-3 正态分布示例
图13-4 Generator原理图 [2]
Generator在噪音源的激发下,生成样本数据,在本例中模仿MNIST生成手写数字图片。
Discriminator的原理图如图13-5所示。
Discriminator类似我们之前接触的图像分类模型,不过它产生的是该图片是真是假的分类结果,所以通常它的输出是一个概率,0代表肯定是假,1代表肯定是真。
图13-5 Discriminator原理图
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