生成对抗网络简介,深度卷积生成对抗网络(DCGAN)简介

本博客是个人学习的笔记,讲述的是生成对抗网络(generate adversarial network ) 的一种架构:深度生成对抗网络 的简单介绍,下一节将使用 tensorflow 搭建 DCGAN网络实现 手写数字的生成任务。

GAN 产生背景

生成对抗网络是在15-16年提出来的一种新的深度学习的算法,在此之前,图像的分类问题使用卷积神经网络得到了很好的解决,准确率甚至已经超过了人类,神经网络之所以有如此强大的能力,一个重要的因素是有足够多的训练数据,这些良好的训练数据,使得数据驱动的神经网络分类算法得到很好的发展,但也引发了一个问题:如果没有足够的数据如何?最先想到的办法是使用图像变换来扩充数据集,这不失为一个好办法,经过旋转,平移,仿射变换的图像加盟的数据集,可以使神经网络学习到平移不变性,旋转不变性等,但是依旧是隔靴搔痒,无法解决数据缺乏的问题,模型的泛化能力比较差。这就需要一种可以生成图像的神经网络来生成对应的图像来扩充数据集,生成对抗网络因此诞生。

对抗生成网络的应用十分广泛,包括但不局限于:图像超清化,换脸,图像修复,图像转换为漫画,漫画上色等有趣的应用。对于解决图像生成,数据生成问题具有十分重要的作用。

对抗生成网络原理

常见的深度学习任务,比如分类,物体检测等,本质上都是判别问题,可以使用 Dropout,Batch Normalization 等手段达到很好的训练效果。而生成模型则是一种无中生有的模型,无法直接使用判别模型的诸多技术。对抗生成网络就是借鉴判别模型的优势,在解决生成模型问题上的一种新的方法。

  • 对抗哲学

    猫捉老鼠的例子:猫要不断的提升自己的敏捷度,奔跑速度,侦查等能力,这样才可以捉住老鼠。老鼠要提升自己的躲闪,逃跑,警戒,隐蔽能力来躲避猫的攻击,猫和老鼠互相提升,各自的能力越来越强。

    注意点: 1)力量要均衡,如果猫太强大,把老鼠都捉光了,则猫就无法继续提高自己的能力了。如果老鼠太强大,猫一个都捉不到,灭绝了,没有了猫,老鼠的能力也不能继续提高了。2) 生成和对抗过程要交替进行,防止一方过度强大。

对抗生成网络结构

结构包括生成器和判别器,在训练的时候交替进行。
生成器的目标是生成仿真的数据,判别器的目标是判断样本的真实性。
对抗生成网络的目标是训练出一个强大的生成器,可以生成逼真的数据 (判别器也很强大,和生成器相互促进,共同进步)

深度卷积生成对抗网络(DCGAN)

缩写即英文第一个首字母组合,输入为一个随机向量作为变量,生成一个仿真的图像。

定义一个GAN网络主要包含以下几个方面:

  • 定义GAN网络的目标

  • 定义生成器的输入和输出

  • 定义判别器的输入和输出

  • 定义生成器和判别器的网络架构

  • 定义目标:

    我们希望输入一个随机向量作为自变量,输出一张仿真的图像作为结果。

    • 损失函数:
      l o s s = m i n G m a x D V ( D , G ) = E x p d a t a ( x ) [ log D ( x ) ] + E z p z ( z ) [ log ( 1 D ( G ( Z ) ) ) ] loss= min_G max_D V(D,G) = E_{x \sim p_{data(x)}}[\log D(x) ]+ E_{z \sim p_{z(z)}}[\log(1-D(G(Z)))]
      其中 D(x) 表示 x 是真是图像的概率, D ( x ) [ 0 , 1 ] D(x) \in [0,1] x p d a t a ( x ) x \sim p_{data(x)} 表示x 是真实的数据。 z p z ( x ) z \sim p_{z(x)} 表示z 是随机向量。G(z) 表示将随即向量输入生成器后生成的仿真图像。
    • 分析训练的过程:
      对于判别器来说: 目标是使得损失函数增大,训练判别器的时候生成器的参数不变。观察第一项: E x p d a t a ( x ) [ log D ( x ) ] E_{x \sim p_{data(x)}}[\log D(x)] ,要想使这一项最大,则要使 log D(X) 变大,由于log 是递增函数,则只要使 D(X) 变大即可,即让 D(X) 为1 ,字面上的意思当数据是真是图像的时候,判别器要尽量判别它为真,也就是 100% 为真,D(x) 输出的值为1。观察第二项: E z p z ( z ) [ log ( 1 D ( G ( Z ) ) ) ] E_{z \sim p_{z(z)}}[\log(1-D(G(Z)))] ,易得当 D(G(Z)) =0 的时候可以使第二项最大,字面上的意思是,当图像为一个随机向量 z 经过生成器 G产生的生成图像 G(z) 的时候,判别器 D 要能够认定其为假图像。
      对于生成器来说: 目标是使得损失函数减小,训练生成器的时候判别器的参数不变化,第一项不包含生成器,所以不变化,观察第二项: E z p z ( z ) [ log ( 1 D ( G ( z ) ) ) ] E_{z \sim p_{z(z)}}[ \log (1-D(G(z)))] 要想使得这一项达到最小,则需要使得 D(G(z)) =1 即可,由于D不会变化,所以,只能使得 随机向量经过生成网络G生成的图像 G(z) 越来越像真实的图像,使得当前判别器认为它就是一个真实的图像。

    最终的效果就是判别器和生成器相互提升,判别器认证真假的能力和生成器生成图片的真实性都越来越高,得到一个可以生成高质量仿真图像的生成器。

  • 定义生成器的输入输出

    生成器的输入为一个随机变量,输出为生成的图片。每当随机变量变化的时候,生成的图像就会变化。(实际山就是建立了随机向量和图片的一个映射)

  • 定义判别器的输入和输出

    判别器的作用是判断一个输入的图像是真实的图像还是假的图像,输入为真实的图像和假的图像,输出为输出的图像是真是图像的概率。

  • 定义生成器和判别器的网络架构

    在这里插入图片描述
    生成器的网络结构如图所示,从左到右分别是输入和输出。输入为一个随机向量z ,输出为生成的图像。

    随机向量z 首先进行全连接映射到一个比较长的向量,然后进行 reshape 操作生成大小为 4 × 4 通道数木为1024的三维矩阵,此时这个矩阵就可以当做某个卷积层的输出。之后对这个矩阵进行反卷积操作,逐渐倍增矩阵的长和宽,同时通道数目逐渐减少,到最后只有3个通道,代表图像 RGB 三个通道。

    • 模型结构:

      • 1) pooling 层使用convolutional 层替代
        判别器上使用 stride convolution
        生成器上使用 fractional-stride convolutional (反卷积)
      • 2) 生成器和判别器都使用 batch-normalization
        帮助解决初始化差的问题。
        可以使梯度传播到每一层
        (BN 不应用于 输入和输出层)
      • 3) 移除全连接层,使用 global-pooling
      • 4) 生成器上除了输出层使用 tanh 之外,其余均使用 Relu
      • 5) 判别器上使用 LeakyRelu

    扩展知识: 反卷积

    对于一般的卷积操作,假设输入图像为 4 × 4 大小,卷积核大小为 3 × 3 ,在不加padding 的情况下,根据卷积的定义,易得最终的结果是 2 × 2 的一个 feature map。
    假设输入图片为:

    A00 A01 A02 A03
    A10 A11 A12 A13
    A20 A21 A22 A23
    A30 A31 A32 A33

    卷积核为:

    W00 W01 W02
    W10 W11 W12
    W20 W21 W22

    卷积的结果为:

    B00 B01
    B10 B11

    则有如下对应关系:
    B00= A00 × W00 + A01 ×W01 + A02 × W02+ A10 × W10 + A11 × W11 +A12 × W12 + A20 ×W20 + A21×W21 +A22×W22。 根据卷积的定义,B01,B10,B11 也可以很轻易的写出表达式。
    我们将输入的图像(4 ×4 )展开为 一个一维列向量 X(16× 1) ,将卷积核表示为下面的矩阵 W(4 × 16):
    [ W 00 W 01 W 02 0 W 10 W 11 W 12 0 W 20 W 21 W 22 0 0 0 0 0 0 W 00 W 01 W 02 0 W 10 W 11 W 12 0 W 20 W 21 W 22 0 0 0 0 0 0 0 0 W 00 W 01 W 02 0 W 10 W 11 W 12 0 W 20 W 21 W 22 0 0 0 0 0 0 W 00 W 01 W 02 0 W 10 W 11 W 12 0 W 20 W 21 W 22 ] \begin{bmatrix} W00&W01&W02&0&W10&W11&W12&0&W20&W21&W22&0&0&0&0&0\\ 0&W00 &W01&W02&0&W10&W11&W12&0&W20&W21&W22&0&0&0&0\\ 0&0&0&0&W00 &W01&W02&0&W10&W11&W12&0&W20&W21&W22&0\\ 0&0&0&0&0&W00 &W01&W02&0&W10&W11&W12&0&W20&W21&W22\\ \end{bmatrix}

    可以验证一下, W × X T W × X^T 就是 [B00,B01,B10,B11]
    上面的步骤将一个卷积操作转换为了两个矩阵的乘法,实际上反卷积的计算也可以表示为矩阵,所不同的是对于同一个卷积核,反卷积的矩阵的 卷积操作的转置,读者可自行验证,实际上,卷积层的梯度传播也是使用的反卷积,卷积的反向传播其实就是反卷积的正向传播。

以上是生成对抗网络和 深度卷积生成对抗网络的简介,下面的博客介绍一个简单的生成例子:使用深度卷积生成对抗网路生成手写数字。

发布了45 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_38863413/article/details/103578063