新加坡联合早报中文网即时报道亚洲和国际的评论、商业、体育、生活、科技与多媒体新闻,从世界各个维度报道世界经济新闻,时政新闻,突发新闻等。

当前位置:主页 > 新闻 > 看完立刻理解GAN!初学者也没关系

看完立刻理解GAN!初学者也没关系

来源:联合早报中文网作者:邵湖心更新时间:2020-09-05 17:00:06阅读:

本篇文章3079字,读完约8分钟

据雷锋说。这篇文章的原作者是田,原文载于作者的智湖专栏《机器不学习》和《雷锋》。(公开号码:雷锋。com)被授权发布。自2014年诞生以来,gan发展非常迅速。gan的著名应用包括pix2pix、cyclegan等。本文主要是让初学者通过代码了解gan的结构和运行机制,没有介绍太多的理论细节。我们仍然使用mnist手写数据集(这对初学者非常有用)作为我们的训练数据,我们将构建一个简单的gan来生成手写数字图像。

看完立刻理解GAN!初学者也没关系

理解安钢主要包括两个部分:发生器和鉴别器。生成器主要用于学习真实的图像分布,从而使自己生成的图像更加真实,欺骗鉴别者。鉴别器需要判断接收到的图像是真是假。在整个过程中,生成器努力使生成的图像更加真实,而鉴别器努力识别图像的真假。这个过程相当于两个人的游戏。随着时间的推移,发生器和鉴别器不断地相互对抗,最终两个网络达到动态平衡:发生器产生的图像接近真实图像分布,而鉴别器无法识别真假图像,预测给定图像的概率基本接近0.5(相当于随机猜测类别)

看完立刻理解GAN!初学者也没关系

一个更直观的理解甘的例子可以说明:伪造团伙相当于发电机,他们想通过伪造货币欺骗银行,使假币可以正常交易,而银行相当于歧视者,有必要判断收到的钱是真钱还是假币。因此,假币团伙的目的是制造银行无法识别和欺骗银行的假币,而银行则试图准确识别假币。

看完立刻理解GAN!初学者也没关系

因此,我们可以总结上述内容。如果真= 1,假= 0,则有:

对于给定的真实图像,鉴别器应该将其标记为1;

对于给定的假图像,鉴别器应该将其标记为0;

对于生成器发送给鉴别器的生成图像,生成器希望鉴别器标记为1。

有了以上直观的理解,让我们实现一个gan来生成手写数据。代码部分将介绍一些细节。

解释张量流1.0

python 3

jupyter笔记本

Github地址:尼尔森赵/胡志

建议将代码拉下,本文中没有写一些代码实现。加载和查看代码数据

数据我们使用张量流中给出的最小数据接口。

在构建模型之前,让我们先看看我们需要完成的任务:

输入

发电机

鉴别器

定义参数

损耗和优化器

培训模式

显示结果

输入输入

输入函数主要用于定义两个张量:真实图像和生成图像。

定义生成器

我们的发电机结构如下:

我们使用一个具有泄漏relu的隐藏层作为激活函数,并在输出层增加一个激活函数。

以下是生成器的代码。请注意,在定义生成器和鉴别器时,我们需要指定变量的范围,因为gan实际上包含两个网络,生成器和鉴别器,这两个网络在后面的训练中是分开训练的,所以我们需要很好地定义范围,以便于在训练期间指定变量。

看完立刻理解GAN!初学者也没关系

在这个网络中,我们使用了一个隐藏层,并增加了脱落,以防止过度拟合。通过输入噪声图像,生成器输出与真实图像大小相同的图像。

这里,我们的隐藏层激活函数使用漏relu,它在relu函数的基础上改变了左半部分的定义。

维基百科上的图片。Andrej karpathy也在cs231n中提到,一些模型已经通过这个函数获得了很好的结果。由于张量流中没有这个函数的实现,这里我们通过函数定义来实现泄漏relu,其中α是一个小数字。在输出层,我们使用tanh函数,因为tanh的结果比sigmoid的结果好(这里,应该注意,由于生成器生成的图像的像素被限制为(-1,1)的值,并且mnist数据集的像素间隔为[0,1],mnist的输入应该在训练期间进行处理,有关详细信息,请参见训练部分的代码)。在这一点上,我们已经建立了一个生成器,它通过接收有噪声的图像来输出与真实图像大小相同的图像。

看完立刻理解GAN!初学者也没关系

定义鉴别器

鉴别器的结构如下:

鉴别器接收一张图片并判断它是真是假。类似地,隐藏层使用漏relu,输出层是一个节点,输出的概率是1。代码如下:

在这里,我们需要注意这样一个事实,即真实图片和生成的图片共享鉴别器的参数,所以我们在这里留下重用接口供我们稍后调用。

定义参数

Img_size是我们真实图片的大小= 32 * 32 = 784。

平滑是标签平滑正则化的一个参数,稍后将介绍。建立网络

接下来,我们构建网络,并获取生成器和鉴别器返回的变量。

我们分别得到发生器和鉴别器的逻辑和输出。请注意,真实图片和生成的图片共享参数,因此当鉴别器输入生成的图片时,它需要重用参数。

定义损失和优化器

通过以上逻辑,我们可以定义我们的损失和优化器。在此之前,让我们回顾一下生成器和鉴别器各自的用途:

对于给定的真实图像,鉴别器应该将其标记为1;

对于给定的生成图像,鉴别器应该将其标记为0;

对于生成器发送给鉴别器的生成图像,生成器希望鉴别器标记为1。

让我们把这三个句子变成代码:

D_loss_real对应于真实图像的丢失,这使得鉴别器的输出尽可能接近1。这里,我们使用单边标签平滑正则化,这是一种防止过度拟合的方法。在传统分类中,我们的目标不是0就是1。直觉上,这样的目标不够软,这将导致训练好的模型对自己的预测结果过于自信。因此,我们增加了一个平滑值,使鉴别器的泛化效果更好。

看完立刻理解GAN!初学者也没关系

D _ loss _ fake对应于生成图像的丢失,这使得鉴别器的输出尽可能地为0。

d_loss_real和d _ loss _ fake的和是整个鉴别器的损失。

在发生器端,它希望鉴别器尽可能多地输出1给它自己产生的图像,这相当于鉴别器的对抗。

接下来,我们定义优化函数。因为gan包含两个网络,发生器和鉴别器,所以需要分别优化,这就是我们之前定义变量范围的原因。

培训模式

由于代码的训练部分太长,我不会在这里发布。请到我的github下载代码。在训练部分,我们记录了一些图像的生成过程,并记录了训练数据的丢失变化。

我们画出了整个训练过程的损耗变化:

从图中可以看出,最终鉴别器的总损耗在1左右波动,而真损耗和假损耗几乎在一条水平线上波动,这表明鉴别器没有鉴别真假图像的能力,而是进行随机判断。

查看流程结果

在整个训练过程中,我们记录了25个样本在不同阶段的样本图像,并以序列化的方式保存,因此我们加载了样本。样本大小=时代×2×n _ samples×784,我们的迭代次数是300轮,有25个样本,所以样本大小= 300×2×25×784。我们将打印出最后一轮的结果:

看完立刻理解GAN!初学者也没关系

这是我们的甘在学习了真实图片的分布后生成的图像结果。

然后一些学生可能会问,如果我们想看到在这300轮中生成的图像的变化,我们应该做什么?因为我们已经有了样本并存储了每次迭代的结果,所以我们可以选择几次迭代并打印出相应的图像:

在这里,我选择了第0、5、10、20、40、60、80、100、150、250轮的迭代渲染。在这张图片中,我们可以看到只有中间在开始是白色的,在背景的黑色块中有很多噪音。随着迭代次数的增加,生成器制作“假图片”的能力越来越强,并且它逐渐学习真实图片的分布。最明显的一点是,图片区分了黑色背景和白色字符之间的界限。

看完立刻理解GAN!初学者也没关系

生成新图片

如果我们想要重新生成一张新的图片呢?此时,我们只需要加载之前保存的模型文件。

综上所述,本文基于mnist数据集构建了一个简单的gan模型,相信朋友们在阅读代码后会对gan有一个初步的了解。从最终的模型结果来看,生成的图像可以区分背景和数字,黑色块噪声逐渐消失,但从显示结果来看,仍有许多模糊区域。

看完立刻理解GAN!初学者也没关系

对于这里的图像处理,我相信很多朋友会想到卷积神经网络,然后我们将生成器和鉴别器改为卷积神经网络来构造深度卷积神经网络,这对于图像生成会取得更好的效果。

~如果你认为这很好,请为github订购一颗星星~

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

标题:看完立刻理解GAN!初学者也没关系

地址:http://www.6st8.com/zbxw/6095.html

免责声明:联合早报中文网从世界各个维度报道世界经济新闻,时政新闻,突发新闻等,本篇的部分内容来自于网络,不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2018@163.com,联合早报中文网的小编将予以删除。

返回顶部