From 325a9ed7c93b5f8c63a8dd826bf2e6f4a4a47164 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Tue, 5 Jan 2021 21:33:00 +0800 Subject: [PATCH] 2021-01-05 21:33:00 --- new/adv-dl-tf2-keras/04.md | 18 +++++++++--------- new/adv-dl-tf2-keras/05.md | 20 ++++++++++---------- new/adv-dl-tf2-keras/06.md | 2 +- new/adv-dl-tf2-keras/08.md | 2 +- new/handson-dl-arch-py/1.md | 2 +- new/handson-dl-arch-py/6.md | 2 +- new/handson-dl-arch-py/8.md | 2 +- new/handson-py-dl-web/02.md | 12 ++++++------ 8 files changed, 30 insertions(+), 30 deletions(-) diff --git a/new/adv-dl-tf2-keras/04.md b/new/adv-dl-tf2-keras/04.md index 61070a0a..4cb420a8 100644 --- a/new/adv-dl-tf2-keras/04.md +++ b/new/adv-dl-tf2-keras/04.md @@ -116,18 +116,18 @@ GAN 的基本概念很简单。 但是,我们将发现的一件事是,最具 DCGAN 实施以下设计原则: * 使用`stride > 1`和卷积代替`MaxPooling2D`或`UpSampling2D`。 通过`stride > 1`,CNN 可以学习如何调整特征图的大小。 -* 避免使用`Dense`层。 在所有层中使用 CNN。 `Dense`层仅用作生成器的第一层以接受 z 矢量。 调整`Dense`层的输出大小,并成为后续 C​​NN 层的输入。 +* 避免使用`Dense`层。 在所有层中使用 CNN。 `Dense`层仅用作生成器的第一层以接受`z`矢量。 调整`Dense`层的输出大小,并成为后续 C​​NN 层的输入。 * 使用**批量归一化**(**BN**),通过将每一层的输入归一化以使均值和单位方差为零,来稳定学习。 发电机输出层和判别器输入层中没有 BN。 在此处要介绍的实现示例中,没有在标识符中使用批量归一化。 * **整流线性单元**(**ReLU**)在发生器的所有层中均使用,但在输出层中则使用`tanh`激活。 在此处要介绍的实现示例中,在生成器的输出中使用`sigmoid`代替`tanh`,因为通常会导致对 MNIST 数字进行更稳定的训练。 * 在判别器的所有层中使用 **Leaky ReLU**。 与 ReLU 不同,Leaky ReLU 不会在输入小于零时将所有输出清零,而是生成一个等于`alpha x input`的小梯度。 在以下示例中,`alpha = 0.2`。 生成器学习从 100 维输入矢量(`[-1.0,1.0]`范围内具有均匀分布的 100 维随机噪声)生成伪图像。 判别器将真实图像与伪图像分类,但是在训练对抗网络时无意中指导生成器如何生成真实图像。 在我们的 DCGAN 实现中使用的内核大小为 5。这是为了允许它增加卷积的接收场大小和表达能力。 -生成器接受由-1.0 到 1.0 范围内的均匀分布生成的 100 维`z`-向量。 生成器的第一层是 7 x 7 x 128 = 6,272 单位的密集层。 基于输出图像的预期最终尺寸(28 x 28 x 1,28 是 7 的倍数)和第一个`Conv2DTranspose`的滤镜数量(等于 128)来计算单位数量。 +生成器接受由 -1.0 到 1.0 范围内的均匀分布生成的 100 维`z`向量。 生成器的第一层是`7 x 7 x 128 = 6,272`单位的密集层。 基于输出图像的预期最终尺寸(`28 x 28 x 1`,28 是 7 的倍数)和第一个`Conv2DTranspose`的滤镜数量(等于 128)来计算单位数量。 我们可以将转置的 CNN(`Conv2DTranspose`)想象成 CNN 的逆过程。 在一个简单的示例中,如果 CNN 将图像转换为特征图,则转置的 CNN 将生成给定特征图的图像。 因此,转置的 CNN 在上一章的解码器中和本章的生成器中使用。 -在对`strides = 2`进行两个`Conv2DTranspose`之后,特征图的大小将为`28 x 28 x n_filter`。 每个`Conv2DTranspose`之前都有批量规范化和 ReLU。 最后一层具有 *Sigmoid* 激活,可生成 28 x 28 x 1 假 MNIST 图像。 将每个像素标准化为与`[0, 255]`灰度级相对应的`[0.0, 1.0]`。 下面的“列表 4.2.1”显示了`tf.keras`中生成器网络的实现。 定义了一个函数来生成生成器模型。 由于整个代码的长度,我们将列表限制为正在讨论的特定行。 +在对`strides = 2`进行两个`Conv2DTranspose`之后,特征图的大小将为`28 x 28 x n_filter`。 每个`Conv2DTranspose`之前都有批量规范化和 ReLU。 最后一层具有 *Sigmoid* 激活,可生成`28 x 28 x 1`假 MNIST 图像。 将每个像素标准化为与`[0, 255]`灰度级相对应的`[0.0, 1.0]`。 下面的“列表 4.2.1”显示了`tf.keras`中生成器网络的实现。 定义了一个函数来生成生成器模型。 由于整个代码的长度,我们将列表限制为正在讨论的特定行。 [完整的代码可在 GitHub 上获得](https://github.com/PacktPublishing/Advanced-Deep-Learning-with-Keras)。 @@ -192,9 +192,9 @@ def build_generator(inputs, image_size): return generator ``` -判别器与相似,是许多基于 CNN 的分类器。 输入是 28 x 28 x 1 MNIST 图像,分类为真实(1.0)或伪(0.0)。 有四个 CNN 层。 除了最后的卷积,每个`Conv2D`都使用`strides = 2`将特征图下采样两个。 然后每个`Conv2D`之前都有一个泄漏的 ReLU 层。 最终的过滤器大小为 256,而初始的过滤器大小为 32,并使每个卷积层加倍。 最终的过滤器大小 128 也适用。 但是,我们会发现生成的图像在 256 的情况下看起来更好。最终输出层被展平,并且在通过 S 型激活层缩放后,单个单元`Dense`层在 0.0 到 1.0 之间生成预测。 输出被建模为伯努利分布。 因此,使用了二进制交叉熵损失函数。 +判别器与相似,是许多基于 CNN 的分类器。 输入是`28 x 28 x 1`MNIST 图像,分类为真实(1.0)或伪(0.0)。 有四个 CNN 层。 除了最后的卷积,每个`Conv2D`都使用`strides = 2`将特征图下采样两个。 然后每个`Conv2D`之前都有一个泄漏的 ReLU 层。 最终的过滤器大小为 256,而初始的过滤器大小为 32,并使每个卷积层加倍。 最终的过滤器大小 128 也适用。 但是,我们会发现生成的图像在 256 的情况下看起来更好。最终输出层被展平,并且在通过 Sigmoid 激活层缩放后,单个单元`Dense`层在 0.0 到 1.0 之间生成预测。 输出被建模为伯努利分布。 因此,使用了二进制交叉熵损失函数。 -建立生成器和判别器模型后,通过将生成器和判别器网络连接起来,建立对抗模型。 鉴别网络和对抗网络都使用 RMSprop 优化器。 判别器的学习率是 2e-4,而对抗网络的学习率是 1e-4。 判别器的 RMSprop 衰减率为 6e-8,对抗网络的 RMSprop 衰减率为 3e-8。 +建立生成器和判别器模型后,通过将生成器和判别器网络连接起来,建立对抗模型。 鉴别网络和对抗网络都使用 RMSprop 优化器。 判别器的学习率是`2e-4`,而对抗网络的学习率是`1e-4`。 判别器的 RMSprop 衰减率为`6e-8`,对抗网络的 RMSprop 衰减率为`3e-8`。 将对手的学习率设置为判别器的一半将使训练更加稳定。 您会从“图 4.1.3”和“图 4.1.4”中回忆起,GAN 训练包含两个部分:判别器训练和生成器训练,这是冻结判别器权重的对抗训练。 @@ -456,7 +456,7 @@ def train(models, x_train, params): 使用与上一节相同的 GAN ,会对生成器和判别器输入都施加一个条件。 条件是数字的一键向量形式。 这与要生成的图像(生成器)或分类为真实或伪造的图像(判别器)相关。 CGAN 模型显示在“图 4.3.1”中。 -CGAN 与 DCGAN 相似,除了附加的一键式矢量输入。 对于生成器,单热标签在`Dense`层之前与潜矢量连接在一起。 对于判别器,添加了新的`Dense`层。 新层用于处理一个热向量并对其进行整形,以使其适合于与后续 CNN 层的另一个输入串联。 +CGAN 与 DCGAN 相似,除了附加的单热矢量输入。 对于生成器,单热标签在`Dense`层之前与潜矢量连接在一起。 对于判别器,添加了新的`Dense`层。 新层用于处理一个热向量并对其进行整形,以使其适合于与后续 CNN 层的另一个输入串联。 ![](img/B14853_04_07.png) @@ -466,7 +466,7 @@ CGAN 与 DCGAN 相似,除了附加的一键式矢量输入。 对于生成器 CGAN 的基础仍然与原始 GAN 原理相同,区别在于判别器和生成器的输入均以“一热”标签`y`为条件。 -通过在“公式 4.1.1”和“公式 4.1.5”中合并此条件,判别器和发生器的损耗函数在“公式 4.3.1”中显示 ]和“公式 4.3.2”分别为: +通过在“公式 4.1.1”和“公式 4.1.5”中合并此条件,判别器和发生器的损耗函数在“公式 4.3.1”和“公式 4.3.2”中显示,分别为: ![](img/B14853_04_018.png) (Equation 4.3.1) @@ -555,7 +555,7 @@ def build_discriminator(inputs, labels, image_size): return discriminator ``` -以下“列表 4.3.2”突出显示了代码更改,以在生成器生成器函数中合并条件化一键式标签。 对于`z`-向量和单热向量输入,修改了`Model`实例。 +以下“列表 4.3.2”突出显示了代码更改,以在生成器生成器函数中合并条件化单热标签。 对于`z`向量和单热向量输入,修改了`Model`实例。 “列表 4.3.2”:`cgan-mnist-4.3.1.py` @@ -752,7 +752,7 @@ def train(models, data, params): ![](img/B14853_04_10.png) -图 4.3.4:使用标签[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5]对 CGAN 在不同训练步骤中生成的伪造图像 +图 4.3.4:使用标签`[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5]`对 CGAN 在不同训练步骤中生成的伪造图像 鼓励您运行经过训练的生成器模型,以查看新的合成 MNIST 数字图像: diff --git a/new/adv-dl-tf2-keras/05.md b/new/adv-dl-tf2-keras/05.md index 2642cae3..919bcdb2 100644 --- a/new/adv-dl-tf2-keras/05.md +++ b/new/adv-dl-tf2-keras/05.md @@ -6,7 +6,7 @@ 正如我们在前几章中讨论的那样,众所周知,GAN 很难训练,并且易于崩溃。 模式损耗是一种情况,即使损失函数已经被优化,但发生器仍会产生看起来相同的输出。 在 MNIST 数字的情况下,模式折叠时,生成器可能只产生数字 4 和 9,因为看起来很相似。 **Wasserstein GAN**(**WGAN**)[2]解决了这些问题,认为只需替换基于 **Wasserstein** 的 GAN 损失函数就可以稳定的训练和避免模式崩溃,也称为**陆地移动距离**(**EMD**)。 -但是,稳定性问题并不是 GAN 的唯一问题。 也越来越需要来提高所生成图像的感知质量。 **最小二乘 GAN**(**LSGAN**)[3]建议同时解决这两个问题。 基本前提是,在训练过程中,S 形交叉熵损失会导致梯度消失。 这导致较差的图像质量。 最小二乘损失不会导致梯度消失。 与香草 GAN 生成的图像相比,生成的生成图像具有更高的感知质量。 +但是,稳定性问题并不是 GAN 的唯一问题。 也越来越需要来提高所生成图像的感知质量。 **最小二乘 GAN**(**LSGAN**)[3]建议同时解决这两个问题。 基本前提是,在训练过程中,Sigmoid 交叉熵损失会导致梯度消失。 这导致较差的图像质量。 最小二乘损失不会导致梯度消失。 与香草 GAN 生成的图像相比,生成的生成图像具有更高的感知质量。 在上一章中,CGAN 介绍了一种调节发电机输出的方法。 例如,如果要获取数字 8,则可以在生成器的输入中包含条件标签。 受 CGAN 的启发,**辅助分类器 GAN**(**ACGAN**)[4]提出了一种改进的条件算法,可产生更好的感知质量和输出多样性。 @@ -67,7 +67,7 @@ EMD 背后的想法是,它是为了确定概率分布`p_data`应由![](img/B14 图 5.1.1:EMD 是从`x`传输以匹配目标分布`y`的质量的加权数量。 -在位置`i = 1, 2, 3, 4`上,`x`在具有质量`m[i], i = 1, 2, 3, 4`。同时,位置`y[i], i = 1, 2`上,`y`的质量为`m[i], i = 1, 2`。匹配分布 *y [HTG29 图中的箭头显示了将每个质量`x[i]`移动`d[i]`的最小运输计划。 EMD 计算如下: +在位置`i = 1, 2, 3, 4`上,`x`在具有质量`m[i], i = 1, 2, 3, 4`。同时,位置`y[i], i = 1, 2`上,`y`的质量为`m[i], i = 1, 2`。为了匹配分布`y`,图中的箭头显示了将每个质量`x[i]`移动`d[i]`的最小运输计划。 EMD 计算如下: ![](img/B14853_05_014.png) (Equation 5.1.4) @@ -146,7 +146,7 @@ EMD 背后的想法是,它是为了确定概率分布`p_data`应由![](img/B14 ![](img/B14853_05_056.png) (Equation 5.1.17) -对于所有![](img/B14853_05_057.png)。 K-Lipschitz 函数具有有界导数,并且几乎总是连续可微的(例如,![](img/B14853_05_058.png)具有有界导数并且是连续的,但在`x`= 0 时不可微分)。 +对于所有![](img/B14853_05_057.png)。 K-Lipschitz 函数具有有界导数,并且几乎总是连续可微的(例如,![](img/B14853_05_058.png)具有有界导数并且是连续的,但在`x = 0`时不可微分)。 “公式 5.1.16”可以通过找到 K-Lipschitz 函数![](img/B14853_05_059.png)的族来求解: @@ -228,7 +228,7 @@ EMD 背后的想法是,它是为了确定概率分布`p_data`应由![](img/B14 训练生成器后,将解冻判别器参数,并开始另一个`n_critic`判别器训练迭代。 我们应该注意,在判别器训练期间不需要冻结生成器参数,因为生成器仅涉及数据的制造。 类似于 GAN,可以将判别器训练为一个单独的网络。 但是,训练发电机始终需要鉴别者通过对抗网络参与,因为损失是根据发电机网络的输出计算得出的。 -与 GAN 不同,在 WGAN 中,将实际数据标记为 1.0,而将伪数据标记为-1.0,作为计算第 5 行中的梯度的一种解决方法。第 5-6 和 10-11 行执行梯度更新以优化“公式 5.1.21”和“5.1.22”。 第 5 行和第 10 行中的每一项均建模为: +与 GAN 不同,在 WGAN 中,将实际数据标记为 1.0,而将伪数据标记为 -1.0,作为计算第 5 行中的梯度的一种解决方法。第 5-6 和 10-11 行执行梯度更新以优化“公式 5.1.21”和“5.1.22”。 第 5 行和第 10 行中的每一项均建模为: ![](img/B14853_05_091.png) (Equation 5.1.23) @@ -243,7 +243,7 @@ def wasserstein_loss(y_label, y_pred): 本节最重要的部分是用于稳定训练 GAN 的新损失函数。 它基于 EMD 或 Wasserstein1。“算法 5.1.1”形式化了 WGAN 的完整训练算法,包括损失函数。 在下一节中,将介绍`tf.keras`中训练算法的实现。 -## 使用 Hard 的 WGAN 实现 +## 使用 Keras 的 WGAN 实现 为了在`tf.keras`中实现 WGAN,我们可以重用 GAN 的 DCGAN 实现,这是我们在上一一章中介绍的。 DCGAN 构建器和实用程序功能在`lib`文件夹的`gan.py`中作为模块实现。 @@ -518,11 +518,11 @@ WGAN 提出通过使用 EMD 或 Wasserstein 1 损失函数来解决该问题, # 2.最小二乘 GAN(LSGAN) -LSGAN 提出最小二乘损失。“图 5.2.1”演示了为什么在 GAN 中使用 S 形交叉熵损失会导致生成的数据质量较差: +LSGAN 提出最小二乘损失。“图 5.2.1”演示了为什么在 GAN 中使用 Sigmoid交叉熵损失会导致生成的数据质量较差: ![](img/B14853_05_06.png) -图 5.2.1:真实样本和虚假样本分布均除以各自的决策边界:S 形和最小二乘 +图 5.2.1:真实样本和虚假样本分布均除以各自的决策边界:Sigmoid 和最小二乘 理想情况下,假样本分布应尽可能接近真实样本的分布。 但是,对于 GAN,一旦伪样本已经位于决策边界的正确一侧,梯度就消失了。 @@ -688,7 +688,7 @@ ACGAN 在原理上类似于我们在上一章中讨论的**条件 GAN**(**CGAN 表 5.3.1:CGAN 和 ACGAN 损失函数之间的比较 -ACGAN 损失函数与 CGAN 相同,除了附加的分类器损失函数。 除了从假图片中识别真实图像的原始任务(HTG1)之外,判别器的“公式 5.3.1”还具有对真假图像(HTG4)正确分类的附加任务。 生成器的“公式 5.3.2”意味着,除了尝试用伪造的图像来欺骗判别器(![](img/B14853_05_108.png))之外,它还要求判别器正确地对那些伪造的图像进行分类(![](img/B14853_05_109.png))。 +ACGAN 损失函数与 CGAN 相同,除了附加的分类器损失函数。 除了从假图片中识别真实图像的原始任务之外,判别器的“公式 5.3.1”还具有对真假图像正确分类的附加任务。 生成器的“公式 5.3.2”意味着,除了尝试用伪造的图像来欺骗判别器(![](img/B14853_05_108.png))之外,它还要求判别器正确地对那些伪造的图像进行分类(![](img/B14853_05_109.png))。 从 CGAN 代码开始,仅修改判别器和训练功能以实现 ACGAN。 `gan.py`还提供了判别器和生成器构建器功能。 要查看判别器上所做的更改,清单 5.3.1 显示了构建器功能,其中突出显示了执行图像分类的辅助解码器网络和双输出。 @@ -888,7 +888,7 @@ generator = gan.generator(inputs, image_size, labels=labels) ![](img/B14853_05_09.png) -图 5.3.2:ACGAN 的 tf.keras 模型 +图 5.3.2:ACGAN 的`tf.keras`模型 如“列表 5.3.3”所示,对判别器和对抗模型进行了修改,以适应判别器网络中的更改。 现在,我们有两个损失函数。 首先是原始的二进制交叉熵,用于训练判别器来估计输入图像为实的概率。 @@ -1141,7 +1141,7 @@ def train(models, data, params): ![](img/B14853_05_10.png) -图 5.3.3:ACGAN 根据标签的训练步骤生成的示例输出[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5] +图 5.3.3:ACGAN 根据标签的训练步骤生成的示例输出`[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5]` 使用训练有素的生成器模型,通过运行以下命令来生成新的合成 MNIST 数字图像: diff --git a/new/adv-dl-tf2-keras/06.md b/new/adv-dl-tf2-keras/06.md index fb7166ce..ba6d8b9a 100644 --- a/new/adv-dl-tf2-keras/06.md +++ b/new/adv-dl-tf2-keras/06.md @@ -2,7 +2,7 @@ # 纠缠表示 GAN -正如我们已经探索的那样,GAN 可以通过学习数据分布来产生有意义的输出。 但是,无法控制所生成输出的属性。 GAN 的一些变体,例如**条件 GAN**(**CGAN**)和**辅助分类器 GAN**(**ACGAN**),如 前两章都可以训练生成器,该生成器可以合成特定的输出。 例如,CGAN 和 ACGAN 都可以诱导生成器生成特定的 MNIST 数字。 这可以通过同时使用 100 维噪声代码和相应的一号热标签作为输入来实现。 但是,除了一键式标签外,我们没有其他方法可以控制生成的输出的属性。 +正如我们已经探索的那样,GAN 可以通过学习数据分布来产生有意义的输出。 但是,无法控制所生成输出的属性。 GAN 的一些变体,例如**条件 GAN**(**CGAN**)和**辅助分类器 GAN**(**ACGAN**),如 前两章都可以训练生成器,该生成器可以合成特定的输出。 例如,CGAN 和 ACGAN 都可以诱导生成器生成特定的 MNIST 数字。 这可以通过同时使用 100 维噪声代码和相应的一号热标签作为输入来实现。 但是,除了单热标签外,我们没有其他方法可以控制生成的输出的属性。 有关 CGAN 和 ACGAN 的评论,请参阅“第 4 章”,“生成对抗网络(GANs)”和“第 5 章”,“改进的 GANs”。 diff --git a/new/adv-dl-tf2-keras/08.md b/new/adv-dl-tf2-keras/08.md index 82253b9c..4a0d52e9 100644 --- a/new/adv-dl-tf2-keras/08.md +++ b/new/adv-dl-tf2-keras/08.md @@ -480,7 +480,7 @@ vae = Model(inputs, outputs, name='vae') “列表 8.2.1”突出显示了针对 MNIST 数字的 VAE 原始代码所做的更改。 编码器输入现在是原始输入图像及其单标签的串联。 解码器输入现在是潜在空间采样与其应生成的图像的一键热标签的组合。 参数总数为 174,437。 与![](img/B14853_08_117.png) -VAE 相关的代码将在本章下一节中讨论。 -损失功能没有改变。 但是,在训练,测试和结果绘制过程中会提供一键式标签。 +损失功能没有改变。 但是,在训练,测试和结果绘制过程中会提供单热标签。 “列表 8.2.1”:`cvae-cnn-mnist-8.2.1.py` diff --git a/new/handson-dl-arch-py/1.md b/new/handson-dl-arch-py/1.md index c1c2caf7..b12db2a4 100644 --- a/new/handson-dl-arch-py/1.md +++ b/new/handson-dl-arch-py/1.md @@ -154,7 +154,7 @@ ANN 由两个组件构建:节点和权重。 节点扮演神经元的角色, # 乙状结肠激活 -对于所有实数输入,此功能的输出范围从零到一。 这对于从神经元生成概率分数非常重要。 该函数也是连续且非线性的,有助于保持输出的非线性。 同样,曲线的梯度在原点附近陡峭,并且随着我们开始沿`x`轴移动而饱和。 这意味着,围绕原点的输入会发生微小变化,从而导致输出发生重大变化。 此特性有助于分类任务,因为它试图使输出保持接近零或一。 以下是针对输入`x`进行 S 形激活的方程式: +对于所有实数输入,此功能的输出范围从零到一。 这对于从神经元生成概率分数非常重要。 该函数也是连续且非线性的,有助于保持输出的非线性。 同样,曲线的梯度在原点附近陡峭,并且随着我们开始沿`x`轴移动而饱和。 这意味着,围绕原点的输入会发生微小变化,从而导致输出发生重大变化。 此特性有助于分类任务,因为它试图使输出保持接近零或一。 以下是针对输入`x`进行 Sigmoid激活的方程式: ![](img/9a4c25fc-874f-4b01-974a-9706c0615bb5.png) diff --git a/new/handson-dl-arch-py/6.md b/new/handson-dl-arch-py/6.md index c4170c14..adbb60b9 100644 --- a/new/handson-dl-arch-py/6.md +++ b/new/handson-dl-arch-py/6.md @@ -442,7 +442,7 @@ LSTM 的架构的神奇之处在于:在普通循环单元的顶部,增加了 * 将在时间步`t`处输入门`i`的输出计算为![](img/02cc7c8f-f9cc-4bbd-9829-51537291a0f0.png)。 * 将在时间步`t`处的 tanh 激活`c'`的输出计算为![](img/438dd210-3f36-4e25-a625-a95ab8da7b02.png)。 * 在时间步`t`处的输出门`o`的输出被计算为![](img/57472460-64d3-48e7-8fb8-af2371057ee6.png)。 -* 在时间步`t`处的存储单元![](img/1fb2797f-7135-4aba-beb0-9fcea0fe85fb.png)由![](img/01cf9cf7-8de2-40fc-960e-ce2e0d9d4936.png)更新,其中`.*`表示逐元素乘法。 值得注意的是,`f`和`i`中的 S 形函数将其输出转换为从`0`到`1`的范围,从而控制比例 分别通过的先前存储器![](img/ad6a46d8-ac93-42e3-96bf-e6fe22a527b2.png)和当前存储器输入![](img/4cdd81a2-72c9-43c4-b602-f9c112dc22b9.png)的数据。 +* 在时间步`t`处的存储单元![](img/1fb2797f-7135-4aba-beb0-9fcea0fe85fb.png)由![](img/01cf9cf7-8de2-40fc-960e-ce2e0d9d4936.png)更新,其中`.*`表示逐元素乘法。 值得注意的是,`f`和`i`中的 Sigmoid函数将其输出转换为从`0`到`1`的范围,从而控制比例 分别通过的先前存储器![](img/ad6a46d8-ac93-42e3-96bf-e6fe22a527b2.png)和当前存储器输入![](img/4cdd81a2-72c9-43c4-b602-f9c112dc22b9.png)的数据。 * 最后,在时间步`t`的隐藏状态![](img/c4c7aecc-d631-4158-82cd-b718759d5e5d.png)被更新为![](img/4f00cc4c-ed31-48a5-932b-9590c070e0dd.png)。 同样,`o`确定用作整个单元输出的更新存储单元![](img/8a8220aa-1249-47c5-a5a9-481a95a274e2.png)的比例。 使用随时间的反向传播训练所有四组权重`U`和`W`,这与香草 RNN 相同。 通过学习三个信息门的权重,网络显式地对长期依赖关系进行建模。 接下来,我们将利用 LSTM 架构并发明更强大的文本生成器。 diff --git a/new/handson-dl-arch-py/8.md b/new/handson-dl-arch-py/8.md index a640106c..f88f8c24 100644 --- a/new/handson-dl-arch-py/8.md +++ b/new/handson-dl-arch-py/8.md @@ -356,7 +356,7 @@ The predictions for the notMNIST example are: [2.0, 5.0, 2.0, 2.0, 2.0, 2.0, 2.0 此后,下一步是执行加权和,这听起来很熟悉。 在传统的神经元中,权重是通过反向传播进行优化和计算的。 但是,在捕获中使用**动态路由**学习权重。 动态路由的主要思想是使用多数表决来确定最可能的对象应该喜欢什么。 接近真实预测的向量的权重`c`应具有较高的值,与远离正确预测的向量相对应的权重`c`应具有较低的值。 -最后,胶囊中的激活功能也是新的东西。 回想一下,在传统的神经元中,典型的激活函数包括 S 形,tanh 和 ReLU,其主要目的是增加非线性并重新调整输入。 同样,对于胶囊,激活函数的后半部分将输入向量的长度转换为 1,但不改变其方向; 激活函数的前半部分(称为**压缩**)进一步缩放长度,使其不等于 1,同时增加了一些非线性。 +最后,胶囊中的激活功能也是新的东西。 回想一下,在传统的神经元中,典型的激活函数包括 Sigmoid,tanh 和 ReLU,其主要目的是增加非线性并重新调整输入。 同样,对于胶囊,激活函数的后半部分将输入向量的长度转换为 1,但不改变其方向; 激活函数的前半部分(称为**压缩**)进一步缩放长度,使其不等于 1,同时增加了一些非线性。 这就是胶囊中计算的工作方式。 总而言之,胶囊网络采用功能强大的表示形式-向量-对不同层上重要的特征层次信息进行编码,这在使用标量的传统 CNN 中不可用。 最后但并非最不重要的一点是,如果您对自己实现胶囊网络感兴趣,请随时查看有关 Keras 和 CapsLayer 的以下链接: diff --git a/new/handson-py-dl-web/02.md b/new/handson-py-dl-web/02.md index f63cf68e..aa5bc2d3 100644 --- a/new/handson-py-dl-web/02.md +++ b/new/handson-py-dl-web/02.md @@ -106,9 +106,9 @@ ![](img/c67899b6-21c7-48ed-adf3-4fd1efd01d29.png) -前两个图使我们清楚地了解了两个函数的内在本质。 绝对清楚的是,S 形函数比阶跃函数对非线性更为敏感。 +前两个图使我们清楚地了解了两个函数的内在本质。 绝对清楚的是,Sigmoid函数比阶跃函数对非线性更为敏感。 -除 S 形函数外,以下是一些众所周知的常用函数,这些函数使神经元具有非线性特征: +除 Sigmoid函数外,以下是一些众所周知的常用函数,这些函数使神经元具有非线性特征: * h * 恢复 @@ -189,15 +189,15 @@ ![](img/20a23d3e-6c8c-44ac-874b-3e088653fec9.png) -在这里,`Z^(1)`是我们对下一层神经元的最终输出。 注意,将 S 形函数应用于![](img/ad7faaaf-0c2c-4576-92b4-6b1cf41f2489.png)矩阵的每个元素。 最终矩阵的尺寸为 10 X 3,其中每一行用于训练集中的每个实例,每一列用于第一隐藏层的每个神经元。 +在这里,`Z^(1)`是我们对下一层神经元的最终输出。 注意,将 Sigmoid函数应用于![](img/ad7faaaf-0c2c-4576-92b4-6b1cf41f2489.png)矩阵的每个元素。 最终矩阵的尺寸为 10 X 3,其中每一行用于训练集中的每个实例,每一列用于第一隐藏层的每个神经元。 我们看到的整个计算没有我们最初谈到的偏差项`b`。 好吧,这只是在图片中添加另一个维度的问题。 在那种情况下,在我们将 sigmoid 函数应用于![](img/2f62dd1e-ca80-4973-a7da-b0b7622410bc.png)矩阵的每个元素之前,矩阵本身将被更改为以下形式: ![](img/541cba3d-b30e-416a-8eac-8a9b0ec6f6f1.png) -经过这个矩阵乘法处理后,应用了 S 形函数并将输出发送到下一层的神经元,整个过程对 NN 中的每个隐藏层和输出层重复。 在继续过程中,我们应该从输出层获取![](img/7ca8c778-786e-4432-b25f-0409a6d2ef8c.png)。 +经过这个矩阵乘法处理后,应用了 Sigmoid函数并将输出发送到下一层的神经元,整个过程对 NN 中的每个隐藏层和输出层重复。 在继续过程中,我们应该从输出层获取![](img/7ca8c778-786e-4432-b25f-0409a6d2ef8c.png)。 -S 形激活函数输出的值范围为 0-1,但是我们正在处理二进制分类问题,我们只希望 0 或 1 作为 NN 的最终输出。 我们可以稍作调整。 我们可以在 NN 的输出层定义一个阈值-对于小于 0.5 的值,应将其标识为 0 类,而对于大于或等于 0.5 的值应将其标识为 1 类。请注意,这是 称为前向通过或前向传播。 +Sigmoid激活函数输出的值范围为 0-1,但是我们正在处理二进制分类问题,我们只希望 0 或 1 作为 NN 的最终输出。 我们可以稍作调整。 我们可以在 NN 的输出层定义一个阈值-对于小于 0.5 的值,应将其标识为 0 类,而对于大于或等于 0.5 的值应将其标识为 1 类。请注意,这是 称为前向通过或前向传播。 我们刚刚看到的 NN 被称为前馈网络,在学习过程中没有进一步优化。 可是等等! 网络甚至学到什么? 嗯,NN 通常会学习权重和偏差项,以便最终输出尽可能准确。 梯度下降和反向传播会发生这种情况。 @@ -365,7 +365,7 @@ CNN 的核心是一个称为卷积的操作(在计算机视觉和图像处理 # 将信件输入网络 -在我们看到递归层如何产生输出之前,重要的是要学习如何将字母集提供给网络。 一键式编码使我们能够以非常有效的方式执行此操作: +在我们看到递归层如何产生输出之前,重要的是要学习如何将字母集提供给网络。 单热编码使我们能够以非常有效的方式执行此操作: ![](img/82595ac0-af4d-4777-8394-1939beb4c4b7.png) -- GitLab