From c346c3b2f326f093e73a95608fc60ef015a21a22 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Sat, 12 Dec 2020 20:13:01 +0800 Subject: [PATCH] 2020-12-12 20:13:01 --- new/handson-unsup-learn-py/09.md | 106 +++++++++++++++---------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/new/handson-unsup-learn-py/09.md b/new/handson-unsup-learn-py/09.md index 57ae1c72..18e59b26 100644 --- a/new/handson-unsup-learn-py/09.md +++ b/new/handson-unsup-learn-py/09.md @@ -44,7 +44,7 @@ -这些生成模型由 Goodfellow 和其他研究人员提出(在 *生成对抗网络中,Goodfellow IJ,Pouget-Abadie J.,Mirza M.,Xu B.,Warde-Farley D.,Ozair S.,Courville A.和 Bengio Y。, arXiv:1406.2661 [stat.ML]* ),以利用**对抗训练**的功能以及深度神经网络的灵活性。 无需过多的技术细节,我们就可以将对抗训练的概念作为一种基于博弈论的技术进行介绍,其目标是优化两个相互竞争的代理。 当一个特工试图欺骗其对手时,另一名特工必须学习如何区分正确的输入和伪造的输入。 特别是,GAN 是一个模型,它分为两个定义明确的组件: +这些生成模型由 Goodfellow 和其他研究人员提出(在《生成对抗网络》中),以利用**对抗训练**的功能以及深度神经网络的灵活性。 无需过多的技术细节,我们就可以将对抗训练的概念作为一种基于博弈论的技术进行介绍,其目标是优化两个相互竞争的代理。 当一个特工试图欺骗其对手时,另一名特工必须学习如何区分正确的输入和伪造的输入。 特别是,GAN 是一个模型,它分为两个定义明确的组件: * **生成器** * **判别器**(也称为**评论家**) @@ -57,15 +57,15 @@ ![](img/4579d40e-3f19-4f5b-8f1b-70ea0fe5e3be.png) -换句话说,生成器是样本 *x∈^n 上均匀分布到另一分布 *p [g] (x)*的变换。 ]* 。 GAN 的主要目标如下: +换句话说,生成器是样本`x ∈ R^n`上均匀分布到另一分布`p[g](x)`的变换。 GAN 的主要目标如下: ![](img/956dc503-ac1c-451e-89a1-2f47d07bb5d1.png) -但是,与通过直接训练整个模型来实现这一目标的自编码器相反,在 GAN 中,目标是通过在生成器和判别器之间进行的游戏来实现的,这是另一个需要采样的参数化函数, *x [i] ∈^n* ,并返回概率: +但是,与通过直接训练整个模型来实现这一目标的自编码器相反,在 GAN 中,目标是通过在生成器和判别器之间进行的游戏来实现的,这是另一个需要采样的参数化函数,`x[i] ∈ R^n`,并返回概率: ![](img/4bd5bc8f-ede6-45e8-80ea-543706b24852.png) -判别器的作用是区分从`p_data`(返回大概率)提取的样本与由 *g(z;θ [g] )*(返回低概率)。 但是,由于生成器的目标是变得越来越有能力复制`p_data`,因此其作用是学习如何用几乎完美复制品中的样本来欺骗判别器 数据生成过程。 因此,考虑到区分因素,目标是最大化以下条件: +判别器的作用是区分从`p_data`(返回大概率)提取的样本与由`g(z; θ[g])`(返回低概率)。 但是,由于生成器的目标是变得越来越有能力复制`p_data`,因此其作用是学习如何用几乎完美复制品中的样本来欺骗判别器 数据生成过程。 因此,考虑到区分因素,目标是最大化以下条件: ![](img/6776cf30-d26d-4c1b-aa66-65165ebac3a2.png) @@ -73,7 +73,7 @@ ![](img/1c69083f-4200-4599-a7af-1b594ab3bc20.png) -实际上,当两个代理都成功地优化了目标时,判别器将能够区分从`p_data`提取的样本和异常值,并且生成器将能够输出合成样本 属于`p_data`。 但是,必须明确的是,可以通过使用单个目标来表达问题,并且训练过程的目标是找出最佳参数集,*θ= {θ [d] ,θ [g] }* ,因此判别器将其最大化,而生成器将其最小化。 必须同时优化两个代理,但是实际上,过程是交替的(例如,生成器,判别器,生成器等)。 目标可以用更紧凑的形式表示如下: +实际上,当两个代理都成功地优化了目标时,判别器将能够区分从`p_data`提取的样本和异常值,并且生成器将能够输出合成样本 属于`p_data`。 但是,必须明确的是,可以通过使用单个目标来表达问题,并且训练过程的目标是找出最佳参数集,`θ = {θ[d], θ[g]}`,因此判别器将其最大化,而生成器将其最小化。 必须同时优化两个代理,但是实际上,过程是交替的(例如,生成器,判别器,生成器等)。 目标可以用更紧凑的形式表示如下: ![](img/304d8dd9-8212-4b27-a550-71c85664a763.png) @@ -91,7 +91,7 @@ -假设我们有一个 GAN,该 GAN 已通过使用从`p_data`(x)*中提取的数据集`X`进行了适当的训练。 Goodfellow 等人证明,给定生成器分布 *p [g] (x)*,最佳判别器如下: +假设我们有一个 GAN,该 GAN 已通过使用从`p_data(x)`中提取的数据集`X`进行了适当的训练。 Goodfellow 等人证明,给定生成器分布`p[g](x)`,最佳判别器如下: ![](img/bf275808-f597-4c3c-a017-6ecaa9f12a79.png) @@ -111,7 +111,7 @@ ![](img/ea76a19a-d431-4d64-8ab4-2353158ec476.png) -因此,目标可以表示为数据生成过程和生成器分布之间的 **Jensen-Shannon 散度**的函数。 与 Kullback-Leibler 散度的主要区别在于 *0≤D [JS] (`p_data`|| p [g] )≤log(2)*,并且是对称的。 这种重新定义并不奇怪,因为 GAN 的真正目标是成为一个能够成功复制`p_data`的生成模型,如下图所示: +因此,目标可以表示为数据生成过程和生成器分布之间的 **Jensen-Shannon 散度**的函数。 与 Kullback-Leibler 散度的主要区别在于`0 ≤ D[JS](p_data || p[g]) ≤ log(2)`,并且是对称的。 这种重新定义并不奇怪,因为 GAN 的真正目标是成为一个能够成功复制`p_data`的生成模型,如下图所示: ![](img/d5d8548e-abc4-4567-9a42-2def53203f69.png) @@ -127,7 +127,7 @@ GAN 的目标是将生成的模型分布朝`p_data`方向移动,以尝试使 -给定一个概率分布,最常出现的值(在离散情况下)或对应于概率密度函数最大值的值(在连续情况下)称为**模式**。 如果考虑后一种情况,则其 PDF 具有单个最大值的分布称为**单峰**。 当有两个局部极大值时,称为**双峰,**等(通常,当存在多个众数时,分布简称为**多峰**)。 以下屏幕快照显示了两个示例: +给定一个概率分布,最常出现的值(在离散情况下)或对应于概率密度函数最大值的值(在连续情况下)称为**模式**。 如果考虑后一种情况,则其 PDF 具有单个最大值的分布称为**单峰**。 当有两个局部极大值时,称为**双峰**,等(通常,当存在多个众数时,分布简称为**多峰**)。 以下屏幕快照显示了两个示例: ![](img/a8df35ed-d5d1-4e6f-b381-f22b67ef545a.png) @@ -139,7 +139,7 @@ GAN 的目标是将生成的模型分布朝`p_data`方向移动,以尝试使 我们在使用 GAN 时面临的最著名,最棘手的问题之一就是**模式崩溃**,它涉及到次优的最终配置,其中生成器冻结在某个模式附近,并不断提供与 输出。 发生这种情况的原因非常难以分析(实际上,只有理论),但是我们可以理解如果重新考虑 minimax 游戏,为什么会发生这种情况。 当我们要训练两个不同的分量时,即使保证了纳什均衡,在几次迭代之后,对于最常见的模式,判别器也会变得非常有选择性。 当然,当训练生成器以欺骗判别器时,实现此目标的最简单方法是简单地避免所有采样远离模式。 这种行为增加了判别器的选择性,并创建了一个反馈过程,使 GAN 陷入只有数据生成过程只有一小部分区域的状态。 -在梯度方面,判别器提供的用于优化生成器的信息很快变得非常稀缺,因为最常见的样本不需要任何调整。 另一方面,当生成器开始避免所有 *p(x)*不接近最大值的样本时,它们不会将判别器暴露给新的,可能有效的样本,因此梯度将 保持很小,直到消失为零。 不幸的是,没有可以用来避免此问题的全局策略,但是在本章中,我们将讨论一种建议的方法,以减轻模式崩溃(WGAN)的风险。 特别是,我们将把注意力集中在 Jensen-Shannon 发散的局限性上,在某些情况下,由于没有大的梯度,这可能导致 GAN 达到次优配置。 在本简介中,重要的是,不熟悉这些模型的读者应意识到风险,并能够在发生模式崩溃时识别出它。 +在梯度方面,判别器提供的用于优化生成器的信息很快变得非常稀缺,因为最常见的样本不需要任何调整。 另一方面,当生成器开始避免所有`p(x)`不接近最大值的样本时,它们不会将判别器暴露给新的,可能有效的样本,因此梯度将 保持很小,直到消失为零。 不幸的是,没有可以用来避免此问题的全局策略,但是在本章中,我们将讨论一种建议的方法,以减轻模式崩溃(WGAN)的风险。 特别是,我们将把注意力集中在 Jensen-Shannon 发散的局限性上,在某些情况下,由于没有大的梯度,这可能导致 GAN 达到次优配置。 在本简介中,重要的是,不熟悉这些模型的读者应意识到风险,并能够在发生模式崩溃时识别出它。 此时,我们可以继续进行实际操作,并使用 TensorFlow 建模真实的 GAN。 @@ -151,9 +151,9 @@ GAN 的目标是将生成的模型分布朝`p_data`方向移动,以尝试使 -现在,我们可以基于*使用深度卷积生成对抗网络的无监督表示学习, Radford A.,Metz L.和 Chintala S。,* *中提出的模型来实现 DCGAN ] arXiv:1511.06434 [cs.LG]* 和 Olivetti faces 数据集,该数据集足够小以允许进行快速训练。 +现在,我们可以基于《使用深度卷积生成对抗网络的无监督表示学习》和 Olivetti faces 数据集,该数据集足够小以允许进行快速训练。 -让我们首先加载数据集并标准化范围( *-1,1* )中的值,如下所示: +让我们首先加载数据集并标准化范围`(-1, 1)`中的值,如下所示: ```py from sklearn.datasets import fetch_olivetti_faces @@ -187,19 +187,19 @@ nb_iterations = int(nb_samples / batch_size) 有`400` 64×64 灰度样本(每个样本对应 4,096 个分量)。 在此示例中,我们选择采用具有`512`分量的噪声代码向量,并以`50`个样本批量训练`500`时期的模型。 这样的值不是基于黄金规则的,因为(尤其是对于 GAN)几乎不可能知道哪个设置会产生最佳结果。 因此,与往常一样,我强烈建议在做出决定之前检查不同的超参数集。 -当训练过程不太长时,可以使用一组统一采样的超参数(例如*批大小∈{20,50,100,200}* 检查生成器和判别器的平均损失 ])。 例如,如果某个最佳值似乎在范围内( *50,100* ),那么一个好的策略是提取一些随机值并重新训练模型。 可以重复进行此过程,直到采样值之间的差异可以忽略不计为止。 当然,考虑到这些模型的复杂性,只有使用专用硬件(即多个 GPU 或 TPU)才能进行彻底的搜索。 因此,另一个建议是从经过测试的配置开始(即使上下文不同),并进行小的修改,以便针对特定任务优化它们。 在此示例中,我们根据原始论文设置了许多值,但是我邀请读者在自定义更改后重新运行代码并观察差异。 +当训练过程不太长时,可以使用一组统一采样的超参数(例如批大小属于`{20, 50, 100, 200}`)检查生成器和判别器的平均损失。 例如,如果某个最佳值似乎在范围`(50, 100)`内,那么一个好的策略是提取一些随机值并重新训练模型。 可以重复进行此过程,直到采样值之间的差异可以忽略不计为止。 当然,考虑到这些模型的复杂性,只有使用专用硬件(即多个 GPU 或 TPU)才能进行彻底的搜索。 因此,另一个建议是从经过测试的配置开始(即使上下文不同),并进行小的修改,以便针对特定任务优化它们。 在此示例中,我们根据原始论文设置了许多值,但是我邀请读者在自定义更改后重新运行代码并观察差异。 现在,我们可以基于以下结构为生成器定义 DAG: -* 具有 1,024(4×4)过滤器的 2D 卷积,步幅为[ *1,1* ),有效填充和线性输出 -* 批量标准化和 LReLU 激活(当输入值为负时,性能更高;实际上,当 *x < 0* 时,标准 ReLU 的梯度为零,而 LReLU 的常数较小) 允许稍微修改的渐变) -* 带有( *2、2* )步幅,相同填充和线性输出的 512(4×4)滤波器的 2D 卷积 +* 具有 1,024 个`4×4`过滤器的 2D 卷积,步幅为`(1, 1)`,有效填充和线性输出 +* 批量标准化和 LReLU 激活(当输入值为负时,性能更高;实际上,当`x < 0`时,标准 ReLU 的梯度为零,而 LReLU 的常数较小) 允许稍微修改的渐变) +* 带有`(2, 2)`步幅,相同填充和线性输出的 512 个`4×4`滤波器的 2D 卷积 * 批量标准化和泄漏的 ReLU 激活 -* 256 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同 填充,以及线性输出 +* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 具有 128 个(4×4)过滤器的 2D 卷积,步幅为[ *2,2* ), 相同 填充,以及线性输出 +* 具有 128 个`4×4`过滤器的 2D 卷积,步幅为`(2, 2)`, 相同 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 具有 1 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同的 填充,以及双曲正切输出 +* 具有 1 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同的 填充,以及双曲正切输出 以下代码段显示了生成器的代码: @@ -252,14 +252,14 @@ def generator(z, is_training=True): 判别器的 DAG 基于以下对称结构: -* 具有( *2、2* )步幅的 128(4×4)个滤波器的 2D 卷积,,相同的 填充,以及泄漏的 ReLU 输出 -* 256 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同 填充,以及线性输出 +* 具有`(2, 2)`步幅的 128`4×4`个滤波器的 2D 卷积,,相同的 填充,以及泄漏的 ReLU 输出 +* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 带有 512 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同 填充,以及线性输出 +* 带有 512 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 具有 1,024(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同的 填充,以及线性输出 +* 具有 1,024`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同的 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 具有 1 个(4×4)过滤器的 2D 卷积,步幅为[ *2,2* ), 有效 填充,以及线性输出(预期输出为 sigmoid,可以表示一个概率,但是我们将直接在损失函数内部执行此变换) +* 具有 1 个`4×4`过滤器的 2D 卷积,步幅为`(2, 2)`, 有效 填充,以及线性输出(预期输出为 sigmoid,可以表示一个概率,但是我们将直接在损失函数内部执行此变换) 判别器的代码为,如下所示: @@ -344,7 +344,7 @@ with graph.as_default(): 第一块包含占位符的声明。 为了清楚起见,虽然`input_x`和`input_z`的目的很容易理解,但`is_training`可能不太明显。 此布尔值标志的目的是允许在生产阶段禁用批量标准化(必须仅在训练阶段有效)。 下一步包括声明生成器和两个判别器(它们在形式上是相同的,因为变量是共享的,但是其中一个被提供了真实的样本,而另一个必须评估生成器的输出)。 然后,是时候定义损失函数了,它是基于一种可以加快计算速度并增加数值稳定性的技巧。 -函数`tf.nn.sigmoid_cross_entropy_with_logits()`接受 *logit* (这就是为什么我们没有将 Sigmoid 变换直接应用于判别器输出的原因),并允许我们执行以下向量计算: +函数`tf.nn.sigmoid_cross_entropy_with_logits()`接受对率(这就是为什么我们没有将 Sigmoid 变换直接应用于判别器输出的原因),并允许我们执行以下向量计算: ![](img/cb4a2f99-5422-4c6f-bc83-588e81037426.png) @@ -356,7 +356,7 @@ with graph.as_default(): ![](img/4bebedd1-9438-42e7-aae9-c18aa72d2a49.png) -相同的概念适用于生成器损失函数。 下一步需要定义两个 Adam 优化器。 如前所述,我们需要隔离变量以进行隔行训练。 因此,`minimize()`函数现在被提供了损失和必须更新的变量集。 TensorFlow 官方文档中建议使用上下文声明`tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS))`,只要采用批量标准化,其目标是仅在计算均值和方差之后才允许执行训练步骤(有关此技术的更多详细信息,请检查 原始论文:*批量标准化:通过减少内部协变量移位*, *Ioffe S.和 Szegedy C.* , *arXiv:1502.03167 [ cs.LG]* )。 +相同的概念适用于生成器损失函数。 下一步需要定义两个 Adam 优化器。 如前所述,我们需要隔离变量以进行隔行训练。 因此,`minimize()`函数现在被提供了损失和必须更新的变量集。 TensorFlow 官方文档中建议使用上下文声明`tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS))`,只要采用批量标准化,其目标是仅在计算均值和方差之后才允许执行训练步骤(有关此技术的更多详细信息,请检查原始论文:《批量标准化:通过减少内部协变量移位》。 此时,我们可以创建一个会话并初始化所有变量,如下所示: @@ -405,7 +405,7 @@ for e in range(nb_epochs): print('Epoch {}) Avg. discriminator loss: {} - Avg. generator loss: {}'.format(e + 1, np.mean(d_losses), np.mean(g_losses))) ``` -在这两个步骤中,我们为网络提供一批真实的图像(在生成器优化期间不会使用)和统一采样的代码`Z`,其中每个分量为 *z [i] 〜U(-1,1)*。 为了减轻模式崩溃的风险,我们将在每次迭代开始时对集合进行洗牌。 这不是一个可靠的方法,但是至少可以确保避免可能导致 GAN 达到次优配置的相互关系。 +在这两个步骤中,我们为网络提供一批真实的图像(在生成器优化期间不会使用)和统一采样的代码`Z`,其中每个分量为`z[i] ~ U(-1, 1)`。 为了减轻模式崩溃的风险,我们将在每次迭代开始时对集合进行洗牌。 这不是一个可靠的方法,但是至少可以确保避免可能导致 GAN 达到次优配置的相互关系。 在训练过程结束时,我们可以生成一些样本面孔,如下所示: @@ -445,15 +445,15 @@ The screenshots that are shown in this and other examples in this chapter are of -给定概率分布 *p(x)*,集合 *D [p] = {x:p(x)> 0}* 被称为**支持** 。 如果 *p(x)*和 *q(x)*的两个分布具有脱节的支撑(即 *D [p] ∩D [q] = {∅}* ),詹森-香农散度等于 *log(2)*。 这意味着渐变为零,并且无法进行任何校正。 在涉及 GAN 的一般情况下, *p [g] (x)*和`p_data`完全不可能重叠( 但是,您可以期望有最小的重叠); 因此,梯度很小,权重的更新也很小。 这样的问题可能会阻止训练过程,并使 GAN 陷入无法逃避的次优配置状态。 因此, Arjovsky,Chintala 和 Bottou (在 *Wasserstein GAN 中,* *Arjovsky M.* , *Chintala S.* , *和 Bottou L.* , *arXiv:1701.07875 [stat.ML]* )基于称为**瓦瑟斯坦距离**的更稳健的差异度量,提出了一个略有不同的模型。 ](或“地球移动者”的距离): +给定概率分布`p(x)`,集合`D[p] = {x: p(x) > 0}`被称为**支持** 。 如果`p(x)`和`q(x)`的两个分布具有脱节的支撑(即`D[p] ∩ D[q] = {∅}`),詹森-香农散度等于`log(2)`。 这意味着渐变为零,并且无法进行任何校正。 在涉及 GAN 的一般情况下, `p[g](x)`和`p_data`完全不可能重叠( 但是,您可以期望有最小的重叠); 因此,梯度很小,权重的更新也很小。 这样的问题可能会阻止训练过程,并使 GAN 陷入无法逃避的次优配置状态。 因此, Arjovsky,Chintala 和 Bottou (在《Wasserstein GAN》中)基于称为**瓦瑟斯坦距离**的更稳健的差异度量,提出了一个略有不同的模型。(或“地球移动者”的距离): ![](img/cf700f07-35ed-4e38-80db-a046bbe07d21.png) -为了理解前面的公式,必须说 *∏(`p_data`,p [g] )*是包含所有可能的联合分布的集合。 数据生成过程和生成器分布。 因此,Wasserstein 距离等于范数 *|| x-y ||的期望值的最小值。* ,假设一对( *x,y* )是分布*μ〜 ∏( p [数据[] ,,p [g]* *)*。 即使这个概念很简单,这种定义也不是很直观,并且可以通过考虑两个二维 Blob(其距离是两个最近点之间的距离)来概括。 显然,支撑支点不相交的问题已被完全克服,此外,度量也与实际分布距离成比例。 不幸的是,我们没有使用有限集。 因此,Wasserstein 距离的计算可能非常低效,并且几乎不可能用于现实生活中的任务。 但是, **Kantorovich-Rubinstein 定理**(由于超出了本书的范围,因此未进行全面分析)使我们可以通过使用特殊的支持函数 *f(x)*来简化表达式。 ]: +为了理解前面的公式,必须说`∏(p_data, p[g])`是包含所有可能的联合分布的集合。 数据生成过程和生成器分布。 因此,Wasserstein 距离等于范数`||x - y||`的期望值的最小值。假设一对`(x, y)`是分布`μ ~ ∏(p_data, p[g])`。 即使这个概念很简单,这种定义也不是很直观,并且可以通过考虑两个二维 Blob(其距离是两个最近点之间的距离)来概括。 显然,支撑支点不相交的问题已被完全克服,此外,度量也与实际分布距离成比例。 不幸的是,我们没有使用有限集。 因此,Wasserstein 距离的计算可能非常低效,并且几乎不可能用于现实生活中的任务。 但是, **Kantorovich-Rubinstein 定理**(由于超出了本书的范围,因此未进行全面分析)使我们可以通过使用特殊的支持函数`f(x)`来简化表达式: ![](img/6409c4e2-844b-44d2-bd22-655dd88d2e4b.png) -该定理施加的主要约束是 *f(x)*必须是 L-Lipschitz 函数,也就是说,给定非负常数`L`,则适用 : +该定理施加的主要约束是`f(x)`必须是 L-Lipschitz 函数,也就是说,给定非负常数`L`,则适用 : ![](img/a97ddbd4-a379-4fc0-aad7-4de7a552abcd.png) @@ -461,7 +461,7 @@ The screenshots that are shown in this and other examples in this chapter are of ![](img/ac4ed2f2-c377-4788-9950-1e7768520a25.png) -在这种特定情况下,区分符通常被称为批判者,因此 *f(x;θ [c] )*扮演着这个角色。 由于这样的函数必须是 L-Lipschitz,因此作者建议在应用校正后就剪切所有变量`$1[$2]`: +在这种特定情况下,区分符通常被称为批判者,因此`f(x; θ[c])`扮演着这个角色。 由于这样的函数必须是 L-Lipschitz,因此作者建议在应用校正后就剪切所有变量`$1[$2]`: ![](img/c6e68853-8d2d-4ea5-9670-8fe1ad4803ac.png) @@ -477,7 +477,7 @@ The screenshots that are shown in this and other examples in this chapter are of 在此示例中,我们将使用 Fashion MNIST 数据集(由 Keras 直接提供)基于 Wasserstein 距离实现 DCGAN。 该集合由 60,000 张 28×28 灰度的衣服图像组成,由 Zalando 引入,以替代标准 MNIST 数据集,该数据集的类别太容易被许多分类器分离。 考虑到此类网络所需的训练时间,我们决定将过程限制为 5,000 个样本,但是拥有足够资源的读者可以选择增加或消除此限制。 -第一步包括加载,切片和规范化数据集(在 *-1,1* 范围内),如下所示: +第一步包括加载,切片和规范化数据集(在`(-1, 1)`范围内),如下所示: ```py import numpy as np @@ -502,15 +502,15 @@ height = X_train.shape[2] 现在,我们可以基于 DCGAN 的同一层定义生成器 DAG,如下所示: -* 具有 1,024(4×4)滤波器的 2D 卷积,步幅为[ *1,1,*), 有效 填充,以及线性输出 +* 具有 1,024 个`4×4`滤波器的 2D 卷积,步幅为`(1, 1)`, 有效 填充,以及线性输出 * 批量标准化和 LReLU 激活 -* 带有 512 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同 填充,以及线性输出 +* 带有 512 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 256 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同 填充,以及线性输出 +* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 具有 128 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同 填充,以及线性输出 +* 具有 128 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 具有 1 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同的 填充,以及双曲正切输出 +* 具有 1 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同的 填充,以及双曲正切输出 该代码显示在以下代码片段中: @@ -561,14 +561,14 @@ def generator(z, is_training=True): 评论者的 DAG 基于以下几组: -* 具有( *2、2* )步幅的 128(4×4)个滤波器的 2D 卷积,,相同的 填充,以及泄漏的 ReLU 输出 -* 256 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ), 相同的 填充,以及线性输出 +* 具有`(2, 2)`步幅的 128`4×4`个滤波器的 2D 卷积,,相同的 填充,以及泄漏的 ReLU 输出 +* 256 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`, 相同的 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 带有 512 个(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同 填充,以及线性输出 +* 带有 512 个`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 具有 1,024(4×4)滤波器的 2D 卷积,步幅为[ *2,2* ),,相同的 填充,以及线性输出 +* 具有 1,024`4×4`滤波器的 2D 卷积,步幅为`(2, 2)`,,相同的 填充,以及线性输出 * 批量标准化和泄漏的 ReLU 激活 -* 具有 1 个(4×4)过滤器的 2D 卷积,步幅为[ *2,2* ), 有效 填充和线性输出 +* 具有 1 个`4×4`过滤器的 2D 卷积,步幅为`(2, 2)`, 有效 填充和线性输出 相应的代码块为,如下所示: @@ -748,7 +748,7 @@ WGAN 不会陷入模式崩溃,但是不同区域的强烈分离使模型无法 -自组织映射是 Willshaw 和 Von Der Malsburg 首次提出的模型(在*中如何通过自组织建立模式化的神经连接 Willshaw, DJ 和 Von Der Malsburg,C。,伦敦皇家学会会议录*,B / 194,N。1117,1976),目的是找到一种描述大脑中发生的不同现象的方法。 许多动物 实际上,他们观察到大脑的某些区域可以发展出内部组织的结构,这些结构的子组件相对于特定的输入模式(例如,某些视觉皮层区域对垂直或水平带非常敏感)可以选择性地接受。 SOM 的中心思想可以通过考虑聚类过程来综合,该聚类过程旨在找出样本的低级属性,这要归功于其对聚类的分配。 主要的实际差异是,在 SOM 中,单个单元通过称为**赢家通吃**的学习过程,成为一部分样本总体(即数据生成过程的区域)的代表。 。 这样的训练过程首先是引起所有单元(我们将其称为神经元)的响应并增强所有权重,然后通过减小最活跃单元周围的影响区域来进行,直到单个单元成为唯一的响应神经元为止。 给定输入模式。 +自组织映射是 Willshaw 和 Von Der Malsburg 首次提出的模型(在《如何通过自组织建立模式化的神经连接》中),目的是找到一种描述大脑中发生的不同现象的方法。 许多动物 实际上,他们观察到大脑的某些区域可以发展出内部组织的结构,这些结构的子组件相对于特定的输入模式(例如,某些视觉皮层区域对垂直或水平带非常敏感)可以选择性地接受。 SOM 的中心思想可以通过考虑聚类过程来综合,该聚类过程旨在找出样本的低级属性,这要归功于其对聚类的分配。 主要的实际差异是,在 SOM 中,单个单元通过称为**赢家通吃**的学习过程,成为一部分样本总体(即数据生成过程的区域)的代表。 。 这样的训练过程首先是引起所有单元(我们将其称为神经元)的响应并增强所有权重,然后通过减小最活跃单元周围的影响区域来进行,直到单个单元成为唯一的响应神经元为止。 给定输入模式。 下图综合了该过程: @@ -758,19 +758,19 @@ SOM 开发的墨西哥帽选择性 在初始步骤中,许多单元会响应相同的输入模式,但是我们已经可以观察到`x[i]`附近的优势。 但是,立即选择此设备可能会导致收敛过早,从而导致准确性下降。 这就是为什么获胜单位周围的半径逐渐减小的原因(观察到一种称为**墨西哥帽**的现象,因为其形状特殊)。 当然,在此过程中,最初的获胜单位无法保持稳定; 因此,重要的是要避免半径的快速减小,以免引起其他潜在单位被引出。 当呈现特定模式时,当神经元保持最活跃时,它将被略微转换为实际的赢家,因此,这将花费全部,因为不会再加强任何其他单元。 -一些非常著名和有用的 SOM 是 **Kohonen 映射**(首次出现在*拓扑正确特征图的自组织形成, Kohonen T。,生物控制论,[HTG5 [1982 年 1 月 43 日]。 它们的结构像投影到由`N`神经元组成的二维流形(最经典的情况是平坦的二维区域)上的平面一样。 从现在开始,为简单起见,我们将考虑映射到包含 *k×p* 单位的矩阵的曲面,每个曲面均使用突触权重 *w [ij] ∈model 进行建模^n* (尺寸与输入模式相同, *x [i] ∈^n* )。 因此,权重矩阵变为 *W(i,j)∈^(k ×p×n)* 。 从实际的角度来看,在此模型中,由于不执行内部转换,因此神经元通过相应的权重向量表示。 当呈现模式`x[i]`时,获胜神经元`n[w]`(作为元组)的确定如下: 使用以下规则:* +一些非常著名和有用的 SOM 是 **Kohonen 映射**(首次出现在《拓扑正确特征图的自组织形成》)。 它们的结构像投影到由`N`神经元组成的二维流形(最经典的情况是平坦的二维区域)上的平面一样。 从现在开始,为简单起见,我们将考虑映射到包含`k×p`单位的矩阵的曲面,每个曲面均使用突触权重`w[ij] ∈ R^n`进行建模 (尺寸与输入模式相同,`x[i] ∈ R^n`)。 因此,权重矩阵变为`W(i, j) ∈ R^(k×p×n)`。 从实际的角度来看,在此模型中,由于不执行内部转换,因此神经元通过相应的权重向量表示。 当呈现模式`x[i]`时,获胜神经元`n[w]`(作为元组)的确定如下: 使用以下规则:* ![](img/1d22e1e2-5d4d-472e-90eb-af603c0116eb.png) -训练过程通常分为两个不同的阶段:**调整**和**收敛**。 在调整阶段,更新会扩展到获胜单位的所有邻居,而在后者期间,只会增强权重 *W(n [w] )* 。 但是,平滑而渐进的下降比快速下降更可取; 因此, *n [s] (i,j)*的邻域大小的常见选择是基于**径向基函数**(**RBF**)具有指数衰减的方差: +训练过程通常分为两个不同的阶段:**调整**和**收敛**。 在调整阶段,更新会扩展到获胜单位的所有邻居,而在后者期间,只会增强权重`W(n[w])`。 但是,平滑而渐进的下降比快速下降更可取; 因此, `n[s](i, j)`的邻域大小的常见选择是基于**径向基函数**(**RBF**)具有指数衰减的方差: ![](img/1cc30811-63e7-4ceb-a338-df23c28ca834.png) -初始方差(与最大邻域成比例)为`x[i]`,并且根据时间常数*τ*呈指数衰减。 根据经验,当 *t >4τ*时,*σ(t)≈0* ,因此 *τ*应该设置为 1/4 调整阶段的训练时期数的:*τ= 0.25•t [adj]* 。 一旦定义了邻域,就可以根据它们与每个样本的不相似性来更新所有成员的权重,`x[i]`: +初始方差(与最大邻域成比例)为`x[i]`,并且根据时间常数`τ`呈指数衰减。 根据经验,当`t > 4τ`时,`σ(t) ≈ 0`,因此`τ`应该设置为 1/4 调整阶段的训练时期数:`τ = 0.25•t[adj]`。 一旦定义了邻域,就可以根据它们与每个样本的不相似性来更新所有成员的权重,`x[i]`: ![](img/13a00879-7f4e-4444-a3e9-7cb93b92e001.png) -在先前的公式中,学习率*η(t)*也是训练时期的函数,因为最好在早期(尤其是在调整阶段)施加更大的灵活性 ,但最好在收敛阶段设置较小的 *η*,以便进行较小的修改。 降低学习率的一个非常常见的选择类似于邻域大小: +在先前的公式中,学习率`η(t)`也是训练时期的函数,因为最好在早期(尤其是在调整阶段)施加更大的灵活性 ,但最好在收敛阶段设置较小的`η`,以便进行较小的修改。 降低学习率的一个非常常见的选择类似于邻域大小: ![](img/d9a02b2e-3f25-46de-abc6-0030f3866ecc.png) @@ -799,7 +799,7 @@ np.random.shuffle(Xcomplete) X = Xcomplete[0:100] ``` -现在,让我们为距离函数*σ(t)*的方差以及学习率*η(t)* 定义指数衰减函数,如下所示[ : +现在,让我们为距离函数的方差`σ(t)`以及学习率`η(t)`定义指数衰减函数,如下所示[ : ```py import numpy as np @@ -811,13 +811,13 @@ def sigma(t): return float(sigma0) * np.exp(-float(t) / tau) ``` -在该示例中,我们采用初始学习率*η(0)= 1* ,半径方差*σ(0)= 3* 。 之所以选择时间常数等于 100,是因为我们计划执行 500 个调整迭代和`500`收敛迭代(`1000`总迭代)。 在以下代码段中声明了相应的值: +在该示例中,我们采用初始学习率`η(0) = 1`,半径方差`σ(0) = 3`* 。 之所以选择时间常数等于 100,是因为我们计划执行 500 个调整迭代和`500`收敛迭代(`1000`总迭代)。 在以下代码段中声明了相应的值: ```py nb_iterations = 1000 nb_adj_iterations = 500 ``` -在这一点上,我们可以基于[定义权重矩阵(初始化为 *w [ij] 〜N(0,0.01* ))和负责计算获胜单位的函数。 HTG4] L [2] 的差值 *w-x* 的范数,如下所示: +在这一点上,我们可以基于差值`w-x`的 L2 范数定义权重矩阵(初始化为`w[ij] ~ N(0, 0.01)`)和负责计算获胜单位的函数,如下所示: ```py import numpy as np @@ -831,7 +831,7 @@ def winning_unit(xt): return int(np.floor(max_activation_unit / matrix_side)), max_activation_unit % matrix_side ``` -在开始训练周期之前,预先计算距离矩阵 *dm(x [0] ,y [0] ,x [1] ,y [1] )*,其中每个元素代表(( *x [0] ,y [0]* )和( *x [1] , [1]* )。 如以下片段所示,此步骤避免了必须确定获胜单位的邻域时的计算开销: +在开始训练周期之前,预先计算距离矩阵`dm(x[0], y[0], x[1], y[1])`,其中每个元素代表`(x[0], y[0])`和`(x[1], y[1])`。 如以下片段所示,此步骤避免了必须确定获胜单位的邻域时的计算开销: ```py import numpy as np @@ -888,7 +888,7 @@ for e in range(nb_iterations): 在每个循环中,执行以下步骤: 1. 为了避免相互关联,对输入样本的顺序进行了混洗。 -2. 计算学习率和距离方差(收敛值为*η[∞] = 0.2* 和*σ[∞] = 1* )。 +2. 计算学习率和距离方差(收敛值为`η[∞] = 0.2`和`σ[∞] = 1`)。 3. 对于每个样本,适用以下条件: 1. 计算获胜单位。 2. 计算距离矩阵。 @@ -924,11 +924,11 @@ SOM 是基于大脑特定区域功能的结构,该结构迫使其特定单元 1. 在 GAN 中,生成器和判别器的作用与自编码器中的编码器和解码器相同。 它是否正确? -2. 判别器能否输出*(-1,1)*范围内的值? +2. 判别器能否输出`(-1, 1)`范围内的值? 3. GAN 的问题之一是判别器过早收敛。 这个正确吗? 4. 在 Wasserstein GAN 中,批评家(区分者)在训练阶段是否比生成器慢? 5. 考虑到前面的问题,不同速度的原因是什么? -6. *U(-1,0)*和 *U`(1, 2)`*之间的 Jensen-Shannon 散度值是多少? +6. `U(-1, 0)`和`U(1, 2)`之间的 Jensen-Shannon 散度值是多少? 7. 赢家通吃战略的目标是什么? 8. SOM 训练过程的调整阶段的目的是什么? -- GitLab