生成对抗网络GAN(Generative adversarial network)是由Goodfellow大神在NIPS2014上提出,论文地址如下:https://arxiv.org/pdf/1406.2661.pdf
1.GAN能做什么?
学习是需要理由和动力的,让我们来看看非常热门的GAN到底有什么什么魔力,GAN的就是生成不存在于真实世界但又类似真实世界的数据,GAN是将创造力和想象力赋予AI的state-of-the-art,目前GAN的应用场景主要如下:
a.AI画家,让AI去作画;
b.将模糊图像变清晰(超分辨率、去雾、去马赛克等),需要用AI的“想象力”去脑补丢失的细节信息;
c.数据增强,根据现有的数据生成新的与现有数据分布相似的数据,用于扩增数据;
d.随着GAN的发展会有更多的实用场景会用到这种技术
2.什么是GAN?
GAN主要由两部分构成,也可以理解成两个网络:生成网络(Generator)和判别网络D(Discrimination)
Generator:G主要用来学习真实图像分布从而自身生成逼近或超越真实的图像,G接收一个随机噪声z,通过这个噪声生成图片,记做G(z)。
Discrimination:D是一个判别网络,判别一张图片是不是“真实的”,它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片。
在训练过程中,生成器努力的生成真实的图像去欺骗判别器;而判别器则努力的把生成的图像和真实图像辨别开。这样,G和D便构成了一个动态的对“对抗过程”。
对抗的结果是什么?在最为理想的情况下,对于G,它能够生成“以假乱真”的图像G(z);对于D,它难以判别G生成的图像的真假,也就是D(G(z))=0.5。这样“对抗”就结束了,我们获得了一个能够“以假乱真”的图像生成器G。
下面具体的说一下"对抗"的过程。首先,我们有一个第一代Generator,G产生一些图片,然后我们把这些图片和一些真实的图片丢到第一代的D里面去学习,让第一代的D能够分辨生成的图像和真实的图像,然后我们又有了第二代的G,第二代的G产生的图片,能够骗过第一代的D,此时,我们在训练第二代的D,依次类推。
下面用数学语言来描述这个过程。假设用于训练的真实图像数据是x,图像数据分布为,G就是要学习到真实的数据分布,未知。噪声z的分布为,已知。在理想对抗条件下,学习到的的分布应该尽可能接近,将已知分布映射到了未知分布上了。
因为D的输出是一个二分类问题,所以可根据交叉熵损失函数构造GAN的损失函数:
损失函数中是指训练数据x中国的真实样本,指从已知的噪声分布中提取的样本;
- 整个式子由两项构成。x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。
- G的目的:G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))D(G(z))尽可能得大,这是V(D,G)V(D,G)会变小。
- 第一项D(x)越强,值越接近1,越接近0;
- D的目的:D的能力越强,D(x)D(x)应该越大,D(G(x))D(G(x))应该越小。因此D的目的和G不同,D希望V(D,G)V(D,G)越大越好。
3.DCGAN
深度学习中处理图像最好的模型是CNN,DCGAN就是将CNN与GAN进行了结合,并对网络结构进行了一些改变,以提高收敛速度
取消所有pooling层。G网络中使用转置卷积(transposed convolutional layer)进行上采样,D网络中用加入stride的卷积代替pooling
在D和G中均使用batch normalization
去掉FC层,使网络变为全卷积网络
G网络中使用ReLU作为激活函数,最后一层使用tanh
D网络中使用LeakyReLU作为激活函数