DCGAN简析(deep convolutional generative adversarial networks)深度卷积生成对抗网络

生成对抗网络最近非常热门,它并不属于监督学习范畴,实际上反过来想,监督学习的功能还是非常强大的,比如图像分类,目标检测,语义分割。GAN比较偏理论性,近年来的进展也非常快,而且文章的citations引用量也非常多。GAN的主要target是以生成一些效果非常逼真的图像为目标,指标评价只能是主观评价,并没有什么量化的指标。

https://medium.com/syncedreview/biggan-a-new-state-of-the-art-in-image-synthesis-cf2ec5694024

https://zhuanlan.zhihu.com/p/46581611

wasserstein gan

https://arxiv.org/pdf/1701.07875.pdf

conditional GAN

https://arxiv.org/abs/1411.1784

https://scholar.google.com/citations?user=UdpacsMAAAAJ&hl=zh-CN

DCGAN

https://arxiv.org/abs/1511.06434

GAN发展的历史:GAN最早是由GoodFellow所提出,其主要思想在于:现在的图像分类任务通常都是使用卷积神经网络对输入图像进行特征提取,由于CNN对于图像的特征提取能力很强,故而可以将CNN提取到的特征flatten后,对特征向量进行分类,既然特征向量与输入图像之间具有一一对应关系,现在思考,反向是否可行,即输入一个特征向量,是否能输入一张图像?能不能使得生成的图像与原始数据集中真实的图像无限地接近呢?

在BP算法的实现过程中,实际上output对于每一层weight的梯度值和每一层feature map的梯度值都已经计算出来了,因为比如需要计算出output对于第k层weight的梯度值,是将output对于第k层feature map的梯度值和第k层的输入值(第k层的输入值即第k层feature map对于第k层weight的梯度值)进行卷积运算(在卷积神经网络中是使用卷积运算,在全连接层中是使用矩阵相乘)得到的。故而在反向传播算法过程中,output对于每一层weight的梯度值和每一层feature map的梯度值都计算出来,只不过我们利用了output对于每一层weight的梯度值来更新网络模型的梯度,但是并没有使用output每一层feature map的梯度值。

卷积操作不仅能够实现将输入图像分辨率变小(strided convolution)的功能,还能够将输入图像的分辨率变大(Transposed convolution)。

生成对抗网络的目标是训练出两个网络:最早的GAN是希望通过输入一个噪声向量(random variable),由生成器对于图像进行上采样(最早的生成器是由全连接层构成,可以对输入的低位向量进行升维操作,比如10000,然后对输出向量进行reshape操作,得到100*100的生成图像),而DCGAN的改进之处就在于在generator生成器部分使用卷积神经网络,然后生成器的输入变成了二维的噪声图像(二维随机变量),最早的GAN输入的是一维的随机噪声向量,对噪声图像不断进行反卷积和上采样,生成器输出图像,GAN的最终目的是为了使得生成器生成的图像接近于真实的图像,在这个过程中需要不断提高生成器生成仿真图像的能力和判别器分类真假图像的能力,从而才能使得最终生成器生成的图像非常接近于从real image dataset中采样得到的图像,要注意的是:generator生成的图像只能无限地逼近generator训练集中的图像,如果训练数据集使用的是狗,则生成器将只能够根据输入的随机变量合成一张狗的图像,而不能合成其他类别的图像,也就是说,生成器希望学习到的连续分布是无限的逼近于生成器的输入训练数据集(数据集中是一个个图像样本,图像的像素值为离散值,故而原始训练集数据分布为离散分布),而generator的输入random variable的每个维度都是服从某个均值方差的连续概率分布,故而generator的输入vector也在连续空间中,这些连续随机变量经过生成器卷积神经网络的映射之后,也将映射到连续空间中,也就是说,generator的目标是学习连续分布 p(z),使得p(z)无限逼近于训练数据集中的离散概率分布p(data)。

训练GAN的过程实际上是generator和discriminator进行博弈的过程,首先固定generator,训练discriminator,从真实的训练数据集中随机采样出一些真实存在的训练图像,然后随机初始化generator的input random variable,获取一些随机的generator输出,这两个部分的real image sample和fake image sample送入discriminator,由判别器进行二分类,对于discriminator而言,他想要做的是最大化log(D(X))即认为来自于真实数据集中的样本概率值P(D(X))趋近于1,则前面一项的BCE loss=0,然后最小化D(G(Z)),让概率值D(G(Z))=0,则后面一项的binary cross entropy loss=0,从而训练discriminator的过程可以总结为:固定generator不变,在generator所有参数的分布空间中进行搜索,找到一个最好的discriminator,使得它能够对于真假样本(这里所指的假样本是根据input random noise vector输入到generator后得到的synthesis image合成图像)有很好的分类性能。训练generator的过程是:固定discriminator的参数不变,此时可以将discriminator的参数看作是常数,则公式中的第一项不做考虑,只看第二项(也就是包含生成器的一项),生成器希望discriminator将generator的输出G(Z)判别为1(1代表real image),也就是希望第二项最小。综上所述,discriminator的训练过程就是希望让D(G(Z))趋向于0,而generator的训练过程就是希望让D(G(Z))趋向于1,从而达到generator想要以假乱真的目的。(这里注意,discriminator的最后一层使用sigmoid作为激活函数,而不使用softmax,只需要输出对于image是real类别的分数,sigmoid的值域范围为0-1,表示输入图像属于当前类别的概率值)

GAN loss函数的最大值为0=log1+log1 ,此时,discriminator对于来自真实训练数据集中样本分数为1,对于generator synthesis image输出为0,这是discriminator最好状态,loss函数的最小值为负无穷=log1+log0,此时,discriminator对于真实图像给出分数仍然为1,但是对于generator输出的合成图像给出的分数仍然接近1,这是generator最好状态。也就是说,generator做的事就是希望在discriminator将generator的输出图像分类称为real image的给定标签下,用这个标签向量反向传播以更新generator的参数数值,从而使得generator输出更接近于real image。这是因为,网络能够学习到什么模型完全取决于最终给定的是什么类别的标签,比如,已经有一个classifier具备给出当前输入图像是狗的类别概率分数,此时输入图像是一朵花,则classifier的输出score会非常低,但是如果强制将target labels标记成为狗,进行back propagation反向传播,不更新classifier的参数数值而是更新到输入image上每个像素点的灰度值,则经过多次迭代训练后,输入图像中的内容将会被转换成为狗,这种转换是通过对于输入图像中每个像素点灰度值的微小改变产生的,GAN使用的方法就类似于这个思路。固定G,可以优化D,固定D,可以优化G,相当于是D和G一直在博弈的过程,最终达到纳什平衡。

训练generator的过程,就是希望将输入的噪声分布映射到高维连续的图像空间,generator的任务就是学习/模拟训练数据集的分布,generator生成的数据空间是连续的,而真实的训练数据集在离散数据空间中。generator只能生成与训练集中图像类似的图像,并不能生成训练集之外的其他类别的图像。

现在在GAN上面所作的创新和改进都是对于generator所做的工作。比如将generator中的CNN变得更深,从而使得generator生成的图像更为逼真。

 

最后补充一些,DCGAN论文的亮点。DCGAN论文的主要亮点在于它的工程效果非常好

DCGAN相对于原始GAN的改进之处就在于将原始generator的全连接层换成了用卷积层实现。

(1)如果有将网络模型中的权值编程正交矩阵的限制,如何操作?

在损失函数中加入限制项,加入   L2 norm (W.transpose()*W, I)让参数矩阵W与其转置矩阵乘法得到的矩阵与单位矩阵很接近。

(2)在CNN网络模型中,用步长卷积代替max pooling,(discriminator中的下采样),用transpose convolution代替upsampling layer(generator中的上采样)

(3)使用batch normalization layer

(4)去除网络模型中的fully connected layer

(5)使用Relu作为激活函数。tanh函数阈值 (-1,1)

猜你喜欢

转载自blog.csdn.net/WYXHAHAHA123/article/details/86657164