2d:Work

用DCGAN生成动漫并探索其潜在的特征

GAN主要是关于生成某些东西。本文分享有关生成动画角色面孔的实验。不仅生成面孔,还试验了图像可以通过其潜在变量的线性代数运算来操纵。可以看到生成的面部遵循统计分布。

下图是我们将使用模型形成的图片创建的动画角色面之一。左边的第一张和第二张图片是用GAN生成的。第三个是添加第一个和第二个面。

GAN

深度学习领域的热门话题之一是生成性对抗网络(GAN)。由Ian Goodfellow等人介绍,它可以从头开始生成无人监督的东西。有许多研究人员正在研究和改进它。例如,NVIDIA 使用GAN创建逼真的面部生成器。关于使用GAN的音乐领域也有一些研究。

研究人员开发了许多不同类型的GAN。其中一个最新的是HoloGAN,可以从自然图像生成3D表示。如果你看看它是如何做的,它其实是非常惊人的。实际上,这些先进的GAN遵循GAN如何工作的基本原理。每个GAN都有两个代理作为学习者,判别器和生成器。要了解有关高级GAN技术的更多信息,必须了解基本GAN的工作原理。

本文将重点介绍实施深度卷积GAN,这是A Radford等人提出的GAN变体之一。基本上,它是一个具有许多卷积层的GAN。它是流行的GAN神经网络之一。我们将在他们的论文中构建一个与所提出的架构不同的架构。虽然不同,但仍然会产生一些好的结果。

关于GAN的一个有趣的事情是它将构建其潜在变量,它可以是线性代数运算。在本文例图中第一个面部的矢量被添加到第二个面部的矢量。然后,它产生第三张脸。

它还产生一些有趣的数据分布。分布中的每个点都有不同的面。例如,以-0.7为中心的数据将具有黄色头发的面部。

什么是GAN?

为了简化它,它是用于从头开始生成一些新数据的深度学习技术之一。它以无人监督的方式运行,这意味着它可以在没有人类标记的情况下运行,它将根据其学习的模式生成数据。

GAN有一些特征方面是生成模型,它是:

学习联合概率P(x,y),其中x是输入,y是输出。它将基于P(x | y)进行推理 ,给定输出y,它将推断出x。你可以说y是GAN中的真实数据。当模型给出训练实际数据y时,它将学习实际数据的特征。它将通过识别真实数据潜在特征表示变量来学习。为了使其更简单,它学习了真实数据中图像的基本构造函数特征。例如,模型可以学习由眼睛和头发的颜色构成的面部。这两个将是用于生成面部的基础之一。通过调整其变量,它还可以改变生成的面貌。例如,通过提高眼睛的变量,眼睛会变黑。降低它会产生相反的反面。它可以建立一个概率分布,如正态分布,可用于避免异常值。由于异常值通常在分布中非常罕见,因此生成它也非常罕见。因此,GAN在具有异常值的实际数据上运行良好。那么,它是如何工作的?

GAN组成两个神经网络,判别器和生成器。GAN将使这两个网络在零和游戏框架上互相争斗。这是这些代理之间的游戏。GAN中的对抗名称来自这个概念。

生成器将生成一些伪数据,判别器将识别一些数据,这些数据包含生成器生成的伪数据和从实际数据中采样的数据。生成器的目标主要是生成一些与真实数据类似的虚假数据,并欺骗判别器识别哪些数据是真实的和假的。鉴别器的目标是使识别真假数据变得更加智能。每个代理人将交替移动。通过决定这些代理商,我们希望这些代理商能够变得更强大,尤其是发电机。

你可以说他们是对手。主角是生成器,他们通过从竞争对手的斗争中学习,更好地实现我们的目标。

好的,换句话说,生成器将通过对所学习的分布进行采样并模拟与实际数据相同的分布来模拟真实数据。它将训练其可以生成它的神经网络。然而,鉴别器将在监督技术中训练其神经网络以检测伪造和真实数据。每个网络将交替训练其网络。

以下是GAN如何工作的粗略步骤:

在诸如正态分布的概率分布中生成随机噪声。将其作为我们的生成器神经网络的输入。它将输出生成的假数据 。这些步骤还意味着我们从发生器学到的分布中采样一些数据。我们将噪声z_n和生成的数据标记为G(z_n) 。G(z_n)表示由发电机G处理的噪声的结果。我们将生成的假数据与从数据集中采样的数据相结合。让它们成为我们的鉴别者的输入。我们将其标记为D.判别器将尝试通过预测数据是否是假的来学习。通过前向传递训练神经网络,然后进行反向传播。更新D权重。然后,我们需要训练生成器。我们需要将G(z_n)随机噪声产生的假数据作为D的输入。请注意,此步骤仅将伪数据输入判别器。直传在D.通过使用鉴别神经网络,做直传,预测假数据是假的或者没有。然后进行反向传播,我们只更新G权重。 G(z_n) (D(G(z_n)))重复这些步骤,直到我们看到生成器提供了良好的假数据或已达到最大迭代次数。

通过更新生成器的分布以匹配判别器。

为了让我们的代理学习,请确保使生成器和判别器相互支配。尽可能使它们保持平衡,同时使生成器和判别器。当判别器过于强大(可以区分假冒和真实100%)时,生成器变得无法学习任何东西。

如果在训练过程中我们达到了这一点,那么最好结束它。相反也会产生生成器强于判别器的效果。它导致模式崩溃,我们的模型将始终预测任何随机噪声的相同结果。这是GAN的一个难点和困难的部分之一。

构建执行

那么,生成器和判别器的架构如何?

这取决于我们将要开发的GAN的变体。由于我们将使用DCGAN,我们将使用连续的一对CNN层。

我们用于构建DCGAN的配置如下:

latent_dim = 64 height = 64 width = 64 channels = 3

这意味着我们将有64维潜在变量。我们的图像的高度和宽度是64.每个图像有3个通道(R,G,B)

这是导入的库以及如何准备数据:

生成器

它由卷积层组成,其中一个是卷积转置层。要对图像的大小进行上采样(32 -> 62),我们将在卷积层中使用strides参数。这样做是为了避免GAN的不稳定训练。

判别器

它还包括Convolution Layers,我们使用步幅进行下采样。

为了使发生器能够进行反向传播,我们在Keras中创建了新的网络,它是生成器,然后是判别器。在此网络中,我们冻结所有权重,以使其权重不会发生变化。

这是网络:

训练

训练配置如下:

iterations = 15000 batch_size = 32

配置意味着我们将进行15000次迭代。每次迭代我们处理32批真实数据和假数据(总共64个用于训练鉴别器)。

按照我上面解释的粗略步骤,以下是我们如何逐步训练DCGAN:

迭代直到最大迭代以下步骤for tqdm_notebook中的步骤(范围(迭代)):

在概率分布中生成随机噪声,例如正态分布。random_latent_vectors = np.random.normal(size =(batch_size,latent_dim)) generated_images = generator.predict(random_latent_vectors)

将生成的假数据与从数据集中采样的数据相结合。stop = start + batch_sizereal_images = x_train [start:stop]combined_images = np.concatenate([generated_images,real_images])labels = np.concatenate([np.ones((batch_size,1)),np.zeros((batch_size, 1))])

请注意,我们使用顺序采样器,其中每个数据将按顺序采样,直到数据结束。将采样的数量等于批量大小。

在输入标签上添加噪音tag+ = 0.05 * np.random.random(labels.shape)

这是训练GAN的一个重要技巧。

训练判别器d_loss = discriminator.train_on_batch(combined_images,labels)

训练生成器random_latent_vectors = np.random.normal(size =(batch_size,latent_dim))misleading_targets = np.zeros((batch_size,1))a_loss = gan.train_on_batch(random_latent_vectors,misleading_targets)

请注意,我们创建了一个新的潜在向量。不要忘记我们需要交换标签。请记住,我们希望最大限度地减少鉴别器在未能预测假货时造成的损失。标签应为1 misleading_targets。

更新真实数据集的起始索引if start> len(x_train) - batch_size:start = 0,

结果

充满乐趣的部分来了!我们将开始在不同的平均点上生成可视化生成的图像。这是上述模型的结果,他迭代了20000步。该模型训练约7小时(每小时约4300步)。我会将较少的步骤模型命名为Model-A,将另一个命名为Model-B。

N~(x,y) :通过遵循具有平均值x和标准偏差y的正态分布随机生成的潜在向量

结果对潜矢量N(0,0.4)上型号-A :

不错吧,虽然有一些图像有不对称的脸。

Model-A,N(0,1)潜在向量的结果:

DCGAN还没有掌握如何表示不太接近平均点的数据点。我认为,它需要更多的培训或更强大的架构。

让我们将架构更改为Model-B。

Model-B,N(0,0.4)潜在向量的结果:

没关系,但脸色变暗了。我想知道生成器发生了什么事。

Model-B,N(0,1)潜在向量的结果:

他们中的大多数仍然包含着不好的面孔。他们中的一些人制作了好脸色。质量仍然与Model-A几乎相同。好的..对于下一批图像,让我们将标准差改变为接近平均值。0.4将是最好的。

让我们检查我们的潜在向量是否使用相同的标准偏差生成中心均值为-0.3和0.3。

Model-A,N(0.3,0.4)潜在向量的结果:

Model-A,N(-0.3,0.4)潜在向量的结果:

Model-B,N(-0.3,0.4)潜在向量的结果:

Model-B,N(0.3,0.4)潜在向量的结果:

差异

是的,看看他们的头发。在平均0.3时,头发大部分是黑色的。相反,在平均值-0.3时,毛发大部分是黄色的。是的,我们的模型可以将面部放在相应的点上。此外,Model-B生成比A更暗的面。

根据我们上面所做的,我们可以直观了解模型的数据分布。

让我们绘制它:

从上面显示的结果来看,我认为潜在的矢量意味着越少,它会使脸部有更亮的头发,潜在的矢量越多,脸部就会有紫色的头发。

为了确保,让我们看看每个平均点的面部平均值:

我们绘制这些潜在的向量,其平均值为:

[-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8]

第一行是MODEL-A,第二行是MODEL-B。通过操纵潜在向量的平均值,我们可以看到它在该点生成的面。我们可以看到:

矢量点越低,头发越黄。它的中间颜色较深。这意味着数据集中的平均面具有这些样式。矢量点的正值是,头发更蓝。积极的潜在载体在微笑时也有更多的张开嘴。基本线性代数运算

我们可以对潜在向量进行线性代数运算。也可以生成等式的结果并且具有有趣的结果。在介绍部分之前从我们的第一张面孔中获取结果:

G + D.

GAN面是G加D的结果。你可以看到头发变得有点棕色。头发按照右边的D样式和左边的G.

以下是其他操作的结果:

G - D

Component-Wise乘以(G,D)

操纵潜在向量

如果我们操纵潜在向量中的维度,我们将看到生成的图像是如何生成的。正如我之前所说,该模型将学习潜在的特征表示。因此,潜在向量中的每个元素都有生成图像的目的。

要进行可视化,我们将冻结向量中的所有元素并更改要检查的所选维度。

例如,我们想要检查潜在向量中的第一个元素,我们更改该维度并保持其他维度相同。

我们将生成一些在这些点上具有均值的面:

[-0.6,-0.3,0.1,0.3,0.6]

对于每个平均点,我们将生成面,其潜在向量中的维度迭代地使用这些值更改:

[-1.08031934,-0.69714143,-0.39691713,-0.12927146,0.12927146,0.39691713,0.697014143,1.08031934]

让我们对所选维度进行可视化:(此部分仅使用MODEL-A)

第28维:

第28个潜在变量的目的是什么?

我认为,它会使头发变得更亮,改变左眼的形状,也会改变右眼的微小变化。由于它将特征压缩为64个长度的潜在向量,因此一个维度可以有多个目的。

让我们看看另一个!

第5维度

这个潜在的变量目的是什么?

我认为它与左眼有关,即使对于每个平均点左眼的处理方式也不同。它也会使头发变得更暗。你怎么看?

第11维

我认为,这个维度关心的是嘴巴和右眼。

通过仅调整潜在变量从平均点生成的面上的另一个示例:

我们可以绘制潜在向量中的任何维度,看看它的用途是什么。虽然有时候很难看出什么是潜在变量的目的。

与真实数据比较

让我们从数据集中抽取8个真实面孔:

N ~ (0,1)模型A和B的生成8个

那么,如果我们充当判别者,我们能否区分真假面孔?

毫无疑问,我们仍然可以区分假面具和真假面。该模型需要更多的训练或强大的架构才能实现。即便如此,我们的模型仍然可以生成动漫风格的脸形,这很棒。

总结

训练GAN很难。如果没有看到经验丰富的提示和技巧,那么制作一个稳定的架构很难。特别是在平衡生成器和判别器功率上。使GAN不会崩溃也是一个挑战。实际上,这些模型仍然不擅长生成假图像。尽管如此,它可以建立一些好的面孔,虽然不如真正的面孔。我们仍然可以区分假图像和真实图像。这是因为该模型尚未掌握实际数据的数据分布。该模型使其质量降低约26000步。在我的实验中,生成器变弱了。这是GAN的不稳定性。我需要搜索更好的架构才能做到这一点。我们可以看到模型B上的结果变得更暗。因此,我开发了另一种具有批量标准化甚至是Dropout Layer的架构。调整架构有两个结果。模型崩溃和判别主导。我想开发GAN架构并不容易。然而,有很多关于开发我尚未实现的优秀GAN的提示和技巧。可能通过遵循这些提示可以减少模型的不稳定性。有许多更稳定的GAN变体,例如WGAN-DC和DRAGAN,以及SAGAN。我需要使用可能比DCGAN做得更好的不同架构。本文告诉我们GAN正在做什么,并逐步告诉我们如何做到这一点。之后,它告诉我们潜在向量的一个有趣特征,它显示了生成器学习的数据分布。它告诉我们它可以形成数据分布。

潜在向量可以是线性代数操作。它可以向我们展示一些有趣的东西,例如添加两个潜在的向量将组合这些面的每个特征。还可以操纵它以基于潜在向量中的改变的元素来改变面部。

即便如此,我们的模型仍然不能让我们想到哪张脸是否是假的,但它仍然可以形成动漫风格的面孔。

Letters only
eMail only
closeclear comment
Nothing here~
arrow_back Prev Article Rand Article Next Article arrow_forward 五部关于吸血鬼的动漫,最后一部很少人看过