乔•Hicklin MathWorks
了解一下生成式对抗网络并通过如何使用MATLAB设计和训练一个®.
gan由两个深度神经网络组成,一个生成器和一个鉴别器,它们是彼此的对手(因此术语“对抗性的”)。生成器创建新的数据实例,而识别器评估它们的真实性(即,它决定它审查的每个数据实例是否属于实际的训练数据集)。
该视频概述了该过程,并逐步展示了如何使用MATLAB来训练GANs网络。
大家好,我是乔·希克林。我是MathWorks的高级开发人员。我将向你们展示什么是生成式对抗网络。我将向你展示它们是如何工作的,以及如何使用MathWorks深度学习工具制作一个。
gan具有生成性,因为它们产生了一些东西。在本例中,我们将生成图像。它们被称为对抗性,因为我们使用两个独立的网络相互对抗。每个国家都在进行军备竞赛,而另一个国家也在进步。这一改进将允许我们训练生成器来生成我们想要的图像。
训练GAN非常有趣。我们将使用这样的设置。我们从两个网络开始——这是我们的生成器,这是我们的鉴别器。我们先把随机噪声输入发生器。这个发生器还没有经过训练,所以他会产生图像,但他的图像只是随机数据。他会产生一大堆图像。
我们将这些图像——我们将这些称为假数据——然后我们将它们发送给鉴别器。他应该说出它们是真的还是假的。但他也没有受过训练,所以他的产出是垃圾。他会给真货和假货打电话,对吧?接下来,我们会取一些真实的数据,并将其提供给鉴别器。但是,鉴别者仍然没有受过训练,所以他的输出是垃圾。这是第一步。
但现在我们已经准备好训练他们了。我们要训练生成器来骗过鉴别器。所以这里,每次鉴别器把输入叫做实数时,生成器就成功了,而每次鉴别器把输入叫做假数时,生成器就失败了。这就给了我们一个错误信号我们可以反馈给生成器并更新它的参数来做得更好。
同时,我们希望鉴别器将所有的假数据标记为假,将所有的真实数据标记为真。所以当鉴别器称假数据为真时,那就是错误。每次它说假数据是假的,就得到了正确的答案。与之相反的是真实数据——无论哪里它称之为真实,那就是正确的答案,而哪里它称之为虚假,那就是错误的答案。这就给了我们错误信号我们可以反馈给鉴别器来更新它。好吧。
所以我们回去,更新每个网络,重复这个过程。一开始,网络做得很差。但慢慢地,他们改善了。每次我们绕着回路,传递数据,进行训练,网络就会变得越来越好。经过很多次循环,我们最终得到了一个生成器,它能很好地生成我们的人工图像,还有一个鉴别器,它能很好地区分它们。
通常我们做完之后会把鉴别器扔掉。我只是用生成器来生成图像。
现在我们已经看到了gan的工作原理,让我们在MATLAB中创建一个。我要创造并训练一种能生成人工向日葵图像的氮化镓。这个过程有五个步骤。我们要组织我们的数据,创建我们的两个网络,生成一个梯度函数,写一个训练脚本,最后训练两个网络。
梯度函数是这个程序中特定于gan的部分,我将从它开始。训练神经网络是一个优化问题。我们试图最小化神经网络输出的误差。这通常是通过梯度下降来完成的。如果我们能找到误差相对于可学习参数的变化率,我们就能在梯度的方向上稍微改变参数希望能有所改善。我们重复很多次,希望能得到一个好的解决方案。
这个的核心是求梯度。我们需要写一个函数来计算梯度我们需要训练这些东西。我们需要写出这个函数,它已经写在这里了。
梯度函数将包含生成器网络、鉴别器网络、真实图像和噪声向量。它会返回生成器的梯度以及我们稍后在训练循环中会用到的鉴别器的梯度。
现在,这个函数将像我前面描述的GANs网络一样工作。我们要做的第一件事是将噪声传递到生成器中,并从中得到一些假图像。我们将这些假图像传递给鉴别器,得到鉴别器对假图像的预测。我们将在鉴别器中传递真实的图像并得到对真实数据的预测。
一旦我们得到了这个,我们就可以计算误差了。生成器中的错误就是他在预测假图像时的错误。鉴别器上的误差有两部分。这是他对假图像的预测误差和对真实图像的预测误差之和。我们把这两个加起来。
现在我们有了错误,我们可以调用dlgradient。Dlgradient将使用一种自动微分的形式来为我们做繁重的工作,他将计算关于生成器中可学习参数的损失梯度。我们对鉴别器和它的损耗做同样的事情。这就给出了我们要从这个函数中寻找的梯度。这就是梯度函数。
现在我们已经有了梯度函数,我们准备执行其他四个步骤。这里我有一个脚本可以完成所有这些。首先我要像往常一样把我的数据放到一个图像数据集里,然后我要从磁盘上加载两个网络。我之前使用Deep Network Designer建立了这些网络。然后我将指定训练选项,这些是你们在很多例子中看到的相同类型的训练选项。
最后,我们准备好训练网络了。通常情况下,你可以打电话给Train Network,它内部有一个训练循环,可以帮你完成所有这些工作。但在这个例子中你不能这样做,因为我们使用了不同的梯度函数,我们需要特别对待它。我们自己来写。但这和通常发生的事情是一样的。
我们要做的第一件事是生成一些噪声,我们稍后将使用它进行验证,跟踪迭代计数。对于每个epoch,对于每次通过数据,我们会重置图像集然后我们会遍历数据。只要图像集有数据,我们就会取下一批图像。这跳过了最后一批,因为有时候,它们的大小不对,所以我们就跳过它们。最后,我们准备好了。
这里我们将取一批向日葵图像并将它们放入dl数组并将它们移动到GPU上。现在我们要做同样的事情。我们会生成一些随机噪声,把它放到dl数组中,放到GPU上。现在计算梯度是对的。我们将调用dlfeval,传入我们之前写过的gradient函数,传入所有其他参数——生成器、discriminator和图像。这样就可以计算出梯度了。
现在我们准备好更新网络了。adamupdate呢。我们给它网络和梯度的可学习值它会产生新的可学习值。对于判别器也是一样的,我们会传递判别器可学习值和梯度值。它会给我们新的可学习的东西。就是这样。我们已经迈出了一步。这一小段代码只是偶尔为我们的娱乐画一些随机输出。然后我们重复这个循环。这就是全部。 If I start that running, it'll move through all these steps and we'll see the output changing every few seconds as it calculates.
现在要把它做好大概需要一个小时。我们将通过视频的魔力来放大它。
(播放音乐)
那我们就等一个小时吧。你可以看到它在制作向日葵图像方面做得很有说服力。我们已经看到了gan网络是如何工作的,我们已经看到了如何使用MathWorks深度学习工具来实现它们。如果你想了解更多关于如何做到这一点,请查看下面的链接。
你也可以从以下列表中选择一个网站:
选择中国网站(中文或英文)以获得最佳网站性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。