深度学习:生成对抗网络-论文阅读(GAN,CGAN,DCGAN和pix2pix的总结)

Papers Reading For GAN

文献阅读,主要涉及生成对抗网络(GAN)。

从本质上来说,生成对抗网络(GAN)是一种特殊的损失函数。

​ ——Jeremy Howard

刚开始入门,直接看最新的state of the art不明白的地方会比较多,需要从经典的几篇文章开始阅读。

不是原理的详解,只是一些总结。按时间排序,每篇文章理解性翻译摘要和结论,结合代码介绍方法及解决的问题。

对于代码,学习时全部参考eriklindernoren大佬的github,keras-GAN。基本上所有的GAN都是用一个模板写下来的。代码十分清晰,也很好根据需求修改,方便学习。主要分三步:1. 数据获取;2. 搭建模型;3. 训练模型。配合代码能更好的理解论文的思想。


Ⅰ. 目录

  • 2014 (GAN) Generative Adversarial Nets
  • 2014 (CGAN) Conditional Generative Adversarial Nets
  • 2016 (DCGAN) UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS
  • 2017 (Tricks) How to Train a GAN
  • 2018 (pix2pix) Image-to-Image Translation with Conditional Adversarial Networks

Ⅱ. 笔记

2014 (GAN) Generative Adversarial Nets

摘要:本文第一次提出生成对抗网络(GAN),用一个生成器G获取数据分布,用一个判决器D区分真实数据和生成数据。生成器G的训练策略是最大化判决器D的预测误差。对任意的G和D,总是存在一个生成器能恢复训练数据,而判决器的准确分类概率为0.5的解。当G和D都是多层感知器时,整个系统都可以通过反向传播训练。在训练和生成的过程中都不需要马尔科夫链和近似推断网络。实验说明方法在生成样本上的潜力。

方法:下图给出原文中的GAN的训练过程和代价函数。

实验:从实验中可以了解到作者的参数设置以及其他训练技巧。

  • 生成器的激活函数使用ReLU和sigmoid,判决器使用maxout;
  • 训练判决器时加入Dropout;
  • 生成器使用噪声作为输入。

优缺点:最大的问题在于生成器崩溃。

  • 缺点,没有生成器的明确表示。
  • 缺点,需要同步训练生成器和判决器。但实际上判决器通常比较容易训练。这也是后面的GAN主要改进的地方。
  • 优点,相比其他深度生成方法,不需要马尔科夫链。
  • 优点,能表示比较剧烈的分布。

总结:经典GAN能很容易的扩展到其他形式。原文总结中也给出。大牛还是大牛,直接把后来几年的方向也确定了。

  • 可以额外给定条件变为条件生成模型;(CGAN?)
  • 再加一个辅助网络可以学到近似推断;(BiGAN,ACGAN,。。。?)
  • 通过判决器或推断网络的特征进行半监督学习,当标记样本有限时。
  • 性能提升:更好的结合G和D,更好的分布。

代码:来自https://github.com/eriklindernoren/Keras-GAN/blob/master/gan/gan.py,参考大佬的代码,结合论文的原理进行学习,对文中提到的一些训练过程会有比较好的理解。

本文是GAN的开山之作,对训练过程需要有比较清晰的认识。

使用数据集为mnist数据集,图片维度为[28, 28, 1]。

生成器输入是维度为100的随机向量,输出是[28, 28, 1]的图片。

判决器输入是[28, 28, 1]的图片,输出是二分类结果。

每一次训练分为3步:1. 生成器预测;2. 判决器训练;3. 生成器训练。

使用train_on_batch,这能确保用BN的时候是对真实样本和生成样本分别进行的。这一点比较重要。

GAN的训练过程中不要过于看重代价函数。

2014 (CGAN) Conditional Generative Adversarial Nets

摘要:GAN提供了一种训练生成模型的新方法。本文介绍一种条件GAN,通过标签y给生成器和判决器添加条件。我们发现这种模型可以在类别标签作为条件的情况下生成mnist数据。我们同样表明了这种模型时如何学习多模态模型的,并提供了一个关于图片标记的简单示例。

方法:其实就是GAN的简单推广,就像上一篇中结论提起的那样。改变代价函数和模型输入,具体方法如下:

代码:来自https://github.com/eriklindernoren/Keras-GAN/blob/master/cgan/cgan.py,代码基本和GAN是一样的,具体细节还是要看原文。

明显的不同:

生成器输入是维度为100的随机向量,以及标签。输出是[28, 28, 1]的图片。

判决器输入是[28, 28, 1]的图片和标签,输出是二分类结果。

2016 (DCGAN) Unsupervised Representation Learning with Deep Convolutional generative Adversarial Networks

摘要:使用卷积网络的监督学习在计算机视觉中取得巨大成功。但是使用卷积网络的无监督学习获得较少的关注。本文希望在卷积网络获得成功的监督学习和无监督学习之间架起桥梁。我们介绍了一种深度卷积生成对抗网络,它有特定的结构约束,并在无监督学习中表现出强大的能力。在不同图像数据集上的结果表明我们的方法能学到有用的特征。另外,我们将学到的特征用于新的任务中,发现这些特征表示拥有强大泛化能力。

方法:这篇文章最重要的一点是解决了GAN训练不稳定的问题。从模型结构上提出了比较重要的几个Tricks,如下图所示。

  • 把所有模型中降采样的池化操作都改成有步长的卷积;
  • 使用BN,除了生成器的输出层以及判决器的输入层;
  • 删除全连接的中间层;
  • 对生成器,使用ReLU激活函数,除了输出层,使用Tanh;
  • 对判决器,使用LeakyReLU,这一点和原始GAN不同,Goodfellow 大佬使用的是Maxout;
  • (额外)在训练过程中,使用Adam,学习率调整为0.0002,动量调整为0.5,这两点有助于平稳训练。

文章使用的网络结构如下,这样的GAN一般就被称为DCGAN。

总结:文章给出一个训练GAN更稳定的结构设置,同时证明GAN可以学习到用于监督学习或生成模型的图像的良好表示。但仍然有些不稳定的问题——模型训练的时间长了以后有时候还是会崩溃,一些滤波器会开始振荡。

代码:来自https://github.com/eriklindernoren/Keras-GAN/blob/master/dcgan/dcgan.py。还是在原始GAN上做了一些修改,把生成器和判决器的模型改成论文中的结构了。

2017 (Tricks) How to train a GAN

这是17年几位大牛总结的GAN训练方法,能帮助GAN的训练。之所以也列在这,是作为一个时间线的划分。里面的有些方法现在已经过时,更新的文章里有别的方法被提出。

  1. 图片规范化在-1~1之间;生成器的输出使用激活函数Tanh。
  2. 修改损失函数;在训练生成器的时候反转标签。
  3. 使用球面分布的高斯噪声而不是均匀分布。
  4. BN,且对真伪样本分别进行;可以用IN代替。
  5. 避免稀疏梯度:使用泄露ReLU;下采样使用平均池化或步长卷积;上采样使用PixelShuffle或反卷积。
  6. 平滑标签。
  7. 使用DCGAN,WGAN-gp;宽度比深度更重要。
  8. 历史平滑。
  9. 使用ADAM优化器,除非不允许(WGAN这种)。
  10. 使用梯度惩罚,对梯度的范数进行规范。
  11. 不要通过统计的方法对G和D的训练次数进行规范。
  12. 有标签则使用标签。
  13. 对输入加噪声,方差随时间减小。
  14. 可以多训练几次判决器。
  15. 避免离散空间,将生成器作为一个连续预测。

2018 (pix2pix) Image-to-Image Translation with Conditional Adversarial Networks

摘要:使用条件GAN(cGAN)作为一种解决图像-图像任务的通用方法。cGAN不仅学习输入图像到输出图像的映射,还学习到一种训练这种映射的代价函数。这就使得用一种通用的方法解决不同问题成为可能。我们发现这种方法在以下图像生成任务中十分有效:从边缘重构目标、图像上色、以及其他任务。另外,自从我们开源pix2pix软件后,出现很多其他的应用,表明我们方法的通用性。利用这种方法,我们不用再针对特定任务手工设计映射函数,我们的工作表明没有手工设计代价函数同样可以获得合理的结果。

方法:基础方法是条件GAN,又针对图像模糊的问题增加L1正则化。生成器使用U型网络,判决器使用马尔可夫判决器。优化器仍然是Adam,参数和之前一样。

最终的代价函数如下图所示,传统cGAN的代价函数加L1正则化。

与之前的条件cGAN使用标签和噪声作为输入不同,这里作者采用Dropout的方式加入噪声。训练和测试过程均使用Dropout。

生成器是U型网络,和编码器-解码器的结构类似,如下图所示。

判决器使用PatchGAN。用L1或者L2损失时,生成的图像会比较模糊。如果只需要低频信息影响不大。但我们想要高频信息。PatchGAN只在一个小patch上判断真伪,再把所有的响应取平均作为模型输出。PatchGAN可以理解为纹理或者风格的损失,能学习到高频信息。

总结:提出了一种利用条件GAN的,针对大量图像任务均适用的方法。感觉很多和图像有关的问题都可以用这种方法直接解决,只需要一些很小的调整。当然应用的时候还是可以来回顾一下原文的参数细节的。

网上也有比较多的直接应用,包括最近看见的几个:从大量结婚照中生成对象的样子,动漫老婆生成器等等。

代码https://github.com/eriklindernoren/Keras-GAN/blob/master/pix2pix/pix2pix.py。大佬的代码仍然可以参考,只做了最核心的思想。细节部分参考论文比较容易补全,包括Dropout训练测试模式的设置,也有论文提供的链接可以学习。

论文源码链接为https://phillipi.github.io/pix2pix/,这是pix2pix项目的链接,里面有不同框架下的实现方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章