在上一节中,我们学习了生成模型:这些模型可以生成与训练数据集中的图像相似的新图像。VAE是生成模型的一个很好的例子。
然而,如果我们试图用VAE生成一些真正有意义的东西,比如一幅分辨率合理的画作,我们会发现训练并不能很好地收敛。对于这个用例,我们应该了解另一种专门针对生成模型的架构--生成对抗网络(Generative Adversarial Networks,简称GAN)。
GAN的主要思想是有两个神经网络,它们将相互训练:

生成器是一个网络,它采用一些随机向量,并产生图像作为结果。
判别器是一个获取图像的网络,它应该判断它是真实的图像(来自训练数据集),还是由生成器生成的。它本质上是一个图像分类器。
判别器的架构与普通的图像分类网络没有区别。在最简单的情况下,它可以是全连接分类器,但最有可能的是卷积网络。
基于卷积网络的GAN称为DCGAN
CNN判别器由以下层组成:几个卷积+池化(具有减小的空间大小)和一个或多个完全连接的层以获得“特征向量”,最终的二元分类器。
在这种情况下,“池化”是一种减少图像大小的技术。“池化层通过将一层神经元簇的输出组合到下一层的单个神经元中来减少数据的维度。“
生成器稍微有点棘手。你可以把它看作是一个反向判别器。从潜在向量(代替特征向量)开始,它有一个完全连接的层将其转换为所需的大小/形状,然后是去卷积+放大。这类似于自动编码器的解码器部分。
由于卷积层被实现为遍历图像的线性滤波器,因此去卷积本质上类似于卷积,并且可以使用相同的层逻辑来实现。
GAN被称为对抗性的,因为生成器和判别器之间存在持续的竞争。在这种竞争中,生成器和判别器都得到了改进,因此网络学会了生成越来越好的图片。
训练分两个阶段进行:
训练判别器。这个任务非常简单:我们通过生成器生成一批图像,将它们标记为0,代表假图像,并从输入数据集中获取一批图像(标记为1,真实的图像)。我们得到一些判别器损失,并执行反向传播。
训练生成器。这稍微有点棘手,因为我们不直接知道生成器的预期输出。我们使用由生成器和判别器组成的整个GAN网络,向其提供一些随机向量,并期望结果为1(对应于真实的图像)。然后,我们冻结判别器的参数(我们不希望它在这一步被训练),并执行反向传播。
在此过程中,判别器和生成器的损失都不会显著下降。在理想情况下,它们应该振荡,对应于两个网络都提高了它们的性能。
众所周知,GAN特别难以训练。这里有几个问题:
模式崩溃。这个术语的意思是生成器学习生成一个成功的图像,而不是各种不同的图像。
对超参数敏感。通常你可以看到GAN根本不收敛,然后学习率突然下降导致收敛。
保持生成器和判别器之间的平衡。在许多情况下,判别器的损失可以相对快速地下降到零,这导致生成器无法进一步训练。为了克服这个问题,我们可以尝试为生成器和判别器设置不同的学习率,或者如果损失已经太低,则跳过判别器训练。
高分辨率训练。反映了与自动编码器相同的问题,这个问题被触发,因为重构太多层的卷积网络会导致伪影。这个问题通常通过所谓的渐进式增长来解决,即首先在低分辨率图像上训练几个层,然后“解锁”或添加层。另一种解决方案是在层之间添加额外的连接,并同时训练多个分辨率。
GANs是生成艺术图像的好方法。另一个有趣的技术是所谓的风格迁移,它采用一个内容图像,并以不同的样式重新绘制它,从样式图像应用过滤器。
其工作方式如下:
我们从随机噪声图像开始(或者从内容图像开始,但为了便于理解,从随机噪声开始更容易)
我们的目标是创建这样一个图像,它将接近内容图像和样式图像。这将由两个损失函数确定:
基于CNN在当前图像和内容图像的某些层提取的特征来计算内容损失
使用Gram矩阵以一种巧妙的方式计算当前图像和样式图像之间的样式损失
为了使图像更平滑和去除噪声,我们还引入了变异损失,它计算相邻像素之间的平均距离
主优化循环使用梯度下降(或一些其他优化算法)来调整当前图像以最小化总损失,总损失是所有三个损失的加权和。
code/s?__biz=MzIxOTU0OTY2OQ==&mid=2247486503&idx=1&sn=00880e0fe7df104dabf5457eeecce291&chksm=97d8d6ada0af5fbbbf44adbe49d8e4d48ff83a8d4e8df0a4252deca8170f38304aaf0d98b104#rd