天天看点

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

创建一个GAN可能听起来很困难,但,在本教程中,我们将使用TensorFlow来构建一个简单的能够生成人脸图像的GAN。

<b>1.</b><b>深度卷积对抗生成网络(</b><b>DCGAN</b><b>)的架构</b>

在本教程中,我们不是试图模仿简单的数字数据,而是我们试图模仿一个图像,甚至它可以去欺骗一个人。生成器将随机生成的噪声向量作为输入数据,然后使用称为反卷积的技术将数据转换为图像。

鉴别器是经典的卷积神经网络,其分类真实和假图像。

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

<b>2.</b><b>创建</b>

<b>3.CelebA</b><b>数据集</b>

CelebFaces数据集包含超过20万个名人图像,每个图像具有40个属性注释。由于我们只是想生成随机面的图像,所以我们将忽略注释。而且数据集包括超过10,000个不同的身份,这对我们的需要来说是最佳的。

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

不过,尽管如此我们也要定义一个批量生成的函数。这个函数将加载我们的图像,并根据我们稍后将要设置的批量大小给我们一个图像阵列。为了获得更好的效果,我们将裁剪图像,以便只显示脸部。我们还将图像归一化,使得它们的像素值在-0.5到+0.5的范围内。最后,我们打算将图像缩小到28x28。这困难会使我们失去了一些图像质量,但它大大减少了训练时间。

<b>4.</b><b>定义网络输入</b>

在我们开始定义我们的两个网络之前,我们首先要定义我们的输入。我们这样做是为了不让杂乱的训练过程变得比现在更加混乱。在这里,我们只是简单地定义TensorFlow占位符,用于我们真实和虚假的图像输入以及为了保存我们的学习率的值。

TensorFlow分配变量占位符特别容易。在完成这些之后,我们可以通过稍后指定一个Feed字典来使用我们网络中的占位符。

<b>5.</b><b>创建鉴别器网络(</b><b>The discriminator network</b><b>)</b>

接着,我们来创建我们最重要的网络。鉴别器是“艺术评论家”,试图区分真实和虚假的图像。简单地说,这是一个用于图像分类的卷积神经网络。如果你已经有了一些深度学习的经验,那么你有可能已经建立了一个非常类似于这个网络的网络。

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

定义这个网络时,我们要使用一个TensorFlow变量作用域。这有助于我们稍后的训练过程,所以我们可以重复使用我们鉴别器和发生器的变量名。

<b>6.</b><b>发生器网络(</b><b>The generator network</b><b>)</b>

发生器是以另一种方式存在于GAN中:试图欺骗鉴别器的是“艺术家”。发生器利用去卷积层(deconvolutional),它们与卷积图层完全相反:除了将图像转换为简单的数值数据(如分类)之外,我们还将执行反卷积以将数字数据转换为图像,而不是执行卷积。正如我们在设置鉴别器网络中所做的那样,我们也将其设置在一个可变范围内。

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

首先,我们接受我们的输入,称为Z,并将其输入到我们的第一个解卷积层。每个解卷积层执行解卷积,然后执行批量归一化和 Leaky ReLu。然后,我们返回tanh激活函数。

<b>注意:先训练!</b>

在我们真正开始训练过程之前,我们需要做一些其他的事情。首先,我们需要定义所有帮助我们计算损失的变量。其次,我们需要定义我们的优化功能。最后,我们将建立一个小函数来输出生成的图像,然后训练网络。

<b>7.</b><b>损失函数</b>

我们需要定义三个损失函数,而不是仅具有单个损失函数:发生器的损失函数,使用真实图像时鉴别器的损失函数,以及使用假图像时鉴别器的损失函数。假图像和真实图像损失的总和理应是整体鉴别器损失。

首先,我们先定义我们对真实图像的损失。为此,我们在处理真实图像时要传递鉴别器的输出,并将其与标签全部进行比较。我们在这里使用一种称为标签平滑的技术,通过将0.9乘以1来帮助我们的网络更加准确。

然后,我们为我们的假图像定义损失。这次我们在处理伪造的图像时将鉴别器的输出传递给我们的标签,如果这些标签都是0,这意味着它们是假的。

最后,对于发生器定义损失器。

<b>8.</b><b>优化和可视化</b>

在优化的步骤中,我们正在寻找所有可以通过使用tf.trainable_variables函数进行训练的变量。既然我们之前使用了变量作用域,我们可以非常舒适地检索这些变量。然后我们使用Adam优化器来帮助我们减少损失。

在我们准备的最后一步中,我们将编写一个小段程序,使用matplotlib库在笔记本上显示生成的图像。

<b>9.</b><b>训练</b>

我们正在进行我们的最后一步!现在,我们只获取我们之前定义的输入,损失和优化器,调用一个TensorFlow会话并运行批处理。每400一个批次,我们通过显示生成的图像和生成器以及鉴别器的损失来输出当前的进度。现在向后看,看到脸部缓缓而稳定地出现。根据你的设置,此进度可能需要一个小时或更长时间。

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

<b>10.</b><b>结论</b>

恭喜你!你现在知道GAN做什么,甚至知道如何使用它们生成人脸图像。这只是GAN的冰山一角,GAN还有很多其他的应用。

例如:密歇根大学和德国马克斯普朗克研究所的研究人员使用GAN从文本中生成图像。根据论文描述,他们能够产生非常真实的花鸟。这可以扩展到一些其他领域,比如警察素描或者平面设计。伯克利的研究人员也设法创建了一个GAN,增强了模糊的图像,甚至重建了损坏的图像数据。

总之,GAN是非常强大的。

Dominic Monn目前是瑞士苏黎世NVIDIA公司的深度实习生

文章原标题《Deep convolutional

generative adversarial networks with TensorFlow》,作者:Dominic Monn,译者:虎说八道,审阅:

继续阅读