451474474
037-930586186
导航

生成式反抗网络(GAN)如何快速明白?这里有一篇最直观的解读

发布日期:2022-12-11 00:42

本文摘要:原文泉源:freeCodeCamp作者:Thalles Silva「雷克世界」编译:嗯~阿童木呀、KABUDA让我们假设这样一种情景:你的邻人正在举行一场很是酷的聚会,你很是想去到场。但有要到场聚会的话,你需要一张特价票,而这个票早就已经卖完了。而对于这次聚会的组织者来说,为了让聚会能够乐成举行,他们雇佣了一个及格的宁静机构。主要目的就是不允许任何人破坏这次的聚会。 为了做到这一点,他们在会场入口处安置了许多警卫,检查每小我私家所持门票的真实性。

九州体育app

原文泉源:freeCodeCamp作者:Thalles Silva「雷克世界」编译:嗯~阿童木呀、KABUDA让我们假设这样一种情景:你的邻人正在举行一场很是酷的聚会,你很是想去到场。但有要到场聚会的话,你需要一张特价票,而这个票早就已经卖完了。而对于这次聚会的组织者来说,为了让聚会能够乐成举行,他们雇佣了一个及格的宁静机构。主要目的就是不允许任何人破坏这次的聚会。

为了做到这一点,他们在会场入口处安置了许多警卫,检查每小我私家所持门票的真实性。思量到你没有任何武术上的天赋,而你又特别想去到场聚会,那么唯一的措施就是用一张很是有说服力的伪钞来骗他们。可是这个计划存在一个很大的bug——你从来没有真正看到过这张门票到底是什么样的。

所以,在这种情况下,如果你仅是凭据自己的缔造力设计了一张门票,那么在第一次实验期间就想要骗过警卫险些是不行能的。除此之外,除非你有一个很好的关于此次聚会的门票的复印件,否则你最好不要把你的脸展露出来。为了资助解决问题,你决议打电话给你的朋侪Bob为你做这个事情。

Bob的任务很是简朴。他会试图用你的假通行证进入聚会。如果他被拒绝了,他将返回,然后告诉你一些有关真正的门票应该是什么样的建议。

基于这个反馈,你可以制作一张全新版本的门票,然后将其交给Bob,再去检票处实验一下。这个历程不停重复,直到你能够设计一个完美的门票“复制品”。

这是一个必须去的派对。而下面这张照片,其实是我其实从一个伪钞据生成器器网站上拿到的。对于上面这个小故事,抛开内里的假想身分,这险些就是生成反抗网络(GAN)的事情方式。现在,生成反抗网络的大部门应用都是在盘算机视觉领域。

其中一些应用包罗训练半监视分类器,以及从低分辨率图像中生成高分辨率图像。本篇文章对GAN举行了一些先容,并对图像生成问题举行了实际实践。你可以在你的条记本电脑上举行演示。

生成反抗网络(Generative Adversarial Networks)生成反抗网络框架GAN是由Goodfellow等人于2014年设计的生成模型。在GAN设置中,两个由神经网络举行表现的可微函数被锁定在一个游戏中。

这两个到场者(生成器和判别器)在这个框架中要饰演差别的角色。生成器试图生成来自某种概率漫衍的数据。即你想重新生成一张聚会的门票。

判别器就像一个法官。它可以决议输入是来自生成器还是来自真正的训练集。

这就像是聚会中的安保设置,比将你的伪钞和这正的门票举行比力,以找到你的设计中存在的缺陷。我们将一个4层卷积网络用于生成器和判别器,举行批量正则化。对该模型举行训练以生成SVHN和MNIST图像。

以上是训练期间SVHN(上)和MNIST(下)生成器样本总而言之,游戏如下:•生成器试图最大化判别器将其输入错认为正确的的概率。•判别器引导生成器生成更传神的图像。在完美的平衡状态中,生成器将捕捉通用的训练数据漫衍。效果,判别器总是不确定其输入是否是真实的。

摘自DCGAN论文。生成器网络在这里实现。

注意:完全毗连层和池化层的不存在在DCGAN论文中,作者形貌了一些深度学习技术的组合,它们是训练GAN的关键。这些技术包罗:(i)所有的卷积网络;(ii)批量正则化(BN)。第一个强调的重点是带步幅的卷积(strided convolutions),而不是池化层:增加和淘汰特征的空间维度;第二个是,对特征向量举行正则化以使其在所有层中具有零均值和单元方差。

这有助于稳定学习和处置惩罚权重不佳的初始化问题。言归正传,在这里论述一下实施细节,以及GAN的相关知识。我们提出了深度卷积生成反抗网络(DCGAN)的实现。

我们的实现使用的是Tensorflow并遵循DCGAN论文中形貌的一些实践方法。生成器该网络有4个卷积层,所有的位于BN(输出层除外)和校正线性单元(ReLU)激活之后。它将随机向量z(从正态漫衍中抽取)作为输入。将z重塑为4D形状之后,将其馈送到启动一系列上采样层的生成器中。

每个上采样层都代表一个步幅为2的转置卷积(Transpose convolution)运算。转置卷积与通例卷积类似。一般来说,通例卷积从宽且浅的层延展为更窄、更深的层。

转移卷积走另一条路。他们从深而窄的条理走向更宽更浅。转置卷积运算的步幅界说了输出层的巨细。

在“相同”的填充和步幅为2时,输出特征的巨细将是输入层的两倍。发生这种情况的原因是,每次我们移动输入层中的一个像素时,我们都市将输出层上的卷积内核移动两个像素。换句话说,输入图像中的每个像素都用于在输出图像中绘制一个正方形。将一个3x3的内核在一个步幅为2的2x2输入上举行转置,就相当于将一个3x3的内核在一个步幅为2的5x5输入上举行卷积运算。

对于二者,均不使用填充“有效”简而言之,生成器开始于这个很是深但很窄的输入向量开始。在每次转置卷积之后,z变得更宽、更浅。所有的转置卷积都使用5x5内核的巨细,且深度从512淘汰到3——代表RGB彩色图像。def transpose_conv2d(x, output_space): return tf.layers.conv2d_transpose(x, output_space, kernel_size=5, strides=2, padding='same', kernel_initializer=tf.random_normal_initializer(mean=0.0, stddev=0.02))最后一层通过双曲正切(tanh)函数输出一个32x32x3的张量——值在-1和1之间举行压缩。

这个最终的输出形状是由训练图像的巨细来界说的。在这种情况下,如果是用于SVHN的训练,生成器生成32x32x3的图像。

可是,如果是用于MNIST的训练,则会生成28x28的灰度图像。最后,请注意,在将输入向量z馈送到生成器之前,我们需要将其缩放到-1到1的区间。这是遵循使用tanh函数的选择。

def generator(z, output_dim, reuse=False, alpha=0.2, training=True): """ Defines the generator network :param z: input random vector z :param output_dim: output dimension of the network :param reuse: Indicates whether or not the existing model variables should be used or recreated :param alpha: scalar for lrelu activation function :param training: Boolean for controlling the batch normalization statistics :return: model's output """ with tf.variable_scope('generator', reuse=reuse): fc1 = dense(z, 4*4*512) # Reshape it to start the convolutional stack fc1 = tf.reshape(fc1, (-1, 4, 4, 512)) fc1 = batch_norm(fc1, training=training) fc1 = tf.nn.relu(fc1) t_conv1 = transpose_conv2d(fc1, 256) t_conv1 = batch_norm(t_conv1, training=training) t_conv1 = tf.nn.relu(t_conv1) t_conv2 = transpose_conv2d(t_conv1, 128) t_conv2 = batch_norm(t_conv2, training=training) t_conv2 = tf.nn.relu(t_conv2) logits = transpose_conv2d(t_conv2, output_dim) out = tf.tanh(logits) return out判别器判别器也是一个包罗BN(除了其输入层之外)和leaky ReLU激活的4层CNN。许多激活函数都可以在这种基础GAN体系结构中举行良好的运算。可是leaky ReLUs有着很是广泛的应用,因为它们可以资助梯度在结构中更轻易地流动。

通例的RELU函数通过将负值截断为0来事情。这样做的效果是阻止梯度流通过网络。leaky ReLU允许一个小负值通过,而非要求函数为0。

也就是说,函数用来盘算特征与小因素之间的最大值。def lrelu(x, alpha=0.2): # non-linear activation function return tf.maximum(alpha * x, x)leaky ReLU表现了一种解决瓦解边缘ReLU问题的实验。这种情况发生在神经元陷于某一特定情况下,此时ReLU单元对于任何输入都输出0。

对于这些情况,梯度完全关闭以通过网络回流。这对于GAN来说尤为重要,因为生成器必须学习的唯一方法是接受来自判别器的梯度。

(上)ReLU,(下)leaky ReLU激活函数。请注意,当x为负值时, leaky ReLU允许有一个小的斜率这个判别器首先吸收一个32x32x3的图像张量。与生成器相反的是,判别器执行一系列步幅为2的卷积。

每一种方法都是通过将特征向量的空间维度缩小一半,从而使学习过滤器的数量加倍。最后,判别器需要输出概率。为此,我们在最后的逻辑(logits)上使用Logistic Sigmoid激活函数。

def discriminator(x, reuse=False, alpha=0.2, training=True): """ Defines the discriminator network :param x: input for network :param reuse: Indicates whether or not the existing model variables should be used or recreated :param alpha: scalar for lrelu activation function :param training: Boolean for controlling the batch normalization statistics :return: A tuple of (sigmoid probabilities, logits) """ with tf.variable_scope('discriminator', reuse=reuse): # Input layer is 32x32x? conv1 = conv2d(x, 64) conv1 = lrelu(conv1, alpha) conv2 = conv2d(conv1, 128) conv2 = batch_norm(conv2, training=training) conv2 = lrelu(conv2, alpha) conv3 = conv2d(conv2, 256) conv3 = batch_norm(conv3, training=training) conv3 = lrelu(conv3, alpha) # Flatten it flat = tf.reshape(conv3, (-1, 4*4*256)) logits = dense(flat, 1) out = tf.sigmoid(logits) return out, logits需要注意的是,在这个框架中,判别器充当一个通例的二进制分类器。一半的时间从训练集吸收图像,另一半时间从生成器吸收图像。回到我们的故事中,为了复制聚会的票,你唯一的信息泉源是朋侪Bob的反馈。

换言之,Bob在每次实验期间向你提供的反馈的质量对于完成事情至关重要。同样的,每次判别器注意到真实图像和虚假图像之间的差异时,都市向生成器发送一个信号。该信号是从判别器向生成器反向流动的梯度。通过吸收它,生成器能够调整其参数以靠近真实的数据漫衍。

这就是判别器的重要性所在。实际上,生成器将要尽可能好地发生数据,因为判别器正在不停地缩小真实和虚假数据的差距。损失现在,让我们来形貌这一结构中最棘手的部门——损失。

首先,我们知道判别器收集来自训练集和生成器的图像。我们希望判别器能够区分真实和虚假的图像。我们每次通过判别器运行一个小批量(mini-batch)的时候,都市获得逻辑(logits)。

这些是来自模型的未缩放值(unscaled values)。然而,我们可以将判别器吸收的小批量(mini-batches)分成两种类型。第一种类型只由来自训练集的真实图像组成,第二种类型只包罗由生成器生成的假图像。

def model_loss(input_real, input_z, output_dim, alpha=0.2, smooth=0.1): """ Get the loss for the discriminator and generator :param input_real: Images from the real dataset :param input_z: random vector z :param out_channel_dim: The number of channels in the output image :param smooth: label smothing scalar :return: A tuple of (discriminator loss, generator loss) """ g_model = generator(input_z, output_dim, alpha=alpha) d_model_real, d_logits_real = discriminator(input_real, alpha=alpha) d_model_fake, d_logits_fake = discriminator(g_model, reuse=True, alpha=alpha) # for the real images, we want them to be classified as positives, # so we want their labels to be all ones. # notice here we use label smoothing for helping the discriminator to generalize better. # Label smoothing works by avoiding the classifier to make extreme predictions when extrapolating. d_loss_real = tf.reduce_mean( tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_real, labels=tf.ones_like(d_logits_real) * (1 - smooth))) # for the fake images produced by the generator, we want the discriminator to clissify them as false images, # so we set their labels to be all zeros. d_loss_fake = tf.reduce_mean( tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.zeros_like(d_model_fake))) # since the generator wants the discriminator to output 1s for its images, it uses the discriminator logits for the # fake images and assign labels of 1s to them. g_loss = tf.reduce_mean( tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.ones_like(d_model_fake))) d_loss = d_loss_real + d_loss_fake return d_loss, g_loss由于两个网络同时举行训练,因此GAN需要两个优化器。它们划分用于最小化判别器和发生器的损失函数。我们希望判别器输出真实图像的概率靠近于1,输出假图像的概率靠近于0。要做到这一点,判别器需要两部门损失。

因此,判别器的总损失是这两部门损失之和。其中一部门损失用于将真实图像的概率最大化,另一部门损失用于将假图像的概率最小化。

九州体育

比力真实(左)和生成的(右)SVHN样本图像。虽然有些图像看起来很模糊,且有些图像很难识别,但值得注意的是,数据漫衍是由模型捕捉的在训练开始的时候,会泛起两个有趣的情况。首先,生成器不清楚如何建立与训练集中图像相似的图像。

其次,判别器不清楚如何将吸收到的图像分为真、假两类。效果,判别器吸收两种类型截然差别的批量(batches)。一个由训练集的真实图像组成,另一个包罗含有噪声的信号。

随着训练的不停举行,生成器输出的图像越发靠近于训练集中的图像。这种情况是由生成器学习组成训练集图像的数据漫衍而造成的。与此同时,判别器开始真正善于将样天职类为真或假。效果,这两种小批量(mini-batch)在结构上开始相互类似。

因此,判别器无法识别出真实或虚假的图像。对于损失,我们认为,使用具有Adam算法的vanilla交织熵(vanilla cross-entropy)作为优化器是一个不错的选择。

比力real(左)和Generate(右)MNIST示例图像。由于MNIST图像具有更简朴的数据结构,因此与SVHN相比,该模型能够生成更真实的样本现在,GANs是机械学习中最热门的学科之一。

这些模型具有解开无监视学习方法(unsupervised learning methods)的潜力,而且可以将ML拓展到新领域。自从GANs降生以来,研究人员开发了许多用于训练GANs的技术。在革新事后的GANs训练技术中,作者形貌了图像生成(image generation)和半监视学习(semi-supervised learning)的最新技术。

如果你想对这些问题有更深入的明白,我推荐文章:《反抗模型》同样,看一看《使用GAN实现半监视学习》这篇文章以相识半监视学习的应用。原文链接:https://medium.freecodecamp.org/an-intuitive-introduction-to-generative-adversarial-networks-gans-7a2264a81394。


本文关键词:生成,九州体育app,式,反抗,网络,GAN,如何,快速,明白,这里

本文来源:九州体育-www.passerellesludiques.com

开云体育app    澳门人威尼斯    亚博全站APP登录官