精华内容
参与话题
问答
  • 深度卷积对抗生成网络(DCGAN)

    万次阅读 2016-12-25 20:31:35
    卷积神经网络在有监督学习中的各项任务上都有很好的表现,但在无监督学习领域,却比较少。本文介绍的算法将有监督学习中的CNN和无监督学习中的GAN结合到了一起。

    本文是参考文献[1]的论文笔记。

    卷积神经网络在有监督学习中的各项任务上都有很好的表现,但在无监督学习领域,却比较少。本文介绍的算法将有监督学习中的CNN和无监督学习中的GAN结合到了一起。

    在非CNN条件下,LAPGAN在图像分辨率提升领域也取得了好的效果。

    与其将本文看成是CNN的扩展,不如将其看成GAN的扩展到CNN领域。而GAN的基本算法,可以参考对抗神经网络

    GAN无需特定的cost function的优势和学习过程可以学习到很好的特征表示,但是GAN训练起来非常不稳定,经常会使得生成器产生没有意义的输出。而论文的贡献就在于:

    • 为CNN的网络拓扑结构设置了一系列的限制来使得它可以稳定的训练。
    • 使用得到的特征表示来进行图像分类,得到比较好的效果来验证生成的图像特征表示的表达能力
    • 对GAN学习到的filter进行了定性的分析。
    • 展示了生成的特征表示的向量计算特性。

    模型结构

    模型结构上需要做如下几点变化:

    • 将pooling层convolutions替代,其中,在discriminator上用strided convolutions替代,在generator上用fractional-strided convolutions替代。
    • 在generator和discriminator上都使用batchnorm。
      • 解决初始化差的问题
      • 帮助梯度传播到每一层
      • 防止generator把所有的样本都收敛到同一个点。
      • 直接将BN应用到所有层会导致样本震荡和模型不稳定,通过在generator输出层和discriminator输入层不采用BN可以防止这种现象。
    • 移除全连接层
      • global pooling增加了模型的稳定性,但伤害了收敛速度。
    • 在generator的除了输出层外的所有层使用ReLU,输出层采用tanh。
    • 在discriminator的所有层上使用LeakyReLU。

    DCGAN的generator网络结构:

    在这里插入图片描述

    其中,这里的conv层是four fractionally-strided convolution,在其他的paper中也可能被称为是deconvolution.

    训练细节

    • 预处理环节,将图像scale到tanh的[-1, 1]。
    • mini-batch训练,batch size是128.
    • 所有的参数初始化由(0, 0.02)的正态分布中随即得到
    • LeakyReLU的斜率是0.2.
    • 虽然之前的GAN使用momentum来加速训练,DCGAN使用调好超参的Adam optimizer。
    • learning rate=0.0002
    • 将momentum参数beta从0.9降为0.5来防止震荡和不稳定。

    LSUN效果图

    经过一次循环的训练(online learning)和收敛后得模型得到的效果分别如下:

    在这里插入图片描述
    在这里插入图片描述

    这表明了DCGAN不是通过记忆训练数据来生成/过拟合高质量的图片。

    DCGAN capabilities验证

    为了验证DCGAN的特征表示的有效性,将特征表示输入到L2-SVM中,并将分类结果与其他的无监督学习算法进行对比。

    为了做到这一点,使用在ImageNet-1K上训练得到的generator,使用所有层的所有CNN特征作为输入,将每一层的CNN特征使用max-pooling的方式降到4×4,然后展开,形成一个28672维的向量,输入到L2-SVM中。

    Mnist数据集上的效果对比:

    在这里插入图片描述

    SVNH数据集上的对比:

    在这里插入图片描述

    漫游隐空间

    通过慢慢的调整初始向量来探索隐空间是如何影响最终图片的生成的。这样,既可以探索图片特征是如何折叠到隐空间的,又可以判断这些图片是由于真正学习到了语义特征还是只是记住了图片(如果有sharp的变化)。

    在这里插入图片描述
    在这里插入图片描述

    由上图,可以看到一些逐渐的变化,比如第六行中,逐渐有了一个窗户。第四行中,电视逐渐消失。

    Discriminator Filter

    通过分析filter,我们可以看到,在对房屋特征的学习中,GAN确实学习到了床、窗口等特征。

    在这里插入图片描述

    左侧是随机filter,右侧是学习到的filter,可见,右侧的filter还是有意义的。

    Semantic Mask

    在隐空间上,假设知道哪几个变量控制着某个物体,那么僵这几个变量挡住是不是就可以将生成图片中的某个物体消失?

    论文中的实验是这样的:首先,生成150张图片,包括有窗户的和没有窗户的,然后使用一个逻辑斯底回归函数来进行分类,对于权重不为0的特征,认为它和窗户有关。将其挡住,得到新的生成图片。

    在这里插入图片描述

    Vector Arithmetic

    类似于word2vec,图像是不是也有类似的特点,可以在隐空间里进行加减法来得到新的图像?

    实验表明,使用单张图片的表示并不稳定,使用三张图片会比较稳定。

    在这里插入图片描述
    在这里插入图片描述

    可以看到,单张图片并不稳定,而三张图片则可以学到表情和墨镜等特征。

    更甚者,可以学到一个稳定的向量,来进行某种变换,比如,方位变换。

    在这里插入图片描述

    总结

    这篇paper的主要贡献看似简单,但其实工作量很大,充分展现出作者在调参大法上的卓越功力。

    但我觉得,更大的贡献在于作者对于效果的研究方式,生成模型很难来区分好与坏,而本paper通过探索隐空间,分析网络,比较特征表现能力等一系列手段,证明了DCGAN算法确实是一个强大的算法。

    Reference

    [1]. Unsupervised Representations Learning With Deep Convolutional Generative Adversarial Networks

    更多内容请关注微信公众号【雨石记】。

    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpbnpoYW5neWFueGlhbmc=,size_16,color_FFFFFF,t_70#pic_center
    展开全文
  • 对抗生成网络

    2019-07-23 18:10:42
    在min的时候,我是训练生成器G,使得目标函数变小,在max的时候,我是训练判别器D,使得目标函数变大。--当X时真实数据时,有一个分项,当我的输入Z是一个随机向量时,又有另外一个分项。 假的图像要识别出来 ...

    互补提升 

    在min的时候,我是训练生成器G,使得目标函数变小,在max的时候,我是训练判别器D,使得目标函数变大。--当X时真实数据时,有一个分项,当我的输入Z是一个随机向量时,又有另外一个分项。

    假的图像要识别出来

    输入一维化之后,表达成内积的过程。

    卷积操作和反卷积操作是指size上的对应关系,两种变换都可以用矩阵来表达,此时系数矩阵为转置的关系。

     

    展开全文
  • 深度学习项目实战-对抗生成网络

    千人学习 2017-02-20 23:58:03
    进入学习群,获取唐宇迪老师...后项目实战对抗生成网络的升级版DCGAN,大家都可以基于DCGAN生成出来任何你喜欢的数据。 课程代码基于Tensorflow框架,案例与项目课时会通过debug的形式详解代码中每行的用法。
  • 对抗生成网络(Generative Adversarial Net)

    万次阅读 多人点赞 2016-11-13 19:59:45
    现在,生成模型还没有体会到深度学习的利好,在Discriminative模型上,成果如雨后春笋,但在生成模型上,却并非如此。原因如下: - 在最大似然估计及相关策略上,很多概率计算的模拟非常难 - 将piecewise linear ...

    好久没有更新博客了,但似乎我每次更新博客的时候都这么说(泪)。最近对生活有了一些新的体会,工作上面,新的环境总算是适应了,知道了如何摆正工作和生活之间的关系,如何能在有效率工作的同时还能继续做自己感兴趣的事情。心理上,我依然故我般的做那个简单的技术boy,生活态度偏理想化但可以直面现实……

    突然想到这是一片技术博客,还是不多说自己的事情了,说一说甚嚣尘上的对抗网络吧。

    引入

    Discriminative Model的繁荣发展

    最近,深度学习在很多领域的突破性进展想必不用我多说了。但大家似乎发现了这样的一个现实,即深度学习取得突破性进展的地方貌似都是discriminative的模型。

    所谓的discriminative可以简单的认为是分类问题,比如给一张图片,判断这张图片上有什么动物;再比如给定一段语音,判断这段语音所对应的文字。

    在discriminative的模型上,有很多行之有效的方法,如反向传播,dropout,piecewise linear units等技术。

    Generative Model

    其实,这篇论文很早之前就看了,但我对生成模型在AI里的地位一直不能特别直观的感受。最近才慢慢的理解。

    从细节上来看,生成模型可以做一些无中生有的事情。比如图片的高清化,遮住图片的一部分去修复,再或者画了一幅人脸的肖像轮廓,将其渲染成栩栩如生的照片等等。

    再提高一层,生成模型的终极是创造,通过发现数据里的规律来生产一些东西,这就和真正的人工智能对应起来了。想想一个人,他可以通过看,听,闻去感知这世界,这是所谓的Discriminative,他也可以说,画,想一些新的事情,这就是创造。所以,生成模型我认为是AI在识别任务发展相当成熟之后的AI发展的又一个阶段。

    借东风

    但是现在,生成模型还没有体会到深度学习的利好,在Discriminative模型上,成果如雨后春笋,但在生成模型上,却并非如此。原因如下:

    • 在最大似然估计及相关策略上,很多概率计算的模拟非常难
    • 将piecewise linear units用在生成模型上比较难

    那么,是不是生成模型就借不了深度学习发展的东风了呢?我只能说,有的时候,不得不曲线救国。

    对抗网络

    基本思想

    假设有一种概率分布M,它相对于我们是一个黑盒子。为了了解这个黑盒子中的东西是什么,我们构建了两个东西G和D,G是另一种我们完全知道的概率分布,D用来区分一个事件是由黑盒子中那个不知道的东西产生的还是由我们自己设的G产生的。

    不断的调整G和D,直到D不能把事件区分出来为止。在调整过程中,需要:

    • 优化G,使它尽可能的让D混淆。
    • 优化D,使它尽可能的能区分出假冒的东西。

    当D无法区分出事件的来源的时候,可以认为,G和M是一样的。从而,我们就了解到了黑盒子中的东西。

    简单的例子说明

    在这里插入图片描述
    在这里插入图片描述
    且看上面四张图a,b,c,d. 黑色的点状线代表M所产生的一些数据,红色的线代表我们自己模拟的分布G,蓝色的线代表着分类模型D。

    a图表示初始状态,b图表示,保持G不动,优化D,直到分类的准确率最高。
    c图表示保持D不动,优化G,直到混淆程度最高。d图表示,多次迭代后,终于使得G能够完全你和M产生的数据,从而认为,G就是M。

    形式化

    在这里插入图片描述
    将上述例子所描述的过程公式化,得到如上公式。公式中D(x)表示x属于分布M的概率,因而,优化D的时候就是让V(D,G)最大,优化G的时候就是让V(D,G)最小。

    其中,x~pdata(x) 表示x取自真正的分布。
    z~pz(z) 表示z取自我们模拟的分布。G表示生成模型,D表示分类模型。

    在这里插入图片描述
    上述即是G和D的训练过程。其中在每次迭代中,梯度下降K次来训练D,然后梯度下降一次来训练G,之所以这样做,是因为D的训练是一个非常耗时的操作,且在有限的集合上,训练次数过多容易过拟合。

    证明

    这篇论文中的思想就如上所述,但是有意思的是还有两个证明来从理论上论证了对抗网络的合理性。

    命题一

    第一个证明是,当G固定的时候,D会有唯一的最优解。真实描述如下:

    在这里插入图片描述

    证明如下:

    • 首先,对V(G,D)进行变换
      在这里插入图片描述
    • 对于任意的a,b ∈ R2 \ {0, 0}, 下面的式子在a/(a+b)处达到最优。
      在这里插入图片描述
      得证!

    定理一

    根据证明一,可以对V(G,D)中最大化D的步骤进行变换。

    在这里插入图片描述

    从而得到定理
    在这里插入图片描述

    直接带入pg=pdata可得-log4,当入pg!=pdata时,得到

    在这里插入图片描述

    命题二

    命题二原文如下:

    在这里插入图片描述
    这个定理的证明需要用到凸函数的某个似乎是很明显的定理,即,通过凸函数的上确界的次导数可以找到函数在最大值时的导数。这个理论应用到G和D中就是在G不变时,D是拥有唯一的最优值的凸函数,因而可以得到。 但因为我对凸优化理论尚不熟悉,所以没有理解透彻这个地方。

    实验

    早期的训练中,D可以很轻松的分辨出来G和M中不同的样本,从而会饱和,所以用logD(G(z))来代替log(1-D(G(z)),这样可以为早期的学习提供更加好的梯度。

    实验就是去拟合Guassian Parzen Windown,具体细节略过。结果如下:

    在这里插入图片描述

    优势和劣势

    优势:

    • Markov链不需要了,只需要后向传播就可以了。
    • 生成网络不需要直接用样本来更新了,这是一个可能存在的优势。
    • 对抗网络的表达能力更强劲,而基于Markov链的模型需要分布比较模糊才能在不同的模式间混合。

    劣势:

    • 对于生成模型,没有直接的表达,而是由一些参数控制。
    • D需要和G同步的很好才可以。

    各种生成模型的对比如下:

    在这里插入图片描述

    参考

    更多文章欢迎关注公众号【雨石记】。

    watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpbnpoYW5neWFueGlhbmc=,size_16,color_FFFFFF,t_70#pic_center
    展开全文
  • 对抗生成网络GAN

    2018-11-01 06:52:55
    对抗生成网络GAN:GAN、DCGAN、Pic2Pix、cycleGAN、starGAN、Text2Img
  • 对抗生成网络实战系列主要包括三大核心内容:1.经典GAN论文解读;2.源码复现解读;3.项目实战应用。全程实战解读各大经典GAN模型构建与应用方法,通俗讲解论文中核心知识点与整体网络模型架构,从数据预处理与环境...
  • 对抗样本和对抗生成网络demo,包括一个简单的tensorflow编写的gan网络
  • 对抗生成网络生成卡通人脸demo包括源代码和相关数据下载文件
  • 自从 Ian Goodfellow 在 14 年发表了 论文 Generative Adversarial Nets 以来,生成对抗网络 GAN 广受关注,加上学界大牛 Yann Lecun 在 Quora 答题时曾说,他最激动的深度学习进展是生成对抗网络,使得 GAN ...
  • 关于GAN网络的优化 证明 非常不错...介绍了最小最大优化,并给出了证明,实验也进行了多方面的比较,是对初学者合适不过的一篇Gan系列的人工智能方面的paper,通过这篇可以抛砖引玉,让你在对抗生成网络的海洋中徜徉。
  • 对抗生成网络 各种GAN代码合集. ac gan, bgan, bigan, ccgan,info gan, srgan, wgan
  • TensorFlow2对抗生成网络

    TensorFlow2对抗生成网络

    What i can not create, i do not understand. 我不能创造的东西,我当然不能理解它。

    简介

    对抗生成网络(GAN)是时下非常热门的一种神经网络,它主要用于复现数据的分布(distribution,或者数据的表示(representation))。尽管数据的分布非常的复杂,但是依靠神经网络强大的学习能力,可以学习其中的表示。其中,最典型的技术就是图像生成。GAN的出现是神经网络技术发展极具突破的一个创新。从2014年GAN诞生之时只能和VAE旗鼓相当,到2018年WGAN的以假乱真,GAN的发展是迅速的。

    原理

    GAN网络由两个部分组成,它们是生成器(Generator)和判别器(Discriminator)。将输入数据与生成器产生的数据同时交给判别器检验,如果两者的分布接近(p_g接近p_r),则表示生成器逐渐学习数据的分布,当接近到一定程度(判别器无法判别生成数据的真假),认为学习成功。
    因此关于生成器G和判别器D之间的优化目标函数如下,这就是GAN网络训练的目标。
    minGmaxDL(D,G)=Expr(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]=Expr(x)[logD(x)]+Expz(x)[log(1D(x)] \begin{aligned} \min _{G} \max _{D} L(D, G) &=\mathbb{E}_{x \sim p_{r}(x)}[\log D(x)]+\mathbb{E}_{z \sim p_{z}(z)}[\log (1-D(G(z)))] \\ &=\mathbb{E}_{x \sim p_{r}(x)}[\log D(x)]+\mathbb{E}_{x \sim p_{z}(x)}[\log (1-D(x)]\end{aligned}
    衡量两种分布之间的距离,GAN使用JS散度(基于KL散度推导)衡量两种分布的差异,然而当两种分布(生成器分布和真实分布)直接没有交叉时,KL散度总是0,JS散度总是log2,这就导致JS散度无法很好量化两种分布的差异。同时,此时的将会出现梯度弥散,这也是很多GAN网络难以训练的原因。

    因此,有人提出了衡量两种分布P和Q之间差异的方式是从P分布到Q分布需要经历的变化(代价),可以理解为下图的一种分布变为另一种分布需要移动的砖块数目(移土距离,Earth Mover’s Distance, EM距离)。
    B(γ)=xp,xqγ(xp,xq)xpxq B(\gamma)=\sum_{x_{p}, x_{q}} \gamma\left(x_{p}, x_{q}\right)\left\|x_{p}-x_{q}\right\|
    W(P,Q))=minγΠB(γ) W(P, Q))=\min _{\gamma \in \Pi} B(\gamma)
    在这里插入图片描述
    在这里插入图片描述
    基于此提出了Wasserstein Distance距离如下,将网络中的JS散度替换为Wasserstein Distance的GAN,称为WGAN,它可以从根本上结局不重叠的分布距离难以衡量的问题从而避免训练早期的梯度弥散。(必须满足1-Lipschitz function,为了满足这个条件要进行weight clipping,但是即使weight clipping也不一定可以满足1-Lipschitz function条件。)
    W(Pr,Pg)=infγΠ(Pr,Pg)E(x,y)γ[xy] W\left(\mathbb{P}_{r}, \mathbb{P}_{g}\right)=\inf _{\gamma \in \Pi\left(\mathbb{P}_{r}, \mathbb{P}_{g}\right)} \mathbb{E}_{(x, y) \sim \gamma}[\|x-y\|]

    因此,为了满足这个条件提出了WGAN-GP(Gradient Penalty),将这个条件写入损失函数,要求必须在1附近。
    在这里插入图片描述

    GAN发展

    从GAN思路被提出以来,产生了各种各样的GAN,每一种GAN都有自己的名字,一般以首字母简略称呼(如今A-Z已经几乎用完,可见这几年GAN的发展迅速)。
    在这里插入图片描述
    其中,比较著名的有DCGAN(反卷积GAN,用于图片扩张)。
    在这里插入图片描述
    此外,还有LSGAN、WGAN(尽管效果不如DCGAN,但是不需要花太多精力设计训练过程)等。

    GAN实战

    基于日本Anime数据集生成相应的二次元人物头像,数据集的百度网盘地址如下,提取码g5qa。
    构建的GAN模型结构示意如下,判别器是一个基础的CNN分类器,生成器是将随机生成的数据进行升维成图。
    在这里插入图片描述
    下面给出模型结构代码,具体的训练代码可以在文末Github找到。

    """
    Author: Zhou Chen
    Date: 2019/11/23
    Desc: About
    """
    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras import layers
    
    
    class Generator(keras.Model):
    
        def __init__(self):
            super(Generator, self).__init__()
            # 升维成图
            # z: [b, 100] => [b, 3*3*512] => [b, 3, 3, 512] => [b, 64, 64, 3]
            self.fc = layers.Dense(3 * 3 * 512)
    
            self.conv1 = layers.Conv2DTranspose(256, 3, 3, 'valid')
            self.bn1 = layers.BatchNormalization()
    
            self.conv2 = layers.Conv2DTranspose(128, 5, 2, 'valid')
            self.bn2 = layers.BatchNormalization()
    
            self.conv3 = layers.Conv2DTranspose(3, 4, 3, 'valid')
    
        def call(self, inputs, training=None):
            # [z, 100] => [z, 3*3*512]
            x = self.fc(inputs)
            x = tf.reshape(x, [-1, 3, 3, 512])
            x = tf.nn.leaky_relu(x)
            x = tf.nn.leaky_relu(self.bn1(self.conv1(x), training=training))
            x = tf.nn.leaky_relu(self.bn2(self.conv2(x), training=training))
            x = self.conv3(x)
            x = tf.tanh(x)  # 不使用relu
    
            return x
    
    
    class Discriminator(keras.Model):
    
        def __init__(self):
            super(Discriminator, self).__init__()
            # 分类器
            # [b, 64, 64, 3] => [b, 1]
            self.conv1 = layers.Conv2D(64, 5, 3, 'valid')
    
            self.conv2 = layers.Conv2D(128, 5, 3, 'valid')
            self.bn2 = layers.BatchNormalization()
    
            self.conv3 = layers.Conv2D(256, 5, 3, 'valid')
            self.bn3 = layers.BatchNormalization()
    
            # [b, h, w ,c] => [b, -1]
            self.flatten = layers.Flatten()
            self.fc = layers.Dense(1)
    
        def call(self, inputs, training=None):
            x = tf.nn.leaky_relu(self.conv1(inputs))
            x = tf.nn.leaky_relu(self.bn2(self.conv2(x), training=training))
            x = tf.nn.leaky_relu(self.bn3(self.conv3(x), training=training))
    
            # [b, h, w, c] => [b, -1]
            x = self.flatten(x)
            # [b, -1] => [b, 1]
            logits = self.fc(x)
    
            return logits
    
    
    def main():
        d = Discriminator()
        g = Generator()
    
        x = tf.random.normal([2, 64, 64, 3])
        z = tf.random.normal([2, 100])
    
        prob = d(x)
        print(prob)
        x_hat = g(z)
        print(x_hat.shape)
    
    
    if __name__ == '__main__':
        main()
    
    

    WGAN只需要在GAN代码基础上添加惩罚项,具体见Github。

    补充说明

    • 本文介绍了GAN在TensorFlow2中的实现,更详细的可以查看官方文档。
    • 具体的代码同步至我的Github仓库欢迎star;博客同步至我的个人博客网站,欢迎查看其他文章。
    • 如有疏漏,欢迎指正。
    展开全文
  • 对抗生成网络(GAN)的理论基础,应用领域, 以及训练方法。
  • 基于对抗生成网络的纹理合成方法,山东大学计算机学院2016级毕设论文,查重率10%以下,可参考,引用请说明。
  • 对抗生成网络原理

    2019-11-09 10:43:37
    对抗生成网络模型如下图: 1.分为生成网络G和对抗网络D,对抗网络G是用于生成数据,对抗网络是用语判断真假数据,即判断数据是真实的还是生成的; 2.z是随机生成的隐藏向量,通过生成网络G后得到生成数据G(z); ...
  • GAN对抗生成网络

    2018-06-13 10:40:02
    网上看了很多教程结合自己理解整合了一下。...开始我们知道GAN的思想是是一种二人零和博弈思想(two-player game),博弈双方的利益之和是一个常数,比如两个人掰手腕,假设总的空间是一定的,你的力气大一点,那你就...
  • 白话对抗生成网络

    2020-11-18 15:46:37
    白话对抗生成网络 判别模型和分类模型 常见的判别模型有线性回归,逻辑回归,支持向量机,DNN等。 常见的生成模型有隐马尔科夫模型、朴素贝叶斯模型、高斯混合模型、 LDA、 Restricted Boltzmann Machine 判别模型...
  • 李宏毅GAN对抗生成网络2018最新ppt全套,内容非常详细,结合视频一起学习,将大有裨益
  • AdversarialNetsPapers First paper ✔️ [Generative Adversarial Nets] [Paper] [Code](the First paper of GAN) Image Translation ✔️ [UNSUPERVISED CROSS-DOMAIN IMAGE GENERATION] [Paper][Code] ...
  • 图像生成对抗生成网络ganby Thalles Silva 由Thalles Silva 暖身 (Warm up) Let’s say there’s a very cool party going on in your neighborhood that you really want to go to. But, there is a problem. To ...

空空如也

1 2 3 4 5 ... 20
收藏数 4,859
精华内容 1,943
关键字:

对抗生成网络