深度学习_GAN_DCGAN论文详解

原始GAN的思想非常伟大,但是我们在实际运用中很少会直接使用最基础的版本,比如在视觉问题中,如果使用原始的基于DNN的GAN,则会出现许多问题。

如果输入GAN的随机噪声为100维的随机噪声,输出图像为256 * 256大小的话,也就是说,要将100维的信息映射为65536维。如果单纯用DNN来实现,那么整个模型参数会非常巨大,而且学习难度很大(低维度映射到高维度需要添加许多信息)。

因此,原始GAN的一个扩展网络:深度卷积生成对抗网络(DCGAN,Deep Convolutional Generative Adversarial Networks)就登上了舞台。DCGAN也是在生成对抗网络基础上建立的第一个被广泛使用的图像生成网络。

DCGAN在训练过程中状态比较稳定,并可以有效实现高质量的图片生成及相关的生成模型应用。由于其具有非常强的实用性,在它之后的大量GAN模型都是基于DCGAN进行的改良版本。

DCGAN网络结构

DCGAN的网络结构图如下图所示:

生成器

在这里插入图片描述

判别器

在这里插入图片描述

设计规则

结合上图的模型结构,我们可以知道DCGAN将传统的GAN的生成器和判别器均采用CNN实现。并且为了更好地适应于卷积神经网络架构,使用了以下的架构设计规则(tricks):

  1. 将pooling层用convolutions替代,其中,在Discriminator上用带步长的卷积替代,在Generator上用转置卷积替代。
  2. 在Generator和Discriminator上都使用批归一化(batch normalization)。
  3. 移除全连接层,使网络成为全卷积网络。
  4. 在Generator上除了输出层外的所有层使用TeLU激活函数,输出层采用tanh激活函数。
  5. 在Discriminator的所有层上使用LeakyReLU激活函数。

下面我们详细说明这几点:

第一点:
下面两幅图分别是是第一个设计规则的带步长的卷积和转置卷积:
在这里插入图片描述

上面的图表示了卷积层如何在判别器中进行空间下采样(spatial downsampling),输入数据为5 * 5的矩阵,使用了3 * 3的过滤器,步长为2 * 2,最终输出矩阵为3 * 3。

在这里插入图片描述

上图表示的是卷积层在生成器中进行上采样(spatial upsampling),输入为3 * 3矩阵,同样使用了3 * 3过滤器,反向步长为2 * 2,故在每个输入矩阵的点之间填充一个0,最终输出为5 * 5的矩阵。

使用上述两种卷积层替代池化层的目的是为了能够让网络自身去学习空间上采样与下采样,使得判别器和生成器都能够有效具备相应的能力。

第二点:

由于深度学习的神经网络层数很多,每一层都会使得输出数据的分布发生变化,随着层数的增加网络的整体偏差会越来越大。批归一化的目标则是为了解决这一问题,通过对每一层的输入进行归一化处理,能够有效使得数据服从某个固定的数据分布。

第三点:

目前的研究趋势中我们会发现非常多的研究都是试图去除全连接层,常规的卷积神经网络往往会在卷积层后添加全连接层用以输出最终向量,但我们知道全连接层的缺点是参数过多,当神经网络层数深了以后运算速度会变得非常慢,此外全连接层也会使得网络容易过度拟合。有研究使用了全局平均池化(global average pooling)来替代全连接层,可以使得模型更稳定,但也影响了收敛速度。论文中说的一种折中方案是将生成器的随机输入直接与卷积层特征输入进行连接,同样地对于判别器的输出层也是与卷积层的输出特征连接。

第四、五点:

激活函数的作用是为了在神经网络中进行非线性变换。

(1)首先,我们从最常用的Sigmoid函数说起。Sigmoid函数的公式为 f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+ex1 。如下图所示,该函数的取值范围在1到1之间,当x大于零时输出结果会趋近于1,而当x小于零时,输出结果趋向于0,由于函数的特性,经常被用作二分类的输出端。

但是Sigmoid函数有两个比较大的缺陷:

  1. 当输入数据很大或者很小时,函数的梯度几乎接近于0,这对神经网络在反向传播中的学习非常不利。
  2. Sigmoid函数的均值不是0,这使得神经网络的训练过程中只会产生全正或全负的反馈。

在这里插入图片描述

(2)Tanh函数那数据压缩到-1到1的范围,解决了Sigmoid函数均值不为0的问题,所以在实践中通常Tanh函数都优于Sigmoid函数。在数学形式上其实Tanh只是对Sigmoid的一个缩放形式,公式为tanh(x) = 2f(2x) -1,下图为Tanh函数的图示:

在这里插入图片描述

(3)ReLU(Rectified Linear Unit)函数是最近几年非常流行的激活函数,它的计算公式非常简单f(x) = max(0,x)。
它有几个明显的优点:

  1. 计算公式非常简单,不像上面介绍的两个激活函数那样计算复杂。
  2. 它被发现在随机梯度下降中比Sigmoid和Tanh更加容易使得网络收敛。

在这里插入图片描述

但ReLU也存在问题,那就是在训练中可能会导致出现某些神经元永远无法更新的情况。

其中一种对ReLU函数的改进方式是LeakyReLU,该方法与ReLU不同的是在x小于0的时候取f(x) = ax,其中a是一个非常小的斜率(比如0.01)。这样的改进可以使得当x小于0的时候也不会导致反向传播时的梯度消失现象。

生成器中使用ReLU函数,但对于输出层使用了Tanh激活函数,因为研究者们在实验中观察到使用有边界的激活函数可以让模型更快地进行学习,并能快速覆盖色彩空间。而在判别器中对所有层均使用LeakyReLU,在实际使用中尤其适用于高分辨率的图像判别模型。

用28 * 28的数据集进行训练的网络结构细节

生成器结构细节

在这里插入图片描述

判别器结构细节

在这里插入图片描述

其他数据集进行测试

DCGAN的作者也使用饿了三种数据集对网络进行测试,分别为LSUN室内数据集,人脸数据集,Imagenet-1K数据集。下面的图展示了实验的结果:

LSUN室内数据集

在这里插入图片描述

在这里插入图片描述

开拓性实验

论文作者除了对DCGAN做了基础的模型评估分析,还做了很多有意思的实验。

生成图像的变换

(1)研究者们发现的图像的隐含空间(latent space) ,随着输入Z的不断变化,输出的图像会平滑地转变成为另一幅图像。如下图所示:

在这里插入图片描述
(2)研究者对DCGAN网络内部层进行了可视化。我们知道传统的有监督的CNN网络通常在中间层能够学习到某些事物的特征,而对于无监督的DCGAN在基于大量图片数据的训练后同样能够学习到很多有趣的特征。如下图所示,GAN中判别器在训练后卷积层学习到的特征的可视化,已经可以隐约看到卧室中床和窗户的样子。

在这里插入图片描述

(3)为了研究这些特征在生成器中的作用,研究者们故意把生成器中对应“窗户”的filter去掉,得到的结果非常有意思,在原本应该生成窗户的地方,最终生成的图像中都使用了其他物品进行了替换。如下图所示,第一行是未经修改生成的图片,第二行是移除了“窗户”filter层生成的图片。

在这里插入图片描述
更多的实验表明,如果我们移除其他特征的filter,同样可以达到对应的效果。

生成图像的算术运算

我们发现在GAN的生成器中其实已经有了输入向量和输出向量的对应关系,我们可以把这个向量作为图像的向量表示进行图像的算术运算,如下图所示:

在这里插入图片描述

在这里插入图片描述

我们还可以用上面的方法进行图像演变的制作,当我们把某个图像的向量线性转换成另一个图像的向量的时候,对应的图像也会逐渐转移。如下图所示:

在这里插入图片描述

图像补全

在这里插入图片描述

如上图所示,每行包含五张图片,第一列是数据库原始图片;第二列是随机去除80%像素点的图片;第三列是使用补全方法对第二列修复的结果;第四列是原始数据中被扣掉一大块的图片;第五列是使用补全方法对第四列修复的结果。

在这里插入图片描述

要使用生成对抗网络补全图像需要满足两个条件:第一个条件是使用DCGAN在大量头像数据训练后能够生成“骗过”判别器的照片;第二个条件是生成图像与原图像未丢失部分的差值要尽量最小。

这里提出了两个损失函数:

第一个损失函数是与丢失信息图片相关的上下文损失(contextual loss),它的定义是生成图片与原始图片在未丢失区域的差距大小。

式子中M相当于一个遮罩,也就是说在这个函数中我们只考虑未丢失图片的区域。

L c o n t e x t u a l ( z ) = ∣ ∣ M ⊙ G ( z ) − M ⊙ Y ∣ ∣ L_{contextual}(z) = ||M\odot G(z) - M\odot Y || Lcontextual(z)=MG(z)MY

第二个损失函数是DCGAN本身的感知损失(Perceptual loss),这个是对于DCGAN本身在大量人脸数据集上训练的损失函数,与之前GAN中生成器的损失函数一致。

L p e r c e p t u a l ( z ) = log ⁡ ( 1 − D ( G ( z ) ) L_{perceptual}(z) = \log (1 - D(G(z)) Lperceptual(z)=log(1D(G(z))

最终完整的损失函数与计算结果如下所示:

L ( z ) = L c o n t e x t u a l ( z ) + L p e r c e p t u a l ( z ) L(z) = L_{contextual}(z) + L_{perceptual}(z) L(z)=Lcontextual(z)+Lperceptual(z)
z ^ = arg ⁡ min ⁡ λ L ( z ) \hat{z} = \mathop{\arg\min}\limits_{\lambda} L(z) z^=λargminL(z)

其中 λ \lambda λ是超参数,用来调节两个损失函数的重要程度, z ^ \hat{z} z^是我们要求的生成器输入,图片补全公式如下:

x r e c o n s t r u c t e d = M ⊙ Y + ( 1 − M ) ⊙ G ( z ^ ) x_{reconstructed} = M\odot Y + (1 - M) \odot G(\hat{z}) xreconstructed=MY+(1M)G(z^)

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
前 言 visual basic继承了basic语言易学易用的特点,特别适合于初学者学习windows系统编程。随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。于是我们小组着手设计开始一个这样的游戏软件。通过这学期来Visual Basic的学习,我初步掌握了Visual Basic语言的最基本的知识,于是在化希耀张兵等老师的指导下动手用Visual Basic编写俄罗斯方块游戏。 无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。它是永恒的娱乐经典,但它实际上又和那些传统的经典娱乐方式不同,因为它的本质是电子化的,所以它的确属于现代产物。《俄罗斯方块》举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观。某些与坠落的玩具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似《俄罗斯方块》触动了我们某些内在的感官,使得哪怕是我们当中最杂乱无章的人也要把事情整理妥当。 在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。某些批评家也许会声称,《俄罗斯方块》要比过去二十年间出现的任何东西都要浪费人们的时间。至于我们,则要欣然提名它为GameSpot评选出的历史上最伟大游戏之一。 为了怀念经典,也为了能够给大多的计算机用户在工作之余找到一个休闲、娱乐的一个方式,我们小组开始着手用VB语言开发一个经典的俄罗斯方块游戏。 工程概况 1.1 项目名称 俄罗斯方块游戏 1.2 设计平台 VB 全称Visual Basic,它是以Basic语言作为其基本语言的一种可视化编程工具。 Vb是microsoft公司于1991年退出的windows应用程序开发工具visual意思是“可视化的”。在它刚推出来时,自身还存在一些缺陷,功能也相对少一些。但是经过多年的开发研究。最近microsoft公司又推出了VB6.0版本 VB6.0运行环境:硬件,要求486以上的处理器、16MB以上内存,50MB 以上的硬盘,cd-rom驱动器,鼠标。软件:要求windows 95以上版本。 1.3程序设计思想 游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我们在游戏中添加了漂亮的场景和动听的音乐,设置了过关升级的功能,激发大家的娱乐激情。 从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我们总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个预览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。 俄罗斯方块游戏设计的主要步骤为以下10个方面: (1)游戏界面的设计。 (2)俄罗斯方块的造型。 (3)俄罗斯方块的旋转。 (4)俄罗斯方块的运动情况(包括向左,向右和向下)。 (5)俄罗斯方块的自动消行功能。 (6)游戏级别的自由选择。 (7)游戏速度的自由选择。 (8)游戏得分的计算。 (9)游戏菜单选项的设计及功能实现。 (10)游戏的背景音乐。 1.4运用的控件和主要对象 我们在设计过程中主要用到的控件有:command控件,image控件,picture控件,label控件,timer控件,text控件,windows media player控件等等。 1.5主要实现的功能 我们开发的俄罗斯方块游戏,主要实现了以下几种功能: 1.可以灵活控制方块在图形框中运动。 2.游戏过程中方块可以自由旋转。 3.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。 4.游戏前可以选择游戏的速度和游戏的等级,游戏速度既为方块下落速度,游戏等级为初始游戏时在基层随机生成一定行数的无规律方块,生成的行数由你来选择,每行至少产生5个以上的无规律方块,这样增加了游戏难度,对于游戏高手来说,无疑不是一个新的挑战。 5.游戏的得分支持积分,并且按照公式: 得分 = 原来分数+ 100 * (2 ^ 同时消除的行数-1) 这样,你同一时间消除

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocky Ding*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值