【论文笔记】GAN相关资料阅读笔记

​ 这篇博客主要介绍的是最近看到,学到,理解的一些有关GAN (对抗生成网络)的概念,知识。会讲到一些有关GAN的类别,各个类别GAN的应用场景。

​ 在开始之前先吐槽一下Next的封面插图和正文插图的使用,真的是个坑。网上好多介绍的教程都是错的,无情掉坑多次。

  • 博客封面插图的插入方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > title: 【论文笔记】GAN相关论文阅读笔记
    > date: 2018-11-02 13:58:24
    > categories:
    > - 论文阅读
    > tags:
    > - GAN的相关论文
    > - GAN的介绍
    > photos:
    > - "https://ask.qcloudimg.com/http-save/yehe-1565119/czwhuw5w22.jpeg?imageView2/2/w/1620"
    >

    就是在tags下面加上photos,然后添加上图片的网址链接,本地地址好像不好用,试了几次,都没好用

  • 博客正文插图的插入方式:

    1
    2
    > # {% asset_img example.jpg This is an example image %}
    >

    对就是这样插入的,这是采用相对路径引用的标签插件进行插入图片的,需要开启的东西,具体看官方操作手册

废话说太多了,现在开始讲GAN。

GAN的概念

​ GAN全称Generator adversarial networks,翻译成中文就是对抗生成网络。是一种无监督类型的生成模型。是一个叫Good fellow的大佬在2014年提出的,GAN的思想非常朴素,就是生成器和判别两个极大极小的博弈。自此之后,这个模型被很多业界,学术界的大佬疯狂研究,在github上有一个叫GAN zoo的仓库,存放了各种各样的GAN。大家有兴趣可以到上面搜集自己想要的GAN模型。

GAN相关的数学概念

  1. 目标函数

GAN的目标函数:

$min_Gmax_DV(D,G)=E_{x~p_{data}}[logD(x)]+E_{z~p_{z}(z)}[log(1-D(G(z)))]$

从判别器D角度来看,他是希望自己尽可能地区分真实样本和假样本,所以$D(x)$需要尽可能地大,$D(G(z))$尽可能地小,也就是$V(D,G)$尽可能地大。从生成器G来说,他希望自己尽可能骗过D,也就是希望$D(G(z))$尽可能地大,也就是$V(D,G)$ 尽可能地小。然后两个模型不断对抗,最后达到全局最优。

符号定义:

$data$:真实数据(groundtruth)

$P_{data}$:真实数据的分布

$z$:噪音(输入数据)

$P_z$:原始噪音分布

$P_g$:经过生成器之后的数据分布

$D$:生成器,也是一个多层感知机,传入的数据是真实数据

$G$:判别器 ,是生成器,结构是一个多层感知机,将噪声映射到新的数据空间

  1. 最优化问题表达

定义最优化问题的方法由两部分组成。首先我们需要定义一个判别器D以及判别样本是不是$P_{data}(x)$分布中提取出来的。所以有:

$E_{x~p_{data}(x)}log(D(x))$

其中:E是指期望,这一项是根据【正类】(也就是判别出x属于真实数据data)的对数损失函数而构建的。最大化这一项相当于令判别器D 在x服从于data的概率密度时能够准确地预测$D(x)=1$

也就是:$D(x)=1 when x~p_{data}(x)$

另一项是企图欺骗判别器的生成器G 。这项根据【负类】的对数损失函数构建的,也就是:

$E_{z~p_z(z)}log(1-D(G(z)))$

好了,以上我们大体了解了GAN的工作的数学原理,想要深入其中的数学推导,可以看这篇博客《GAN论文阅读——原始GAN(基本概念及理论推导)》以及相关的论文。

GAN相关的应用

​ 随着GAN的理论不断发展,GAN的应用也不仅局限在图像的生成。目前来说,GAN的应用主要有:图像生成,图像转换,图像合成(场景合成,人脸合成,文本到图像的合成),风格迁移,图像超分辨率,图像域的转换,图像修复。

  1. 图像生成

图像生成是GAN最开始的一个应用,当然也不局限于生成图像还可以生成音频,视频等。比较有意思的一个应用是同济大学,复旦大学,纽约州立大学一起打造的基于GAN的二次元软妹子的面部图像生成器,这是应用地址 可以算得上是宅男福音了。

  1. 图像转换

图像转换这个我也是最近刚接触到的,当然是因为项目的原因。开始我看的是《Medical Image Synthesis for Data Augmentation and Anonymization using Generative Adversarial Networks》 这篇论文,然后这篇论文里面所生成的核磁共振图像涉及到了pix2pix的生成模型,然后我顺藤摸瓜找到了这篇《Image-to-Image Translation with Conditional Adversarial Networks》 这篇论文里面,主要讲的就是图像转换,将一种图像转换为另一种形式的图像。

一般来说GAN的生成器G输入是随机向量,输出的是图像。而图像转换模型的输入是图像,输出的是转换之后的图像。这个网站是可以试玩的pix2pix的demo 。提到pix2pix,就不得不提,cycle-GAN,这个模型可以实现不同画风之间的转变,并且有将其应用在视频上的demo,在这个网站上你可以看到各种各样的风格迁移效果。除此之外还有一篇比较相似的论文,使用的是DiscoGAN实现的是在不用label和pairing的情况下学习交叉domain之间的关系,比如可以将不同包的风格迁移到鞋子上。

  1. 图像合成

图像合成是通过某种形式的图像描述创建新图像的过程。之前pix2pix和cycleGAN都属于图像合成的领域。

  • 场景合成

    场景合成:通过给定的部分场景信息还原出真实的场景信息。比如根据分割图像还原出原始场景信息,这就是图像分割的逆过程,这个在无人驾驶领域具有非常广阔的应用场景。

  • 人脸合成

    人脸合成就是通过一张人脸的图像,合成出不同角度的人脸图像,应用的场景是人脸对齐,姿态转换等辅助手段提高人脸识别精度,中科院的TP-GAN的效果应该算是比较好的。

  • 文本到图像的合成

    文本到图像的合成:是自然语言处理和计算机视觉的结合,也就是通过给定的一段话来生成与文字相匹配的图像。

  1. 风格迁移

这部分应用是来自与这篇文章《Precomputed Real-Time Texture Synthesis with Markovian Generative Adversarial Networks》 ,通过叫做一种马尔科夫GAN的模型进行分割迁移,之前有一款比较火的软件Prisma 大体就是这么整的。

  1. 图像超分辨率

其实这个应用我在研一的时候接触过,不过那个时候对深度学习,对抗生成网络没有任何的知识基础,没有深入研究进去。当时只是拿别人的代码跑了跑,看效果不佳就早早放弃了。其实GAN在图像超分辨率上的应用主要是天文图像和卫星图像的应用。其实再深入地想一下,GAN既然可以提升图像分辨率,为什么不能去马赛克呢?嘿嘿,所以GAN在去马赛克上也有比较优良的表现,知乎上的这篇专栏《提高驾驶技术:用GAN去除(爱情)动作片中的马赛克和衣服》 就是讲述如何通过GAN技术去掉马赛克的,我感觉学技术和学语言一样,一般人都是从比较污秽的方面学起来快,所以这不失为一篇好文章。

  1. 图像域转换

GAN非常适合学习连续数据的分布(因为本质上生成器工作过程就是不断去接近真实图片的分布的过程),同时也能完成domain转换的任务。之前提到的pix2pix模型还是cycleGAN模型都是解决的一对一的问题,而StarGAN是进行多个domain下的转换,可以做多个图像翻译任务。进一步的是通过domain转换解决穿衣搭配问题。

  1. 图像修复

GAN在image inpainting上是非常让人惊艳的,这篇文章《Generative Image Inpainting with Contextual Attention》 算是其中的代表作了。英伟达之后又将其效果往上又推了一步,比如这篇《Image Inpainting for Irregular Holes Using Partial Convolutions》

GAN模型需要去解决的问题

GAN模型主要面对两个问题,一个是泛化性,一个是mode collapse。这篇知乎专栏《从泛化性到Mode Collapse:关于GAN的一些思考》对我项目采用GAN的理论支持非常大。

  • 泛化性: 模型能不能生成新的的样式和变化模式,而不是仅仅记住已经存在的样本和模式。只有泛化能力提高,才能产生有价值的新样本来增强训练集,并帮助模型通过挖掘出更有信息的类内和类间的变化来提高小样本情况下的分类准确率。
  • mode collapse:是在实际应用中真实发生的现象。如果生成的样本基本类似,就可以认为遭受了mode collapse。按照good fellow说法,mode collapse总会存在,即便生成的整体有差异,但是局部纹理或者颜色没啥变化,GAN可以认为是遭受了mode collapse。

在上面提到的那篇知乎专栏里,还提到了,现在非正则的GAN模型(所谓的非正则GAN是不对要生成的样本分布做任何先验假设,尝试去解决一般性的数据样本生成问题。)从理论和实践都无法证明他的泛化能力。而如果给要生成的数据加入一些先验条件,比如数据的分布密度在空间中变化速度是有限的,这就是构建正则化GAN的动机。

Loss-Sensitive GAN、WGAN等都是基于Lipschitz正则条件

评价GAN模型性能的指标

《Loss-Sensitive Generative Adversarial Networks on Lipschitz Densities》这篇文章中提出了MRE(Minimum Reconstruction Error)的指标来度量泛化性。评价方式是:先将数据集划分为训练集、测试集,验证集三个部分。在训练集上训练GAN的模型,然后在验证集上调试超参数,这样模型在训练的过程中就没有到任何测试的样本,如果有比较好的泛化性,它就有能力比较好地去生成未见到的测试样本。

通过GAN来提升分类准确率

这个标题也是我使用GAN的目的,因为当项目的数据量比较小的时候,我们如果采用一般的机器学习算法比如SVM等,可能也能达到一个比较好的效果,但是达到一个很高,比如95%之上的一个准确率可能就不是很容易了。基于这个想法,通过GAN来生成新的的样本,再将所有的样本(生成的和 真实样本)放到CNN中进行分类,观察是否能达到一个让人满意的结果。

之前在某一公共号上看到英伟达在核磁共振图像上基于GAN进一步提升了分类准确率,他的论文是《Medical Image Synthesis for Data Augmentation and Anonymization Using Generative Adversarial Networks》 看了一遍感觉对我项目的意义不大。今天在腾讯云上又看到一篇类似想法的论文《Unlabeled Samples Generated by GAN Improve the Person Re-identification Baseline in vitro》 ,这个腾讯云专栏的地址是第六个参考文献。

我们先讲腾讯云的这篇文章,这篇文章,主要是用原始数据集进行半监督学习,提高行人再识别的准确率。文章提出使用GAN进行新数据的生成,然后采用自己提出的损失函数计算最终的损失。

作者使用真实数据先训练一个DCGAN模型,然后使用DCGAN作为数据生成工具,生成没有标签的数据。然后用真实数据和生成的没有标签的数据进行分类训练,分类模型采用的是resnet50。求损失函数的部分算是作者一个比较创新的地方,作者采用LSRO的方法,就是下面这个公式。

在文中,作者还对这个损失函数进行了推导。作者的实验细节:

  • 作者将LSRO和两个现有的方法(All in one 和 Pseudo label)进行比较,All in one是将生成模型产生的图片当做一个新的类别。Pseudo label方法是将网络的softmax输出的最大概率所对应的分类当做是生成图片的标签。

  • 使用TensorFlow和DCGAN包训练GAN模型,训练数据被resize为128×128,并随机翻转,训练过程中是30个epoch。生成数据时随机输入100维的向量,将大小resize为256×256并用CNN进行训练(LSRO方法)

  • 对CNN,修改ResNet50 的全连接层,使得输出类别为751,702,1367分别对应不同的数据集输入类别数。所有训练图片被剪裁到224×224并随机翻转,同时全连接层之前加入了dropout层,对应不同的数据集设置不同的dropout概率,梯度下降的冲量以及学习率也都设置为不同的参数。

注意: 这个行人再识别,准确地说是图片检索而不是图片分类的问题。

GAN对于样本不平衡的改进

现在实验还没开始做,主要的想法还是用GAN来改进样本不平衡的问题。首先谈一下样本不平衡对CNN分类模型的伤害吧。

在第七个引用文献中已经讲述清楚了样本不平衡的伤害,当然这篇知乎专栏也是搬运的一篇论文《The Impact of Imbalanced Training Data for Convolutional Neural Networks》 具体内容不细数了,直接贴上实验数据图。

小样本不适合深度学习?

根据知乎上的《为什么深度学习对训练样本的数量要求较高?》 知乎用户的回答。模型复杂度惩罚值,需要数量来压低,不然容易过拟合。

参考文献

GAN应用汇总

Python3 初学实践案例(3)argparse 命令行参数库的使用

对抗网络之PG-GAN,无条件下生成更真实的人脸图像[3]

GANs有嘻哈:一次学完10个GANs明星模型(附视频)

从泛化性到Mode Collapse:关于GAN的一些思考

《GAN提高人体重识别准确率》

《训练集样本不平衡问题对CNN的影响》

《为什么深度学习对训练样本的数量要求较高?》