精华内容
下载资源
问答
  • GAN网络讲解ppt

    2020-12-13 10:38:52
    该课件分为三部分,首先是GAN最新发展引入,GAN的原理讲解,GAN程序演示;以minist手写体数据集的手写体生成实验。
  • 34种GAN网络,可以满足平时对GAN网络的学习和理解
  • Gan网络代码

    2018-10-23 15:23:33
    使用深度对抗网络完成马和斑马的互换,也可以用作打码,或者去掉马赛克。
  • 现有GAN网络大多数代码实现使用Python、torch等语言,这里,后面用matlab搭建一个简单的GAN网络,便于理解GAN原理。 GAN的鼻祖之作是2014年NIPS一篇文章:Generative Adversarial Net(, 可以细细品味。 分享一个...
  • 一个简单的GAN网络实例,可直接运行,非常适合初学者入门!
  • 使用TensorFlow2.x版本,实现了原始GAN网络,适合GAN网络入门。
  • fid评价指标,衡量GAN网络的一个指标:生成图片的质量(清晰度)和多样性。
  • 该代码是CVPR2018一篇关于文本到图像合成的文章,经过测试可以使用
  • GAN网络原理入门,由浅入深,由结构框架到核心函数的通俗讲解。附GAN网络在各个热门方向的应用。还有这个地方的摘要要凑够50字。
  • 从简单的GAN网络开始,发展到WGAN和具有不同结果的CGAN。 二手的Keras和2功能:发电机频率和发电机电压相位更简单 观察结果:具有2个特征,所获得的综合数据集与真实特征非常相似。 哦耶!! 但是...当使用大量...
  • 应用Keras实现GAN网络的实现,用于学习基本的知识,新手练习使用
  • GAN网络的简单理解

    2018-12-25 10:24:56
    关于GAN网络的快速入门了解,是对于GAN对抗生成网络的入门的重点整理
  • 利用TensorFlow框架做的简单的GAN网络运行jupyter notebook
  • GAN网络-简单明了

    2020-10-10 20:48:08
      生成式对抗网络GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型...

    1.引入

      生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。

    在这里插入图片描述
      在上图中,坏人能把普通的一张白纸制成假钞,警察可以分辨出假钞和真钞。在一轮一轮的较量中,坏人制假钞的水平不断提高,而警察面对越来越难以辨认的假钞也不得不提高自己的辨别能力。
      套用GAN网络相关术语,我们可以这样来讲这个故事:生成模型(Generative Model,坏人) 可以将一个输入噪音(白纸)生成和真实数据差不多的数据(假钞),判别模型(Discriminative Model,警察) 能够判断出真实数据(真钱)和类真实数据(假钞)。在一轮又一轮的博弈中,生成模型(Generative Model,坏人)能够输出非常接近真实数据的数据。
    GAN网络的目标是使得生成的数据和真实数据更接近。为了达到这个目标,一方面,我们要求G(x)(生成模型网络)能够学习到一组很好的模型参数,使得D(x)(判别模型网络)判别不出来真实数据和类真实数据的区别,另一方面,我们要求D(x)(判别模型网络)的判别能力很强,能够完成对数据的真实性做出很好的二分类任务。

    2.GAN能干什么?

     GAN的初衷就是生成不存在于真实世界的数据,类似于使得 AI具有创造力或者想象力。应用场景如下:

    1. AI作家,AI画家等需要创造力的AI体;
    2. 将模糊图变清晰(去雨,去雾,去抖动,去马赛克等),这需要AI具有所谓的“想象力”,能脑补情节;
    3. 进行数据增强,根据已有数据生成更多新数据供以feed,可以减缓模型过拟合现象。

    3.算法原理

    在这里插入图片描述
      如上图所示,x代表真实数据,z代表噪音,G(z)代表一个输入噪音通过生成网络后的输出。一方面,我们希望判别网络能够准确判断出数据的真实性,即D(x)尽可能接近1,D(G(z))尽可能接近于0;另一方面,我们希望生成网络产生的数据非常接近真实数据,即D(G(z))尽可能接近于1。

    损失函数:
    m i n G m a x D V ( D , G ) = E x ∼ p d a t a ( x ) [ l o g D ( x ) ] + E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] min_{G}max_{D}V(D,G)=E_{x\sim p_{data(x)}}[logD(x)]+E_{z\sim p_{z}(z)}[log(1-D(G(z)))] minGmaxDV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]
    可以这样理解:损失函数做的是最大化D的区分度,最小化G输出和真实数据的区别。
    损失函数可以拆分为两部分:
    判别模型: l o g ( D 1 ( x ) ) + l o g ( 1 − D 2 ( G ( z ) ) ) … ( 1 ) log(D1(x))+log(1-D2(G(z)))…(1) log(D1(x))+log(1D2(G(z)))(1)
    生成模型: l o g ( D 2 ( G ( z ) ) ) … ( 2 ) log(D2(G(z)))…(2) log(D2(G(z)))(2)
    当判别模型能力强时, D 1 ( x ) − > 1 D1(x)->1 D1(x)>1, D 2 ( G ( z ) ) − > 0 D2(G(z))->0 D2(G(z))>0,(1)式趋近于0
    当生成模型能力强时, D 2 ( G ( z ) ) − > 1 D2(G(z))->1 D2(G(z))>1,(2)式趋近于0

    4.GAN的两大护法G和D

    理解GAN的两大护法G和D

    • G是 generator,生成器: 负责凭空捏造数据出来。
    • D是 discriminator,判别器: 负责判断数据是不是真数据。

      这样可以简单的看作是两个网络的博弈过程。在最原始的GAN论文里面,G和D都是两个多层感知机网络。首先,注意一点,GAN操作的数据不一定非得是图像数据,不过为了更方便解释,我在这里用图像数据为例解释以下GAN:
    在这里插入图片描述
      上图,z是随机噪声(就是随机生成的一些数,也就是GAN生成图像的源头)。D通过真图和假图的数据(相当于天然label),进行一个二分类神经网络训练(想各位必再熟悉不过了)。G根据一串随机数就可以捏造一个“假图像”出来,用这些假图去欺骗D,D负责辨别这是真图还是假图,会给出一个score。比如,G生成了一张图,在D这里得分很高,那证明G是很成功的;如果D能有效区分真假图,则G的效果还不太好,需要调整参数。GAN就是这么一个博弈的过程。

    5.训练过程

      根据GAN的训练算法,我们有:
    在这里插入图片描述

      GAN的训练在同一轮梯度反传的过程中可以细分为2步,先训练D再训练G;注意不是等所有的D训练好以后,才开始训练G,因为D的训练也需要上一轮梯度反传中G的输出值作为输入

    • 当训练D的时候,上一轮G产生的图片,和真实图片,直接拼接在一起,作为x。然后根据,按顺序摆放0和1,假图对应0,真图对应1。然后就可以通过,x输入生成一个score(从0到1之间的数),通过score和y组成的损失函数,就可以进行梯度反传了。(我在图片上举的例子是batch = 1,len(y)=2*batch,训练时通常可以取较大的batch)

    • 当训练G的时候, 需要把G和D当作一个整体,我在这里取名叫做’D_on_G’。这个整体(下面简称DG系统)的输出仍然是score。输入一组随机向量,就可以在G生成一张图,通过D对生成的这张图进行打分,这就是DG系统的前向过程。score=1就是DG系统需要优化的目标,score和y=1之间的差异可以组成损失函数,然后可以反向传播梯度。注意,这里的D的参数是不可训练的。这样就能保证G的训练是符合D的打分标准的。这就好比:如果你参加考试,你别指望能改变老师的评分标准

    参考文献

    1.https://blog.csdn.net/LEE18254290736/article/details/97371930
    2.https://blog.csdn.net/leviopku/article/details/81292192
    3.https://blog.csdn.net/weixin_43535573/article/details/89035764

    展开全文
  • GAN网络详解

    千次阅读 2020-09-26 22:11:25
    生成对抗网络(Generative Adversarial Nets)模型中的两位博弈方分别有生成网络(Generator)与判别网络(Discriminator)充当。当生成网络G捕捉到样本数据分布,用服从某一分布的噪声z生成一个类似真实训练数据的...

    算法描述
    生成对抗网络(Generative Adversarial Nets)模型中的两位博弈方分别有生成网络(Generator)与判别网络(Discriminator)充当。当生成网络G捕捉到样本数据分布,用服从某一分布的噪声z生成一个类似真实训练数据的样本,与真实样本越接近越好;判别网络D一般是一个二分类模型,在本文中D是一个多分类器,用于估计一个样本来自于真实数据的概率,如果样本来自于真实数据,则D输出大概率,否则输出小概率。本文中,判别网络需要在此基础上实现分类功能。

    在训练的过程中,需要固定一方,更新另一方的网络状态,如此交替进行。在整个训练的过程中,双方都极力优化自己的网络,从而形成竞争对抗,知道双方达到一个动态的平衡。此时生成网络训练出来的数据与真实数据的分布几乎相同,判别网络也无法再判断出真伪。
    本文中生成对抗网络主要分为两部分,生成网络(Generator)与判别网络(Discriminator)。向生成网络内输入噪声,通过多次反卷积的方式得到一个28x28x1的图像作为X_fake,此时将真实的图像X_real与生成器生成的X_fake放入判别网络,判别网络使用多次卷积与Sigmoid函数并通过交叉熵函数计算出判别网络的损失函数D_loss,通过判别网络的损失函数D_loss计算得到生成网络损失函数G_loss。使用G_loss与D_loss对生成网络与判别网络进行参数调整。
    在这里插入图片描述

    算法流程
    1.输入噪声z
    2.通过生成网络G得到X_fake=G(z)
    3.从数据集中获取真实数据X_real
    4.通过判别网络D计算D(real logits)=D(X_real)
    5.通过判别网络D计算D(fake logits)=D(X_fake)
    6.使用交叉熵函数做损失函数根据D(real logits)计算D(loss real)
    7.使用交叉熵函数做损失函数根据D(fake logits)计算D(loss fake)
    8.计算判别网络损失函数D_loss=D(loss real)+ D_(loss fake)
    9.使用交叉熵函数做损失函数计算生成网络损失函数G_loss
    10.使用D_loss对判别网络进行参数调整,使用G_loss对生成网络参数进行调整

    它做的是去最大化D的区分度,最小化G(U-net)和real数据集的数据分布,在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值

    在原始 GAN 中,无法控制要生成的内容,因为输出仅依赖于随机噪声。我们可以将条件输入 c 添加到随机噪声 Z,以便生成的图像由 G(c,z) 定义。这就是 CGAN[6],通常条件输入矢量 c 与噪声矢量 z 直接连接即可,并且将得到的矢量原样作为发生器的输入,就像它在原始 GAN 中一样。条件 c 可以是图像的类,对象的属性或嵌入想要生成的图像的文本描述,甚至是图片。

    在这里插入图片描述

    使用 PyTorch 实现一个简单的 GAN 模型。以绘画创作为例,假设我们要创造如下“名画”(以正弦图形为例):
    在这里插入图片描述

    生成该“艺术画作”的代码如下:

    def artist_works(): # painting from the famous artist (real target)
    r = 0.02 * np.random.randn(1, ART_COMPONENTS)
    paintings = np.sin(PAINT_POINTS * np.pi) + r
    paintings = torch.from_numpy(paintings).float()
    return paintings
    然后,分别定义 G 网络和 D 网络模型:

    G = nn.Sequential( # Generator
    nn.Linear(N_IDEAS, 128), # random ideas (could from normal distribution)
    nn.ReLU(),
    nn.Linear(128, ART_COMPONENTS), # making a painting from these random ideas)

    D = nn.Sequential( # Discriminator
    nn.Linear(ART_COMPONENTS, 128), # receive art work either from the famous artist or a newbie like G
    nn.ReLU(),
    nn.Linear(128, 1),
    nn.Sigmoid(), # tell the probability that the art work is made by artist
    )
    我们设置 Adam 算法进行优化:

    opt_D = torch.optim.Adam(D.parameters(), lr=LR_D)
    opt_G = torch.optim.Adam(G.parameters(), lr=LR_G)
    最后,构建 GAN 迭代训练过程:

    plt.ion() # something about continuous plotting

    D_loss_history = []
    G_loss_history = []
    for step in range(10000):
    artist_paintings = artist_works() # real painting from artist
    G_ideas = torch.randn(BATCH_SIZE, N_IDEAS) # random ideas G_paintings = G(G_ideas) # fake painting from G (random ideas)

    prob_artist0 = D(artist_paintings) # D try to increase this prob
    prob_artist1 = D(G_paintings) # D try to reduce this prob

    D_loss = - torch.mean(torch.log(prob_artist0) + torch.log(1. - prob_artist1))
    G_loss = torch.mean(torch.log(1. - prob_artist1))

    D_loss_history.append(D_loss)
    G_loss_history.append(G_loss)

    opt_D.zero_grad()
    D_loss.backward(retain_graph=True) # reusing computational graph
    opt_D.step()

    opt_G.zero_grad()
    G_loss.backward()
    opt_G.step()

    if step % 50 == 0: # plotting
    plt.cla()
    plt.plot(PAINT_POINTS[0], G_paintings.data.numpy()[0], c=’#4AD631’, lw=3, label=‘Generated painting’,)
    plt.plot(PAINT_POINTS[0], np.sin(PAINT_POINTS[0] * np.pi), c=’#74BCFF’, lw=3, label=‘standard curve’)
    plt.text(-1, 0.75, ‘D accuracy=%.2f (0.5 for D to converge)’ % prob_artist0.data.numpy().mean(), fontdict={‘size’: 8}) plt.text(-1, 0.5, ‘D score= %.2f (-1.38 for G to converge)’ % -D_loss.data.numpy(), fontdict={‘size’: 8})
    plt.ylim((-1, 1));plt.legend(loc=‘lower right’, fontsize=10);plt.draw();plt.pause(0.01)

    plt.ioff()
    plt.show()

    采用动态绘图的方式,便于时刻观察 GAN 模型训练情况。
    迭代次数为 1 时:在这里插入图片描述

    迭代次数为 200 时:
    在这里插入图片描述
    迭代次数为 1000 时:在这里插入图片描述

    迭代次数为 10000 时:在这里插入图片描述

    经过 10000 次迭代训练之后,生成的曲线已经与标准曲线非常接近了。D 的 score 也如预期接近 0.5。

    展开全文
  • 理解GAN网络基本原理

    万次阅读 多人点赞 2019-04-15 13:03:32
    现有GAN网络大多数代码实现使用python、torch等语言,这里,后面用matlab搭建一个简单的GAN网络,便于理解GAN原理。 GAN的鼻祖之作是2014年NIPS一篇文章: Generative Adversarial Net ,可以细细品味。 分享一...

    GAN网络是近两年深度学习领域的新秀,火的不行,本文旨在浅显理解传统GAN,分享学习心得。现有GAN网络大多数代码实现使用python、torch等语言,这里,后面用matlab搭建一个简单的GAN网络,便于理解GAN原理。

    GAN的鼻祖之作是2014年NIPS一篇文章:Generative Adversarial Net,可以细细品味。

    开始

    我们知道GAN的思想是是一种二人零和博弈思想(two-player game),博弈双方的利益之和是一个常数,比如两个人掰手腕,假设总的空间是一定的,你的力气大一点,那你就得到的空间多一点,相应的我的空间就少一点,相反我力气大我就得到的多一点,但有一点是确定的就是,我两的总空间是一定的,这就是二人博弈,但是呢总利益是一定的。

    引申到GAN里面就是可以看成,GAN中有两个这样的博弈者,一个人名字是生成模型(G),另一个人名字是判别模型(D)。他们各自有各自的功能。

    相同点是:

    • 这两个模型都可以看成是一个黑匣子,接受输入然后有一个输出,类似一个函数,一个输入输出映射。

    不同点是:

    • 生成模型功能:比作是一个样本生成器,输入一个噪声/样本,然后把它包装成一个逼真的样本,也就是输出。
    • 判别模型:比作一个二分类器(如同0-1分类器),来判断输入的样本是真是假。(就是输出值大于0.5还是小于0.5);

    直接上一张个人觉得解释的好的图说明:
    这里写图片描述

    在之前,我们首先明白在使用GAN的时候的2个问题

    • 我们有什么?
      比如上面的这个图,我们有的只是真实采集而来的人脸样本数据集,仅此而已,而且很关键的一点是我们连人脸数据集的类标签都没有,也就是我们不知道那个人脸对应的是谁。
    • 我们要得到什么
      至于要得到什么,不同的任务得到的东西不一样,我们只说最原始的GAN目的,那就是我们想通过输入一个噪声,模拟得到一个人脸图像,这个图像可以非常逼真以至于以假乱真。

    好了再来理解下GAN的两个模型要做什么。首先判别模型,就是图中右半部分的网络,直观来看就是一个简单的神经网络结构,输入就是一副图像,输出就是一个概率值,用于判断真假使用(概率值大于0.5那就是真,小于0.5那就是假),真假也不过是人们定义的概率而已。其次是生成模型,生成模型要做什么呢,同样也可以看成是一个神经网络模型,输入是一组随机数Z,输出是一个图像,不再是一个数值而已。从图中可以看到,会存在两个数据集,一个是真实数据集,这好说,另一个是假的数据集,那这个数据集就是有生成网络造出来的数据集。好了根据这个图我们再来理解一下GAN的目标是要干什么:

    • 判别网络的目的:就是能判别出来属于的一张图它是来自真实样本集还是假样本集。假如输入的是真样本,网络输出就接近1,输入的是假样本,网络输出接近0,那么很完美,达到了很好判别的目的。
    • 生成网络的目的:生成网络是造样本的,它的目的就是使得自己造样本的能力尽可能强,强到什么程度呢,你判别网络没法判断我是真样本还是假样本。

    有了这个理解我们再来看看为什么叫做对抗网络了。判别网络说,我很强,来一个样本我就知道它是来自真样本集还是假样本集。生成网络就不服了,说我也很强,我生成一个假样本,虽然我生成网络知道是假的,但是你判别网络不知道呀,我包装的非常逼真,以至于判别网络无法判断真假,那么用输出数值来解释就是,生成网络生成的假样本进去了判别网络以后,判别网络给出的结果是一个接近0.5的值,极限情况就是0.5,也就是说判别不出来了,这就是纳什平衡了。

    由这个分析可以发现,生成网络与判别网络的目的正好是相反的,一个说我能判别的好,一个说我让你判别不好。所以叫做对抗,叫做博弈。那么最后的结果到底是谁赢呢?这就要归结到设计者,也就是我们希望谁赢了。作为设计者的我们,我们的目的是要得到以假乱真的样本,那么很自然的我们希望生成样本赢了,也就是希望生成样本很真,判别网络能力不足以区分真假样本位置。

    再理解

    知道了GAN大概的目的与设计思路,那么一个很自然的问题来了就是我们该如何用数学方法解决这么一个对抗问题。这就涉及到如何训练这样一个生成对抗网络模型了,还是先上一个图,用图来解释最直接:
    这里写图片描述

    需要注意的是生成模型与对抗模型可以说是完全独立的两个模型,好比就是完全独立的两个神经网络模型,他们之间没有什么联系。

    好了那么训练这样的两个模型的大方法就是:单独交替迭代训练

    什么意思?因为是2个网络,不好一起训练,所以才去交替迭代训练,我们一一来看。
    假设现在生成网络模型已经有了(当然可能不是最好的生成网络),那么给一堆随机数组,就会得到一堆假的样本集(因为不是最终的生成模型,那么现在生成网络可能就处于劣势,导致生成的样本就不咋地,可能很容易就被判别网络判别出来了说这货是假冒的),但是先不管这个,假设我们现在有了这样的假样本集,真样本集一直都有,现在我们人为的定义真假样本集的标签,因为我们希望真样本集的输出尽可能为1,假样本集为0,很明显这里我们就已经默认真样本集所有的类标签都为1,而假样本集的所有类标签都为0. 有人会说,在真样本集里面的人脸中,可能张三人脸和李四人脸不一样呀,对于这个问题我们需要理解的是,我们现在的任务是什么,我们是想分样本真假,而不是分真样本中那个是张三label、那个是李四label。况且我们也知道,原始真样本的label我们是不知道的。回过头来,我们现在有了真样本集以及它们的label(都是1)、假样本集以及它们的label(都是0),这样单就判别网络来说,此时问题就变成了一个再简单不过的有监督的二分类问题了,直接送到神经网络模型中训练就完事了。假设训练完了,下面我们来看生成网络。

    对于生成网络,想想我们的目的,是生成尽可能逼真的样本。那么原始的生成网络生成的样本你怎么知道它真不真呢?就是送到判别网络中,所以在训练生成网络的时候,我们需要联合判别网络一起才能达到训练的目的。什么意思?就是如果我们单单只用生成网络,那么想想我们怎么去训练?误差来源在哪里?细想一下没有,但是如果我们把刚才的判别网络串接在生成网络的后面,这样我们就知道真假了,也就有了误差了。所以对于生成网络的训练其实是对生成-判别网络串接的训练,就像图中显示的那样。好了那么现在来分析一下样本,原始的噪声数组Z我们有,也就是生成了假样本我们有,此时很关键的一点来了,我们要把这些假样本的标签都设置为1,也就是认为这些假样本在生成网络训练的时候是真样本。那么为什么要这样呢?我们想想,是不是这样才能起到迷惑判别器的目的,也才能使得生成的假样本逐渐逼近为正样本。好了,重新顺一下思路,现在对于生成网络的训练,我们有了样本集(只有假样本集,没有真样本集),有了对应的label(全为1),是不是就可以训练了?有人会问,这样只有一类样本,训练啥呀?谁说一类样本就不能训练了?只要有误差就行。还有人说,你这样一训练,判别网络的网络参数不是也跟着变吗?没错,这很关键,所以在训练这个串接的网络的时候,一个很重要的操作就是不要判别网络的参数发生变化,也就是不让它参数发生更新,只是把误差一直传,传到生成网络那块后更新生成网络的参数。这样就完成了生成网络的训练了。

    在完成生成网络训练好,那么我们是不是可以根据目前新的生成网络再对先前的那些噪声Z生成新的假样本了,没错,并且训练后的假样本应该是更真了才对。然后又有了新的真假样本集(其实是新的假样本集),这样又可以重复上述过程了。我们把这个过程称作为单独交替训练。我们可以实现定义一个迭代次数,交替迭代到一定次数后停止即可。这个时候我们再去看一看噪声Z生成的假样本会发现,原来它已经很真了。

    看完了这个过程是不是感觉GAN的设计真的很巧妙,个人觉得最值得称赞的地方可能在于这种假样本在训练过程中的真假变换,这也是博弈得以进行的关键之处。

    进一步

    文字的描述相信已经让大多数的人知道了这个过程,下面我们来看看原文中几个重要的数学公式描述,首先我们直接上原始论文中的目标公式吧:

    minGmaxDV(D,G)=Expdata(x)[log(D(x))]+Ezpz(z)[log(1D(G(z)))]minGmaxDV(D,G)=Ex∼pdata(x)[log(D(x))]+Ez∼pz(z)[log(1−D(G(z)))]

    上述这个公式说白了就是一个最大最小优化问题,其实对应的也就是上述的两个优化过程。有人说如果不看别的,能达看到这个公式就拍案叫绝的地步,那就是机器学习的顶级专家,哈哈,真是前路漫漫。同时也说明这个简单的公式意义重大。

    这个公式既然是最大最小的优化,那就不是一步完成的,其实对比我们的分析过程也是这样的,这里现优化D,然后在取优化G,本质上是两个优化问题,把拆解就如同下面两个公式:

    优化D:

    maxDV(D,G)=Expdata(x)[log(D(x))]+Ezpz(z)[log(1D(G(z)))]maxDV(D,G)=Ex∼pdata(x)[log(D(x))]+Ez∼pz(z)[log(1−D(G(z)))]

    优化G:

    minGV(D,G)=Ezpz(z)[log(1D(G(z)))]minGV(D,G)=Ez∼pz(z)[log(1−D(G(z)))]

    可以看到,优化D的时候,也就是判别网络,其实没有生成网络什么事,后面的G(z)这里就相当于已经得到的假样本。优化D的公式的第一项,使的真样本x输入的时候,得到的结果越大越好,可以理解,因为需要真样本的预测结果越接近于1越好嘛。对于假样本,需要优化是的其结果越小越好,也就是D(G(z))越小越好,因为它的标签为0。但是呢第一项是越大,第二项是越小,这不矛盾了,所以呢把第二项改成1-D(G(z)),这样就是越大越好,两者合起来就是越大越好。 那么同样在优化G的时候,这个时候没有真样本什么事,所以把第一项直接却掉了。这个时候只有假样本,但是我们说这个时候是希望假样本的标签是1的,所以是D(G(z))越大越好,但是呢为了统一成1-D(G(z))的形式,那么只能是最小化1-D(G(z)),本质上没有区别,只是为了形式的统一。之后这两个优化模型可以合并起来写,就变成了最开始的那个最大最小目标函数了。

    所以回过头来我们来看这个最大最小目标函数,里面包含了判别模型的优化,包含了生成模型的以假乱真的优化,完美的阐释了这样一个优美的理论。

    再进一步

    有人说GAN强大之处在于可以自动的学习原始真实样本集的数据分布,不管这个分布多么的复杂,只要训练的足够好就可以学出来。针对这一点,感觉有必要好好理解一下为什么别人会这么说。

    我们知道,传统的机器学习方法,我们一般都会定义一个什么模型让数据去学习。比如说假设我们知道原始数据属于高斯分布呀,只是不知道高斯分布的参数,这个时候我们定义高斯分布,然后利用数据去学习高斯分布的参数得到我们最终的模型。再比如说我们定义一个分类器,比如SVM,然后强行让数据进行东变西变,进行各种高维映射,最后可以变成一个简单的分布,SVM可以很轻易的进行二分类分开,其实SVM已经放松了这种映射关系了,但是也是给了一个模型,这个模型就是核映射(什么径向基函数等等),说白了其实也好像是你事先知道让数据该怎么映射一样,只是核映射的参数可以学习罢了。所有的这些方法都在直接或者间接的告诉数据你该怎么映射一样,只是不同的映射方法能力不一样。那么我们再来看看GAN,生成模型最后可以通过噪声生成一个完整的真实数据(比如人脸),说明生成模型已经掌握了从随机噪声到人脸数据的分布规律了,有了这个规律,想生成人脸还不容易。然而这个规律我们开始知道吗?显然不知道,如果让你说从随机噪声到人脸应该服从什么分布,你不可能知道。这是一层层映射之后组合起来的非常复杂的分布映射规律。然而GAN的机制可以学习到,也就是说GAN学习到了真实样本集的数据分布。

    再拿原论文中的一张图来解释:
    这里写图片描述

    这张图表明的是GAN的生成网络如何一步步从均匀分布学习到正太分布的。原始数据x服从正太分布,这个过程你也没告诉生成网络说你得用正太分布来学习,但是生成网络学习到了。假设你改一下x的分布,不管什么分布,生成网络可能也能学到。这就是GAN可以自动学习真实数据的分布的强大之处。

    还有人说GAN强大之处在于可以自动的定义潜在损失函数。 什么意思呢,这应该说的是判别网络可以自动学习到一个好的判别方法,其实就是等效的理解为可以学习到好的损失函数,来比较好或者不好的判别出来结果。虽然大的loss函数还是我们人为定义的,基本上对于多数GAN也都这么定义就可以了,但是判别网络潜在学习到的损失函数隐藏在网络之中,不同的问题这个函数就不一样,所以说可以自动学习这个潜在的损失函数。

    开始做小实验

    本节主要实验一下如何通过随机数组生成mnist图像。mnist手写体数据库应该都熟悉的。这里简单的使用matlab来实现,方便看到整个实现过程。这里用到了一个工具箱
    DeepLearnToolbox,关于该工具箱的一些其他使用说明

    网络结构很简单,就定义成下面这样子:
    这里写图片描述

    将上述工具箱添加到路径,然后运行下面代码:

    clc
    clear
    %% 构造真实训练样本 60000个样本 1*784维(28*28展开)
    load mnist_uint8;
    
    train_x = double(train_x(1:60000,:)) / 255;
    % 真实样本认为为标签 [1 0]; 生成样本为[0 1];
    train_y = double(ones(size(train_x,1),1));
    % normalize
    train_x = mapminmax(train_x, 0, 1);
    
    rand('state',0)
    %% 构造模拟训练样本 60000个样本 1*100维
    test_x = normrnd(0,1,[60000,100]); % 0-255的整数
    test_x = mapminmax(test_x, 0, 1);
    
    test_y = double(zeros(size(test_x,1),1));
    test_y_rel = double(ones(size(test_x,1),1));
    
    %%
    nn_G_t = nnsetup([100 784]);
    nn_G_t.activation_function = 'sigm';
    nn_G_t.output = 'sigm';
    
    nn_D = nnsetup([784 100 1]);
    nn_D.weightPenaltyL2 = 1e-4;  %  L2 weight decay
    nn_D.dropoutFraction = 0.5;   %  Dropout fraction 
    nn_D.learningRate = 0.01;                %  Sigm require a lower learning rate
    nn_D.activation_function = 'sigm';
    nn_D.output = 'sigm';
    % nn_D.weightPenaltyL2 = 1e-4;  %  L2 weight decay
    
    nn_G = nnsetup([100 784 100 1]);
    nn_G.weightPenaltyL2 = 1e-4;  %  L2 weight decay
    nn_G.dropoutFraction = 0.5;   %  Dropout fraction 
    nn_G.learningRate = 0.01;                %  Sigm require a lower learning rate
    nn_G.activation_function = 'sigm';
    nn_G.output = 'sigm';
    % nn_G.weightPenaltyL2 = 1e-4;  %  L2 weight decay
    
    opts.numepochs =  1;        %  Number of full sweeps through data
    opts.batchsize = 100;       %  Take a mean gradient step over this many samples
    %%
    num = 1000;
    tic
    for each = 1:1500
        %----------计算G的输出:假样本------------------- 
        for i = 1:length(nn_G_t.W)   %共享网络参数
            nn_G_t.W{i} = nn_G.W{i};
        end
        G_output = nn_G_out(nn_G_t, test_x);
        %-----------训练D------------------------------
        index = randperm(60000);
        train_data_D = [train_x(index(1:num),:);G_output(index(1:num),:)];
        train_y_D = [train_y(index(1:num),:);test_y(index(1:num),:)];
        nn_D = nntrain(nn_D, train_data_D, train_y_D, opts);%训练D
        %-----------训练G-------------------------------
        for i = 1:length(nn_D.W)  %共享训练的D的网络参数
            nn_G.W{length(nn_G.W)-i+1} = nn_D.W{length(nn_D.W)-i+1};
        end
        %训练G:此时假样本标签为1,认为是真样本
        nn_G = nntrain(nn_G, test_x(index(1:num),:), test_y_rel(index(1:num),:), opts);
    end
    toc
    for i = 1:length(nn_G_t.W)
        nn_G_t.W{i} = nn_G.W{i};
    end
    fin_output = nn_G_out(nn_G_t, test_x);
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    函数nn_G_out为:

    function output = nn_G_out(nn, x)
        nn.testing = 1;
        nn = nnff(nn, x, zeros(size(x,1), nn.size(end)));
        nn.testing = 0;
        output = nn.a{end};
    end
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    看一下这个及其简单的函数,其实最值得注意的就是中间那个交替训练的过程,这里我分了三步列出来:

    • 重新计算假样本(假样本每次是需要更新的,产生越来越像的样本)
    • 训练D网络,一个二分类的神经网络;
    • 训练G网络,一个串联起来的长网络,也是一个二分类的神经网络(不过只有假样本来训练),同时D部分参数在下一次的时候不能变了。

    就这样调一调参数,最终输出在fin_output里面,多运行几次显示不同运行次数下的结果:

    这里写图片描述

    可以看到的是结果还是有点像模像样的。

    实验总结

    运行上述简单的网络我发现几个问题:

    • 网络存在着不收敛问题;网络不稳定;网络难训练;读过原论文其实作者也提到过这些问题,包括GAN刚出来的时候,很多人也在致力于解决这些问题,当你实验自己碰到的时候,还是很有意思的。那么这些问题怎么体现的呢,举个例子,可能某一次你会发现训练的误差很小,在下一代训练时,马上又出现极限性的上升的很厉害,过几代又发现训练误差很小,震荡太严重。
    • 其次网络需要调才能出像样的结果。交替迭代次数的不同结果也不一样。比如每一代训练中,D网络训练2回,G网络训练一回,结果就不一样。
    • 这是简单的无条件GAN,所以每一代训练完后,只能出现一个结果,那就是0-9中的某一个数。要想在一代训练中出现好几种结果,就需要使用到条件GAN了。

    最后

    现在的GAN已经到了五花八门的时候了,各种GAN应用也很多,理解底层原理再慢慢往上层扩展。GAN还是一个很厉害的东西,它使得现有问题从有监督学习慢慢过渡到无监督学习,而无监督学习才是自然界中普遍存在的,因为很多时候没有办法拿到监督信息的。要不Yann Lecun赞叹GAN是机器学习近十年来最有意思的想法。

    福利

    该节部分出了个视频版的讲解,详情请点击:http://www.mooc.ai/open/course/301
    欢迎关注【微信公众号:AInewworld】了解更多。

    展开全文
  • 怎么训练 GAN 网络

    千次阅读 2020-06-09 12:04:03
    我最近看的一些底层图像算法的 paper 有很多用了各种变形的 GAN 来做。...因此,GAN 网络中包含一个生成器和一个判别器,如下图所示。生成器和判别器本质是两个独立的网络,因此训练的时候独立训练。 ...

            我最近看的一些底层图像算法的 paper 有很多用了各种变形的 GAN 来做。我就很好奇,GAN 到底有啥牛逼。网上关于 GAN 的介绍很多,我从 GAN 的训练角度口头解释下其训练机制。

            GAN 的核心思想是纳什均衡理论。因此,GAN 网络中包含一个生成器和一个判别器,如下图所示。生成器和判别器本质是两个独立的网络,因此训练的时候独立训练。

                        

                                                                                       GAN 结构示意图(来源网络)

            其训练机理为:生成器和判别器单独交替训练。步骤如下:

    1. 训练判别器:

        固定生成器的参数,x 输入判别器后输出的结果标签为1,随机噪声 z 输入生成器得到 G(z),再输入判别器后得到的输出结果标签为0,训练判别器到收敛。

    2. 训练生成器:

        固定判别器的参数,随机噪声输入生成器得到的假图,然后输入判别器得到的结果的标签为1,训练生成器到收敛。

    3. 交替循环步骤1和2,当然也可以在不收敛的过程中交替训练。

        具体的操作步骤我还没有实践过,改天有时间玩个 demo。

     

    展开全文
  • GAN网络的理解

    2020-12-28 09:38:49
    工作中会用到GAN网络,现将其基本思路总结如下。 GAN网络的核心思想: GAN的核心思想在于对抗,有两部分模型构成,分别是生成模型(generator model)和判别模型(discriminator model)。生成模型用于生成一个逼真...
  • 深度学习--- GAN网络原理解析

    千次阅读 2019-10-16 20:22:32
    Generative Adversarial Network对抗生成...GAN区别与传统的生成网络,生成的图片还原度高,主要缘于D网络基于数据相对位置和数据本身对realrealreal数据奖励,对fakefakefake数据惩罚的缘故 1.GAN思想 & 与单个...
  • 2017 如何训练一个GAN网络

    千次阅读 2019-04-08 22:26:56
    GAN, 作为一种非常厉害的生成模型, 在近年来得到了广泛的应用. Soumith, PyTorch之父, 毕业于纽约大学的Facebook的VP, 在2015年发明了DCGAN: Deep Convolutional GAN. 它显式的使用卷积和转置卷积在判别器和生成器中...
  • 浅谈GAN网络

    万次阅读 2018-07-28 18:13:20
    GAN网络现在是研究的热门领域,CV中几乎所有的任务开始使用了GAN来提升性能,跟着研究潮流,这二天看了看Lan GoodFellow 2014年关于GAN网络的开山之作《Generative Adversarial Nets》,因为看得是第一篇有关GAN的...
  • GAN网络的一些基本知识(杂记)

    万次阅读 2018-10-09 01:08:18
    【题目】GAN网络的一些基本知识(杂记) 【说明】本文的主要内容来自https://blog.csdn.net/xg123321123/article/details/78034859,对原博文进行了删减和修改,主要是其简化版本,想要了解详情请阅读原文,如若...
  • GAN网络详解(从零入门)

    万次阅读 多人点赞 2019-07-26 17:04:57
    从一个小白的方式理解GAN网络(生成对抗网络),可以认为是一个造假机器,造出来的东西跟真的一样,下面开始讲如何造假:(主要讲解GAN代码,代码很简单) 我们首先以造小狗的假图片为例。 首先需要一个生成小狗...
  • 自编码器与GAN网络

    千次阅读 2020-01-27 11:10:01
    在神经网络中分为监督学习和非监督学习,而自编码器就是通过非监督学习,学到输入数据高效表示的人工神经网络。输入数据的这一高效表示称为编码,其维度一般远小于输入数据,使得自编码器可用于降维。更重要的是,自...
  • 经典GAN网络结构

    千次阅读 2020-08-28 15:23:11
    (N, 256, 64, 64)】 out:(N, 256, 64, 64) 【SepConv 256->256 3x3,1x1 s=1】的详细结构如下 【Conv 256->256 3x3 s=1 groups=256】 【IN】 【Conv 256->256 1x1 s=1】 gan-compression轻量级网络 Encoder部分 (N, ...
  • GAN网络评价指标

    千次阅读 2020-03-01 16:59:21
    GAN(生成对抗网络)中生成器通过目标函数来优化生成的图片骗过判别器的性能,判别器则通过损失函数来增强自己判别生成图片的性能。但是这并不能很好地判别生成图片的质量以及多样性。于是便有用IS(inception ...
  • GAN 的调参技巧总结 生成器的最后一层不使用 sigmoid,使用 tanh 代替 使用噪声作为生成器的输入时,生成噪声的步骤使用 正态分布 的采样来产生,而不使用均匀分布 训练 discriminator 的时候,将 fake img 的...
  • GAN网络理解与实现

    千次阅读 2018-12-29 13:49:59
    一、GAN网络的基本理解 GAN(Generative Adversarial Net)又称之为生成对抗网络,最少是由被称作“GANs 之父”的”Lan GoodFellow在 2014年开创性地提出. 正如诸多介绍中表述的,GAN的思想是一种二人联合博弈的思想...
  • 了解GAN网络

    千次阅读 2018-07-31 17:09:07
    GAN网络,第一次听说它就不明觉厉。其他网络都是对输入图像进行某种处理,得到某种特定的输出。而GAN网络居然可以“无中生有”,无论是去除马赛克,还是换脸,还是对灰度图像上色,都显得不可思议,怎么可能凭空产生...
  • 利用GAN网络生成动漫图像,python语言。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,900
精华内容 12,760
关键字:

gan网络