From 6c69b9f8e90f1416b827558aeece61d6111d78af Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Thu, 13 Aug 2020 23:06:22 +0800 Subject: [PATCH] 2020-08-13 23:06:22 --- docs/tf-1x-dl-cookbook/00.md | 2 +- docs/tf-1x-dl-cookbook/01.md | 2 +- docs/tf-1x-dl-cookbook/03.md | 74 ++++++++++++++++++------------------ docs/tf-1x-dl-cookbook/04.md | 18 ++++----- docs/tf-1x-dl-cookbook/06.md | 2 +- docs/tf-1x-dl-cookbook/11.md | 12 +++--- docs/tf-1x-dl-cookbook/14.md | 4 +- 7 files changed, 57 insertions(+), 57 deletions(-) diff --git a/docs/tf-1x-dl-cookbook/00.md b/docs/tf-1x-dl-cookbook/00.md index c0bb3143..cc17a02c 100644 --- a/docs/tf-1x-dl-cookbook/00.md +++ b/docs/tf-1x-dl-cookbook/00.md @@ -10,7 +10,7 @@ “回归”讨论了回归及其应用。 我们将讨论回归所涉及的概念,了解回归与聚类和分类的不同之处。 我们将学习可能的不同类型的损失函数以及如何在 Tensorflow 中实现它们。 我们学习如何实现 L1 和 L2 正则化。 我们将讨论梯度下降算法,学习如何优化它并在 Tensorflow 中实现它。 我们将简要了解交叉熵函数及其实现。 -“神经网络感知器”,涵盖了人工神经网络,并解释了为什么它可以完成 DNN 最近声称的出色任务。 我们将学习激活功能的不同选择。 我们将使用所有这些来构建一个简单的感知器,并将其用于功能建模。 我们将在训练之前了解数据的正则化。 我们还将学习逐步构建多层感知器(MLP)。 我们将看到 TensorFlow 的自动区分器如何使我们的工作更轻松。 +“神经网络感知器”,涵盖了人工神经网络,并解释了为什么它可以完成 DNN 最近声称的出色任务。 我们将学习激活函数的不同选择。 我们将使用所有这些来构建一个简单的感知器,并将其用于功能建模。 我们将在训练之前了解数据的正则化。 我们还将学习逐步构建多层感知器(MLP)。 我们将看到 TensorFlow 的自动区分器如何使我们的工作更轻松。 “TensorFlow 卷积神经网络”,讨论了卷积的过程及其如何提取特征。 我们将学习 CNN 的三个重要层:卷积层,池化层和完全连接层。 我们还将学习辍学,如何提高性能以及不同的 CNN 架构(例如 LeNET 和 GoogleNET)。 diff --git a/docs/tf-1x-dl-cookbook/01.md b/docs/tf-1x-dl-cookbook/01.md index 6fe94cc2..b9d2854a 100644 --- a/docs/tf-1x-dl-cookbook/01.md +++ b/docs/tf-1x-dl-cookbook/01.md @@ -1089,7 +1089,7 @@ with tf.Session as sess: 4. **定义模型**:建立一个描述网络结构的计算图。 它涉及指定超参数,变量和占位符序列,其中信息从一组神经元流向另一组神经元,并传递损失/错误函数。 您将在本章的后续部分中了解有关计算图的更多信息。 -5. **训练/学习**:DNN 中的学习通常基于梯度下降算法,(将在第 2 章,*回归*中详细介绍) 目的是找到训练变量(权重/偏差),以使误差或损失(由用户在步骤 2 中定义)最小。 这是通过初始化变量并使用`run()`实现的: +5. **训练/学习**:DNN 中的学习通常基于梯度下降算法,(将在第 2 章,“回归”中详细介绍) 目的是找到训练变量(权重/偏差),以使误差或损失(由用户在步骤 2 中定义)最小。 这是通过初始化变量并使用`run()`实现的: ```py with tf.Session as sess: diff --git a/docs/tf-1x-dl-cookbook/03.md b/docs/tf-1x-dl-cookbook/03.md index 61420f32..f9c5ad0c 100644 --- a/docs/tf-1x-dl-cookbook/03.md +++ b/docs/tf-1x-dl-cookbook/03.md @@ -2,7 +2,7 @@ 自最近十年以来,神经网络一直处于机器学习研究和应用的最前沿。 **深层神经网络**(**DNN**),传递学习以及计算效率高的 GPU 的可用性已帮助在图像识别,语音识别甚至文本生成领域取得了重大进展。 在本章中,我们将专注于基本的神经网络感知器,即人工神经元的完全连接的分层体系结构。 本章将包括以下食谱: -* 激活功能 +* 激活函数 * 单层感知器 * 反向传播算法的梯度计算 * 使用 MLP 的 MNIST 分类器 @@ -14,9 +14,9 @@ 神经网络,通常也称为**连接器模型**,是受人脑启发的。 像人的大脑一样,神经网络是通过称为**权重**的突触强度相互连接的大量人工神经元的集合。 正如我们通过长辈提供给我们的示例进行学习一样,人工神经网络也可以通过作为训练数据集提供给他们的示例进行学习。 有了足够数量的训练数据集,人工神经网络可以概括信息,然后也可以将其用于看不见的数据。 太棒了,它们听起来像魔术! -神经网络并不是什么新鲜事物。 第一个神经网络模型 McCulloch Pitts(MCP)( [http://vordenker.de/ggphilosophy/mcculloch_a-ologic-calculus.pdf](http://vordenker.de/ggphilosophy/mcculloch_a-logical-calculus.pdf) )模型最早是在 1943 年提出的。 建造了第一台计算机!)该模型可以执行 AND / OR / NOT 之类的逻辑运算。 MCP 模型具有固定的权重和偏差; 没有学习的可能。 几年后,Frank Rosenblatt 在 1958 年解决了这个问题( [https://blogs.umass.edu/brain-wars/files/2016/03/rosenblatt-1957.pdf](https://blogs.umass.edu/brain-wars/files/2016/03/rosenblatt-1957.pdf) )。 他提出了第一个学习神经网络,称为 **Perceptron** 。 +神经网络并不是什么新鲜事物。 第一个神经网络模型 McCulloch Pitts(MCP)( [http://vordenker.de/ggphilosophy/mcculloch_a-ologic-calculus.pdf](http://vordenker.de/ggphilosophy/mcculloch_a-logical-calculus.pdf) )模型最早是在 1943 年提出的。 建造了第一台计算机!)该模型可以执行 AND / OR / NOT 之类的逻辑运算。 MCP 模型具有固定的权重和偏差; 没有学习的可能。 几年后,Frank Rosenblatt 在 1958 年解决了这个问题( [https://blogs.umass.edu/brain-wars/files/2016/03/rosenblatt-1957.pdf](https://blogs.umass.edu/brain-wars/files/2016/03/rosenblatt-1957.pdf) )。 他提出了第一个学习神经网络,称为**感知机**。 -从那时起,众所周知,添加多层神经元并建立一个深而密集的网络将有助于神经网络解决复杂的任务。 正如母亲为孩子的成就感到自豪一样,科学家和工程师对使用**神经网络**(**NN**)( [https:// www。 youtube.com/watch?v=jPHUlQiwD9Y](https://www.youtube.com/watch?v=jPHUlQiwD9Y) )。 这些声明不是虚假的,但是由于硬件计算的限制和复杂的网络结构,当时根本不可能实现它们。 这导致了 1970 年代和 1980 年代的 **AI Winters** 。 在这些寒战中,由于很少或几乎没有对基于 AI 的项目提供资金,因此该领域的进展放缓了。 +从那时起,众所周知,添加多层神经元并建立一个深而密集的网络将有助于神经网络解决复杂的任务。 正如母亲为孩子的成就感到自豪一样,科学家和工程师对使用**神经网络**(**NN**)( [https:// www。 youtube.com/watch?v=jPHUlQiwD9Y](https://www.youtube.com/watch?v=jPHUlQiwD9Y) )。 这些声明不是虚假的,但是由于硬件计算的限制和复杂的网络结构,当时根本不可能实现它们。 这导致了 1970 年代和 1980 年代的 **AI 寒冬**。 在这些寒战中,由于很少或几乎没有对基于 AI 的项目提供资金,因此该领域的进展放缓了。 随着 DNN 和 GPU 的出现,情况发生了变化。 今天,我们拥有的网络可以在较少的调整参数的情况下实现更好的性能,诸如辍学和转移学习之类的技术可以进一步减少训练时间,最后,硬件公司正在提出专门的硬件芯片来执行基于 NN 的快速计算。 @@ -26,13 +26,13 @@ 来源: [https://commons.wikimedia.org/wiki/File:Rosenblattperceptron.png](https://commons.wikimedia.org/wiki/File:Rosenblattperceptron.png) -当仅存在此类神经元的一层时,它称为感知器。 输入层称为**第零层**,因为它仅缓冲输入。 存在的唯一神经元层形成输出层。 输出层的每个神经元都有自己的权重和阈值。 当存在许多这样的层时,该网络称为**多层感知器**(**MLP**)。 一个 MLP 具有一个或多个隐藏层。 这些隐藏层具有不同数量的隐藏神经元。 每个隐藏层的神经元具有相同的激活功能: +当仅存在此类神经元的一层时,它称为感知器。 输入层称为**第零层**,因为它仅缓冲输入。 存在的唯一神经元层形成输出层。 输出层的每个神经元都有自己的权重和阈值。 当存在许多这样的层时,该网络称为**多层感知器**(**MLP**)。 一个 MLP 具有一个或多个隐藏层。 这些隐藏层具有不同数量的隐藏神经元。 每个隐藏层的神经元具有相同的激活函数: ![](img/aa3bbbc4-cb14-4d86-bae9-70156e72a876.png) 上图显示了一个 MLP,它具有四个输入,五个隐藏层,每个隐藏层分别具有 4、5、6、4 和 3 个神经元,而在输出层中具有三个神经元。 在 MLP 中,下层的所有神经元都与其上一层的所有神经元相连。 因此,MLP 也称为**全连接层**。 MLP 中的信息流始终是从输入到输出。 由于没有反馈或跳跃,因此这些网络也称为**前馈网络**。 -使用**梯度下降算法**训练感知器。 在第 2 章,*回归*中,您了解了梯度下降; 在这里,我们对其进行更深入的研究。 感知器通过有监督的学习算法进行学习,也就是说,网络由训练数据集中存在的所有输入的期望输出提供。 在输出中,我们定义一个误差函数或目标函数 *J(W)*,这样,当网络完全学习了所有训练数据时,目标函数将最小。 +使用**梯度下降算法**训练感知器。 在第 2 章“回归”中,您了解了梯度下降; 在这里,我们对其进行更深入的研究。 感知器通过有监督的学习算法进行学习,也就是说,网络由训练数据集中存在的所有输入的期望输出提供。 在输出中,我们定义一个误差函数或目标函数`J(W)`,这样,当网络完全学习了所有训练数据时,目标函数将最小。 更新输出层和隐藏层的权重,以使目标函数的梯度减小: @@ -42,33 +42,33 @@ 梯度值越高,权重值的变化越大,反之亦然。 现在,这一切都很好,但是当梯度达到零,因此权重没有变化时,我们到达高原时就会遇到问题。 当我们进入一个小坑(局部极小值)时,我们也可能遇到问题,因为当我们尝试移动到任一侧时,坡度将增加,从而迫使网络停留在坑中。 -如第 2 章,*回归*中所讨论的,梯度下降有多种变体,旨在提高收敛性,避免了陷入局部极小值或高原的问题(增加动量,可变学习 率)。 +如第 2 章,“回归”中所讨论的,梯度下降有多种变体,旨在提高收敛性,避免了陷入局部极小值或高原的问题(增加动量,可变学习 率)。 TensorFlow 借助不同的优化器自动计算这些梯度。 但是,需要注意的重要一点是,由于 TensorFlow 将计算梯度,而梯度也将涉及激活函数的导数,因此重要的是,您选择的激活函数是可微的,并且在整个训练场景中最好具有非零梯度 。 -感知器梯度下降的主要方法之一不同于第 2 章,*回归*,应用是为输出层定义目标函数,但可用于查找目标层的权重变化 隐藏层的神经元也是如此。 这是使用**反向传播**(**BPN**)算法完成的,其中输出端的错误会向后传播到隐藏层,并用于确定权重变化。 您将很快了解更多信息。 +感知器梯度下降的主要方法之一不同于第 2 章,“回归”,应用是为输出层定义目标函数,但可用于查找目标层的权重变化 隐藏层的神经元也是如此。 这是使用**反向传播**(**BPN**)算法完成的,其中输出端的错误会向后传播到隐藏层,并用于确定权重变化。 您将很快了解更多信息。 -# 激活功能 +# 激活函数 -每个神经元必须具有激活功能。 它们使神经元具有建模复杂非线性数据集所需的非线性特性。 该函数获取所有输入的加权和,并生成一个输出信号。 您可以将其视为输入和输出之间的转换。 使用适当的激活函数,我们可以将输出值限制在定义的范围内。 +每个神经元必须具有激活函数。 它们使神经元具有建模复杂非线性数据集所需的非线性特性。 该函数获取所有输入的加权和,并生成一个输出信号。 您可以将其视为输入和输出之间的转换。 使用适当的激活函数,我们可以将输出值限制在定义的范围内。 -如果 *x j* 是 *j* th 输入,则 *W j* *j* 输入到我们的神经元,并且 *b* 我们神经元的偏见,即神经元的输出(从生物学的角度来说,是神经元的发射) 通过激活函数,在数学上表示为: +如果`x[j]`是第`j`个输入,则`W[j]`的第`j`行输入到我们的神经元,并且`b`是我们神经元的偏见,即神经元的输出(从生物学的角度来说,是神经元的发射) 通过激活函数,在数学上表示为: ![](img/83e47038-3f0e-4388-a4ac-785306036a5e.png) -在此, *g* 表示激活功能。 激活函数 *∑W j x j + b* 的论点称为神经元的**活动。** +在此, `g`表示激活函数。 激活函数`∑(W[j]x[j]) + b`的参数称为神经元的**激活**。 # 做好准备 -我们对给定输入刺激的反应受神经元激活功能的控制。 有时我们的回答是二进制的是或否。 例如,当开个玩笑时,我们要么笑要么不笑。 在其他时间,响应似乎是线性的,例如由于疼痛而哭泣。 有时,响应似乎在一定范围内。 +我们对给定输入刺激的反应受神经元激活函数的控制。 有时我们的回答是二进制的是或否。 例如,当开个玩笑时,我们要么笑要么不笑。 在其他时间,响应似乎是线性的,例如由于疼痛而哭泣。 有时,响应似乎在一定范围内。 -模仿类似的行为,人工神经元使用了许多不同的激活功能。 在本食谱中,您将学习如何在 TensorFlow 中定义和使用一些常见的激活功能。 +模仿类似的行为,人工神经元使用了许多不同的激活函数。 在本食谱中,您将学习如何在 TensorFlow 中定义和使用一些常见的激活函数。 # 怎么做... -我们继续执行激活功能,如下所示: +我们继续执行激活函数,如下所示: -1. **阈值激活功能**:这是最简单的激活功能。 在此,如果神经元的活动性大于零,则神经元会触发;否则,神经元会触发。 否则,它不会触发。 这是阈值激活函数随神经元活动变化而变化的图,以及在 TensorFlow 中实现阈值激活函数的代码: +1. **阈值激活函数**:这是最简单的激活函数。 在此,如果神经元的活动性大于零,则神经元会触发;否则,神经元会触发。 否则,它不会触发。 这是阈值激活函数随神经元活动变化而变化的图,以及在 TensorFlow 中实现阈值激活函数的代码: ```py import tensorflow as tf @@ -97,7 +97,7 @@ with tf.Session() as sess: ![](img/3e6ec5cd-a201-49fd-af77-86dd6e3d7378.png) -2. **S 型激活函数**:在这种情况下,神经元的输出由函数`g(x) = 1 / (1 + exp(-x))`指定。 在 TensorFlow 中,有一种方法`tf.sigmoid`,它提供了 Sigmoid 激活。 此函数的范围在 0 到 1 之间。形状上看起来像字母 **S** ,因此名称为 Sigmoid: +2. **Sigmoid 激活函数**:在这种情况下,神经元的输出由函数`g(x) = 1 / (1 + exp(-x))`指定。 在 TensorFlow 中,有一种方法`tf.sigmoid`,它提供了 Sigmoid 激活。 此函数的范围在 0 到 1 之间。形状上看起来像字母 **S** ,因此名称为 Sigmoid: ```py # Plotting Sigmoidal Activation function @@ -117,7 +117,7 @@ with tf.Session() as sess: ![](img/609aa86e-74e6-486c-bb63-6a30f329c016.png) -3. **双曲正切激活函数**:在数学上,它是*(1- exp(-2x)/(1 + exp(-2x))*。在形状上,它类似于 S 型函数,但是 它以 0 为中心,范围为-1 至 1。TensorFlow 具有内置函数`tf.tanh`,用于双曲正切激活函数: +3. **双曲正切激活函数**:在数学上,它是`(1 - exp(-2x) / (1 + exp(-2x))`。在形状上,它类似于 Sigmoid 函数,但是 它以 0 为中心,范围为-1 至 1。TensorFlow 具有内置函数`tf.tanh`,用于双曲正切激活函数: ```py # Plotting Hyperbolic Tangent Activation function @@ -153,7 +153,7 @@ print(out) ``` -5. **整流的线性单位**(**ReLU**)激活功能再次内置在 TensorFlow 库中。 激活函数类似于线性激活函数,但有一个大变化-对于活动的负值,神经元不触发(零输出),对于活动的正值,神经元的输出 与给定的活动相同: +5. **整流线性单元**(**ReLU**)激活函数再次内置在 TensorFlow 库中。 激活函数类似于线性激活函数,但有一个大变化-对于活动的负值,神经元不触发(零输出),对于活动的正值,神经元的输出 与给定的活动相同: ```py # Plotting ReLU Activation function @@ -169,11 +169,11 @@ plt.title('ReLU Activation Function') plt.plot(h, y) ``` -以下是 ReLu 激活功能的输出: +以下是 ReLu 激活函数的输出: ![](img/af4d0f81-869c-49ce-a8c9-8728c01bd7e2.png) -6. **Softmax 激活函数**是归一化的指数函数。 一个神经元的输出不仅取决于其自身的活动,还取决于该层中存在的所有其他神经元的活动总和。 这样的一个优点是,它使神经元的输出保持较小,因此梯度不会爆炸。 数学上,它是 *y i = exp(x i )/* *∑ j* *exp( x j )*: +6. **Softmax 激活函数**是归一化的指数函数。 一个神经元的输出不仅取决于其自身的活动,还取决于该层中存在的所有其他神经元的活动总和。 这样的一个优点是,它使神经元的输出保持较小,因此梯度不会爆炸。 数学上,它是`y[i] = exp(x[i]) / ∑j exp(x[j])`: ```py # Plotting Softmax Activation function @@ -197,21 +197,21 @@ with tf.Session() as sess: 以下是功能的说明: -* **门限激活功能**由 McCulloch Pitts Neuron 和初始感知器使用。 它不可微且在 *x = 0* 处不连续。 因此,不可能使用此激活功能来使用梯度下降或其变体进行训练。 -* **乙状结肠激活功能**曾经非常流行。 如果看曲线,它看起来像是阈值激活函数的连续版本。 它具有消失的梯度问题,即,函数的梯度在两个边缘附近变为零。 这使得训练和优化变得困难。 -* **双曲正切激活函数**再次呈 S 型,并具有非线性特性。 该函数以零为中心,并且与 S 型曲线相比具有更陡峭的导数。 像乙状结肠一样,这也遭受消失的梯度问题的困扰。 -* **线性激活函数**顾名思义是线性的。 该函数从两侧都是无界的 *[-inf,inf]* 。 其线性是其主要问题。 线性函数的总和将是线性函数,线性函数的线性函数也将是线性函数。 因此,使用此功能,无法掌握复杂数据集中存在的非线性。 -* **ReLU 激活函数**是线性激活函数的整流版本,当在多层中使用时,此整流可以捕获非线性。 使用 ReLU 的主要优点之一是它导致稀疏激活。 在任何时候,所有具有负活动的神经元都不会放电。 这使网络在计算方面更轻便。 ReLU 神经元患有垂死的 ReLU 问题,也就是说,不激发的神经元的梯度将变为零,因此将无法进行任何训练并保持静止(死)。 尽管存在这个问题,如今的 ReLU 还是隐藏层最常用的激活功能之一。 -* **Softmax 激活功能**通常用作输出层的激活功能。 该函数的范围为[0,1]。 它用于表示多类分类问题中某类的概率。 所有单位的输出总和将始终为 1。 +* **门限激活函数**由 McCulloch Pitts Neuron 和初始感知器使用。 它不可微且在`x = 0`处不连续。 因此,不可能使用此激活函数来使用梯度下降或其变体进行训练。 +* **Sigmoid 激活函数**曾经非常流行。 如果看曲线,它看起来像是阈值激活函数的连续版本。 它具有消失的梯度问题,即,函数的梯度在两个边缘附近变为零。 这使得训练和优化变得困难。 +* **双曲正切激活函数**再次和 Sigmoid 类似,并具有非线性特性。 该函数以零为中心,并且与 Sigmoid 曲线相比具有更陡峭的导数。 像 Sigmoid 一样,这也遭受消失的梯度问题的困扰。 +* **线性激活函数**顾名思义是线性的。 该函数从两侧都是无界的`[-inf, inf]`。 其线性是其主要问题。 线性函数的总和将是线性函数,线性函数的线性函数也将是线性函数。 因此,使用此功能,无法掌握复杂数据集中存在的非线性。 +* **ReLU 激活函数**是线性激活函数的整流版本,当在多层中使用时,此整流可以捕获非线性。 使用 ReLU 的主要优点之一是它导致稀疏激活。 在任何时候,所有具有负活动的神经元都不会放电。 这使网络在计算方面更轻便。 ReLU 神经元患有垂死的 ReLU 问题,也就是说,不激发的神经元的梯度将变为零,因此将无法进行任何训练并保持静止(死)。 尽管存在这个问题,如今的 ReLU 还是隐藏层最常用的激活函数之一。 +* **Softmax 激活函数**通常用作输出层的激活函数。 该函数的范围为`[0, 1]`。 它用于表示多类分类问题中某类的概率。 所有单位的输出总和将始终为 1。 # 还有更多... -神经网络已用于各种任务。 这些任务可以大致分为两类:函数逼近(回归)和分类。 根据手头的任务,一个激活功能可能会优于另一个。 通常,最好将 ReLU 神经元用于隐藏层。 对于分类任务,softmax 通常是更好的选择,对于回归问题,最好使用 S 形或双曲正切。 +神经网络已用于各种任务。 这些任务可以大致分为两类:函数逼近(回归)和分类。 根据手头的任务,一个激活函数可能会优于另一个。 通常,最好将 ReLU 神经元用于隐藏层。 对于分类任务,softmax 通常是更好的选择,对于回归问题,最好使用 S 形或双曲正切。 # 也可以看看 -* 该链接提供了 TensorFlow 中定义的激活功能及其使用方法的详细信息: [https://www.tensorflow.org/versions/r0.12/api_docs/python/nn/activation_functions_](https://www.tensorflow.org/versions/r0.12/api_docs/python/nn/activation_functions_) -* 关于激活功能的不错总结: [https://en.wikipedia.org/wiki/Activation_function](https://en.wikipedia.org/wiki/Activation_function) +* 该链接提供了 TensorFlow 中定义的激活函数及其使用方法的详细信息: [https://www.tensorflow.org/versions/r0.12/api_docs/python/nn/activation_functions_](https://www.tensorflow.org/versions/r0.12/api_docs/python/nn/activation_functions_) +* 关于激活函数的不错总结: [https://en.wikipedia.org/wiki/Activation_function](https://en.wikipedia.org/wiki/Activation_function) # 单层感知器 @@ -219,7 +219,7 @@ with tf.Session() as sess: # 做好准备 -由于感知器使用阈值激活功能,因此我们无法使用 TensorFlow 优化器来更新权重。 我们将不得不使用权重更新规则: +由于感知器使用阈值激活函数,因此我们无法使用 TensorFlow 优化器来更新权重。 我们将不得不使用权重更新规则: ![](img/b9c0550a-5f1e-4f60-b618-58445d70c13b.png) @@ -322,7 +322,7 @@ with tf.Session() as sess: BPN 算法是神经网络中研究最多的算法之一。 它用于将错误从输出层传播到隐藏层的神经元,然后将其用于更新权重。 整个学习可以分为两阶段-前向阶段和后向阶段。 -**前向传递**:输入被馈送到网络,信号从输入层通过隐藏层传播,最后传播到输出层。 在输出层,计算误差和`loss`函数。 +**向前传递**:输入被馈送到网络,信号从输入层通过隐藏层传播,最后传播到输出层。 在输出层,计算误差和`loss`函数。 **向后传递**:在向后传递中,首先为输出层神经元然后为隐藏层神经元计算`loss`函数的梯度。 然后使用梯度更新权重。 @@ -330,9 +330,9 @@ BPN 算法是神经网络中研究最多的算法之一。 它用于将错误从 # 做好准备 -首先为网络呈现 *M* 个训练对( *X* , *Y* ),并以 *X* 作为输入, *Y [* 所需的输出。 输入通过激活函数 *g(h)*从输入传播到隐藏层,直到输出层。 输出 *Y hat* 是网络的输出,误差为 *Y- Y hat* 。 +首先为网络呈现`M`个训练对`(X, Y)`,并以`X`作为输入, `Y`为所需的输出。 输入通过激活函数`g(h)`从输入传播到隐藏层,直到输出层。 输出`Y_hat`是网络的输出,误差为`Y - Y_hat`。 -`loss`函数 *J(W)*如下: +`loss`函数`J(W)`如下: ![](img/fa600cc8-054b-49d3-b774-94863f05edb7.png) @@ -505,7 +505,7 @@ TensorFlow 支持自动分化; 我们可以使用 TensorFlow 优化器来计 在反向传播算法配方中,我们定义了层,权重,损耗,渐变,并手动通过渐变进行更新。 为了更好地理解,手动使用方程式进行操作是一个好主意,但是随着网络中层数的增加,这可能会非常麻烦。 -在本食谱中,我们将使用强大的 TensorFlow 功能(例如 Contrib(层))来定义神经网络层,并使用 TensorFlow 自己的优化器来计算和应用梯度。 我们在第 2 章和*回归*中了解了如何使用不同的 TensorFlow 优化器。 contrib 可用于向神经网络模型添加各种层,例如添加构建块。 我们在这里使用的一种方法是`tf.contrib.layers.fully_connected`,在 TensorFlow 文档中定义如下: +在本食谱中,我们将使用强大的 TensorFlow 功能(例如 Contrib(层))来定义神经网络层,并使用 TensorFlow 自己的优化器来计算和应用梯度。 我们在第 2 章和“回归”中了解了如何使用不同的 TensorFlow 优化器。 contrib 可用于向神经网络模型添加各种层,例如添加构建块。 我们在这里使用的一种方法是`tf.contrib.layers.fully_connected`,在 TensorFlow 文档中定义如下: ```py fully_connected( @@ -611,15 +611,15 @@ import tensorflow as tf # 使用 MLP 预测波士顿房价的函数逼近 -Hornik *等人*( [http://www.cs.cmu.edu/~bhiksha/courses/deeplearning/Fall.2016/notes/Sonia_Hornik.pdf](http://www.cs.cmu.edu/~bhiksha/courses/deeplearning/Fall.2016/notes/Sonia_Hornik.pdf) )的工作证明了 以下: +Hornik 等人( [http://www.cs.cmu.edu/~bhiksha/courses/deeplearning/Fall.2016/notes/Sonia_Hornik.pdf](http://www.cs.cmu.edu/~bhiksha/courses/deeplearning/Fall.2016/notes/Sonia_Hornik.pdf) )的工作证明了 以下: "multilayer feedforward networks with as few as one hidden layer are indeed capable of universal approximation in a very precise and satisfactory sense." -在本食谱中,我们将向您展示如何使用 MLP 进行函数逼近; 具体来说,我们将预测波士顿的房价。 我们已经熟悉了数据集; 在第 2 章,*回归*中,我们使用回归技术进行房价预测,现在我们将使用 MLP 进行相同的操作。 +在本食谱中,我们将向您展示如何使用 MLP 进行函数逼近; 具体来说,我们将预测波士顿的房价。 我们已经熟悉了数据集; 在第 2 章,“回归”中,我们使用回归技术进行房价预测,现在我们将使用 MLP 进行相同的操作。 # 做好准备 -对于函数逼近,`loss`函数应为 MSE。 输入应该标准化,而隐藏层可以是 ReLU,而输出层则最好是 S 型。 +对于函数逼近,`loss`函数应为 MSE。 输入应该标准化,而隐藏层可以是 ReLU,而输出层则最好是 Sigmoid 。 # 怎么做... diff --git a/docs/tf-1x-dl-cookbook/04.md b/docs/tf-1x-dl-cookbook/04.md index 7d8231e3..46f4ce12 100644 --- a/docs/tf-1x-dl-cookbook/04.md +++ b/docs/tf-1x-dl-cookbook/04.md @@ -16,7 +16,7 @@ CNN 由许多神经网络层组成。 卷积和池化两种不同类型的层通 An example of Convolutional Neural Network as seen is https://commons.wikimedia.org/wiki/File:Typical_cnn.png -卷积网络背后有三个主要的直觉**:本地接受域**,**共享权重**和**池**。 让我们一起回顾一下。 +卷积网络背后有三个主要的直觉:**局部接受域**,**共享权重**和**池化**。 让我们一起回顾一下。 # 当地接受领域 @@ -32,13 +32,13 @@ An example of Convolutional Neural Network as seen is https://commons.wikimedia. # 一个数学例子 -一种了解卷积的简单方法是考虑应用于矩阵的滑动窗口函数。 在下面的示例中,给定输入矩阵 **I** 和内核 **K** ,我们得到了卷积输出。 将 3 x 3 内核 **K** (有时称为**过滤器**或**功能** **检测器**)与输入矩阵逐元素相乘,得到一个 输出卷积矩阵中的单元格。 通过在 **I** 上滑动窗口即可获得所有其他单元格: +一种了解卷积的简单方法是考虑应用于矩阵的滑动窗口函数。 在下面的示例中,给定输入矩阵`I`和内核`K`,我们得到了卷积输出。 将`3 x 3`内核`K`(有时称为**过滤器**或**特征检测器**)与输入矩阵逐元素相乘,得到输出卷积矩阵中的一个单元格。 通过在`I`上滑动窗口即可获得所有其他单元格: ![](img/d70c6297-0661-4521-bcea-769d611267af.png) An example of convolutional operation: in bold the cells involved in the computation -在此示例中,我们决定在触摸 **I** 的边界后立即停止滑动窗口(因此输出为 3 x 3)。 或者,我们可以选择用零填充输入(以便输出为 5 x 5)。 该决定与所采用的**填充**选择有关。 +在此示例中,我们决定在触摸`I`的边界后立即停止滑动窗口(因此输出为`3 x 3`)。 或者,我们可以选择用零填充输入(以便输出为 5 x 5)。 该决定与所采用的**填充**选择有关。 另一个选择是关于**步幅**,这与我们的滑动窗口采用的移位类型有关。 这可以是一个或多个。 较大的跨度将生成较少的内核应用程序,并且较小的输出大小,而较小的跨度将生成更多的输出并保留更多信息。 @@ -74,7 +74,7 @@ An example of convolutional operation # 最大池 -一个简单而常见的选择是所谓的**最大池运算符**,它仅输出在该区域中观察到的最大激活。 在 TensorFlow 中,如果要定义大小为 2 x 2 的最大池化层,我们将编写以下内容: +一个简单而常见的选择是所谓的**最大池化运算符**,它仅输出在该区域中观察到的最大激活。 在 TensorFlow 中,如果要定义大小为 2 x 2 的最大池化层,我们将编写以下内容: ```py tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=None) @@ -202,7 +202,7 @@ y = tf.placeholder(tf.float32, [None, n_classes]) keep_prob = tf.placeholder(tf.float32) ``` -5. 使用输入`x`,权重`W`,偏差`b`和给定的步幅定义卷积层。 激活功能为 ReLU,填充为`SAME`: +5. 使用输入`x`,权重`W`,偏差`b`和给定的步幅定义卷积层。 激活函数为 ReLU,填充为`SAME`: ```py def conv2d(x, W, b, strides=1): @@ -405,7 +405,7 @@ img_aug.add_random_flip_leftright() img_aug.add_random_rotation(max_angle=25.) ``` -5. 使用先前定义的图像准备和扩充来创建卷积网络。 网络由三个卷积层组成。 第一个使用 32 个卷积滤波器,滤波器的大小为 3,激活函数为 ReLU。 之后,有一个`max_pool`层用于缩小尺寸。 然后有两个级联的卷积滤波器与 64 个卷积滤波器,滤波器的大小为 3,激活函数为 ReLU。 之后,有一个用于缩小规模的`max_pool`,一个具有 512 个神经元且具有激活功能 ReLU 的全连接网络,其次是辍学的可能性为 50%。 最后一层是具有 10 个神经元和激活功能`softmax`的完全连接的网络,用于确定手写数字的类别。 请注意,已知这种特定类型的 ConvNet 对于 CIFAR-10 非常有效。 在这种特殊情况下,我们将 Adam 优化器与`categorical_crossentropy`和学习率`0.001`结合使用: +5. 使用先前定义的图像准备和扩充来创建卷积网络。 网络由三个卷积层组成。 第一个使用 32 个卷积滤波器,滤波器的大小为 3,激活函数为 ReLU。 之后,有一个`max_pool`层用于缩小尺寸。 然后有两个级联的卷积滤波器与 64 个卷积滤波器,滤波器的大小为 3,激活函数为 ReLU。 之后,有一个用于缩小规模的`max_pool`,一个具有 512 个神经元且具有激活函数 ReLU 的全连接网络,其次是辍学的可能性为 50%。 最后一层是具有 10 个神经元和激活函数`softmax`的完全连接的网络,用于确定手写数字的类别。 请注意,已知这种特定类型的 ConvNet 对于 CIFAR-10 非常有效。 在这种特殊情况下,我们将 Adam 优化器与`categorical_crossentropy`和学习率`0.001`结合使用: ```py # Convolutional network building @@ -452,7 +452,7 @@ An example of Jupyter execution for CIFAR10 classification # 做好准备 -我们将实现在论文中描述的算法*一种艺术风格的神经算法( [https://arxiv.org/abs/1508.06576](https://arxiv.org/abs/1508.06576) )*,作者是 Leon A. Gatys,亚历山大 S. Ecker 和 Matthias Bethge。 因此,最好先阅读该论文( [https://arxiv.org/abs/1508.06576](https://arxiv.org/abs/1508.06576) )。 此食谱将重复使用在线提供的预训练模型 VGG19( [http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat](http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat) ),该模型应在本地下载。 我们的风格图片将是一幅可在线获得的梵高著名画作( [https://commons.wikimedia.org/wiki/File:VanGogh-starry_night.jpg](https://commons.wikimedia.org/wiki/File:VanGogh-starry_night.jpg) ),而我们的内容图片则是玛丽莲(Marilyn)的照片 从 Wikipedia( [https://commons.wikimedia.org/wiki/File:Marilyn_Monroe_in_1952.jpg](https://commons.wikimedia.org/wiki/File:Marilyn_Monroe_in_1952.jpg) )下载的梦露。 内容图像将根据 *Van Gogh* 样式重新粉刷。 +我们将实现在论文中描述的算法*一种艺术风格的神经算法( [https://arxiv.org/abs/1508.06576](https://arxiv.org/abs/1508.06576) )*,作者是 Leon A. Gatys,亚历山大 S. Ecker 和 Matthias Bethge。 因此,最好先阅读该论文( [https://arxiv.org/abs/1508.06576](https://arxiv.org/abs/1508.06576) )。 此食谱将重复使用在线提供的预训练模型 VGG19( [http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat](http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.mat) ),该模型应在本地下载。 我们的风格图片将是一幅可在线获得的梵高著名画作( [https://commons.wikimedia.org/wiki/File:VanGogh-starry_night.jpg](https://commons.wikimedia.org/wiki/File:VanGogh-starry_night.jpg) ),而我们的内容图片则是玛丽莲(Marilyn)的照片 从 Wikipedia( [https://commons.wikimedia.org/wiki/File:Marilyn_Monroe_in_1952.jpg](https://commons.wikimedia.org/wiki/File:Marilyn_Monroe_in_1952.jpg) )下载的梦露。 内容图像将根据梵高的样式重新粉刷。 # 怎么做... @@ -531,7 +531,7 @@ imshow(style_image) An example of Vicent Van Gogh painting as seen in https://commons.wikimedia.org/wiki/File:VanGogh-starry_night_ballance1.jpg -6. 下一步是按照原始论文中的描述定义 VGG 模型。 请注意,深度学习网络相当复杂,因为它结合了具有 ReLU 激活功能和最大池的多个 ConvNet 层。 另外需要注意的是,在原始论文《转移样式》(Leon A. Gatys,Alexander S. Ecker 和 Matthias Bethge 撰写的*一种艺术风格的神经算法*)中,许多实验表明,平均合并实际上优于 最大池化。 因此,我们将改用平均池: +6. 下一步是按照原始论文中的描述定义 VGG 模型。 请注意,深度学习网络相当复杂,因为它结合了具有 ReLU 激活函数和最大池的多个 ConvNet 层。 另外需要注意的是,在原始论文《转移样式》(Leon A. Gatys,Alexander S. Ecker 和 Matthias Bethge 撰写的《一种艺术风格的神经算法》)中,许多实验表明,平均合并实际上优于 最大池化。 因此,我们将改用平均池: ```py def load_vgg_model(path, image_height, image_width, color_channels): @@ -1002,7 +1002,7 @@ scores = model.predict_generator(validation_generator, nb_validation_samples/bat # 创建 DeepDream 网络 -Google 于 2014 年在 **ImageNet 上训练了神经网络以应对大规模视觉识别挑战**(**ILSVRC**),并于 2015 年 7 月将其开源。*中介绍了原始算法 深入了解卷积,Christian Szegedy,刘炜,贾阳清,Pierre Sermanet,Scott Reed,Dragomir Anguelov,Dumitru Erhan,Vincent Vanhoucke 和 Andrew Rabinovich(https://arxiv.org/abs/1409.4842)*。 网络学会了每个图像的表示。 较低的层学习诸如线条和边缘之类的底层特征,而较高的层则学习诸如眼睛,鼻子,嘴等更复杂的图案。 因此,如果尝试在网络中代表更高的级别,我们将看到从原始 ImageNet 提取的各种不同特征的混合,例如鸟的眼睛和狗的嘴巴。 考虑到这一点,如果我们拍摄一张新图像并尝试使与网络上层的相似性最大化,那么结果就是一张新的有远见的图像。 在这个有远见的图像中,较高层学习的某些模式在原始图像中被梦到(例如,想象中)。 这是此类有远见的图像的示例: +Google 于 2014 年训练了神经网络以应对 **ImageNet 大规模视觉识别挑战**(**ILSVRC**),并于 2015 年 7 月将其开源。*中介绍了原始算法 深入了解卷积,Christian Szegedy,刘炜,贾阳清,Pierre Sermanet,Scott Reed,Dragomir Anguelov,Dumitru Erhan,Vincent Vanhoucke 和 Andrew Rabinovich(https://arxiv.org/abs/1409.4842)*。 网络学会了每个图像的表示。 较低的层学习诸如线条和边缘之类的底层特征,而较高的层则学习诸如眼睛,鼻子,嘴等更复杂的图案。 因此,如果尝试在网络中代表更高的级别,我们将看到从原始 ImageNet 提取的各种不同特征的混合,例如鸟的眼睛和狗的嘴巴。 考虑到这一点,如果我们拍摄一张新图像并尝试使与网络上层的相似性最大化,那么结果就是一张新的有远见的图像。 在这个有远见的图像中,较高层学习的某些模式在原始图像中被梦到(例如,想象中)。 这是此类有远见的图像的示例: ![](img/cbbf2fe8-00f2-4ee3-b340-050425f20a7c.jpg) diff --git a/docs/tf-1x-dl-cookbook/06.md b/docs/tf-1x-dl-cookbook/06.md index 87548d67..13ea84f8 100644 --- a/docs/tf-1x-dl-cookbook/06.md +++ b/docs/tf-1x-dl-cookbook/06.md @@ -75,7 +75,7 @@ LSTM 网络可以控制何时让输入进入神经元,何时记住在上一个 An example of an LSTM cell -首先,我们需要一个逻辑函数σ(请参见第 2 章,*回归*)来计算介于 0 和 1 之间的值,并控制哪些信息流过 LSTM *门[* 。 请记住,逻辑函数是可微的,因此允许反向传播。 然后,我们需要一个运算符⊗,它采用两个相同维的矩阵并生成另一个矩阵,其中每个元素 *ij* 是原始两个矩阵的元素 *ij* 的乘积。 同样,我们需要一个运算符⊕,它采用两个相同维度的矩阵并生成另一个矩阵,其中每个元素 *ij* 是原始两个矩阵的元素 *ij* 之和。 使用这些基本块,我们考虑时间 i 处的输入 X i ,并将其与上一步中的输出 Y i-1 并置。 +首先,我们需要一个逻辑函数σ(请参见第 2 章,“回归”)来计算介于 0 和 1 之间的值,并控制哪些信息流过 LSTM *门[* 。 请记住,逻辑函数是可微的,因此允许反向传播。 然后,我们需要一个运算符⊗,它采用两个相同维的矩阵并生成另一个矩阵,其中每个元素 *ij* 是原始两个矩阵的元素 *ij* 的乘积。 同样,我们需要一个运算符⊕,它采用两个相同维度的矩阵并生成另一个矩阵,其中每个元素 *ij* 是原始两个矩阵的元素 *ij* 之和。 使用这些基本块,我们考虑时间 i 处的输入 X i ,并将其与上一步中的输出 Y i-1 并置。 方程 *f t =σ(W f 。[y i-1 ,x t ] + b [HTG9 f* 实现了控制激活门 log 的逻辑回归,并用于确定应从*先前*候选值 C i-1 获取多少信息。 传递给下一个候选值 C i (此处 *W f* 和 *b f* 矩阵和用于 logistic 回归的偏差。)如果 logistic 输出为 1,则表示*不要忘记*先前的单元格状态 C i-1; 如果输出 0, 这将意味着*忘记*先前的单元状态 C i-1 。(0,1)中的任何数字都将表示要传递的信息量。 diff --git a/docs/tf-1x-dl-cookbook/11.md b/docs/tf-1x-dl-cookbook/11.md index 5f250cc9..c832ddb4 100644 --- a/docs/tf-1x-dl-cookbook/11.md +++ b/docs/tf-1x-dl-cookbook/11.md @@ -95,7 +95,7 @@ def xavier_init(size): return xavier_stddev ``` -3. 定义输入 X 的生成器。首先,我们定义尺寸为[100,K = 128]的矩阵 W1,并根据正态分布对其进行初始化。 注意 100 是 Z 的任意值,Z 是我们的发生器使用的初始噪声。 然后,我们定义尺寸为[K = 256]的偏差 B1。 类似地,我们定义尺寸为[`K=128`,`L=784`]的矩阵 W2 和尺寸为[L = 784]的偏置 B2。 使用步骤 1 中定义的`xavier_init`初始化两个矩阵 W1 和 W2,而使用`tf.constant_initializer()`初始化 B1 和 B2。 之后,我们计算矩阵 *X * W1* 之间的乘法,求和 B1 的偏差,然后将其传递给 RELU 激活函数以获得 fc1。 然后将该密集层与下一个密集层连接,该密集层是通过将矩阵 fc1 与 W2 相乘并求和 B2 的偏差而创建的。 然后将结果通过 S 型函数传递。 这些步骤用于定义用于生成器的两层神经网络: +3. 定义输入 X 的生成器。首先,我们定义尺寸为[100,K = 128]的矩阵 W1,并根据正态分布对其进行初始化。 注意 100 是 Z 的任意值,Z 是我们的发生器使用的初始噪声。 然后,我们定义尺寸为[K = 256]的偏差 B1。 类似地,我们定义尺寸为[`K=128`,`L=784`]的矩阵 W2 和尺寸为[L = 784]的偏置 B2。 使用步骤 1 中定义的`xavier_init`初始化两个矩阵 W1 和 W2,而使用`tf.constant_initializer()`初始化 B1 和 B2。 之后,我们计算矩阵 *X * W1* 之间的乘法,求和 B1 的偏差,然后将其传递给 RELU 激活函数以获得 fc1。 然后将该密集层与下一个密集层连接,该密集层是通过将矩阵 fc1 与 W2 相乘并求和 B2 的偏差而创建的。 然后将结果通过 Sigmoid 函数传递。 这些步骤用于定义用于生成器的两层神经网络: ```py def generator(X): @@ -119,7 +119,7 @@ def generator(X): return prob ``` -4. 定义输入 X 的鉴别符。原则上,这与生成器非常相似。 主要区别在于,如果参数重用为 true,则调用`scope.reuse_variables()`触发重用。 然后我们定义两个密集层。 第一层使用尺寸为[`J=784`,`K=128`]的矩阵 W1,尺寸为[`K=128`]的偏差 B1,并且它基于 X 与 W1 的标准乘积。 将该结果添加到 B1 并传递给 RELU 激活函数以获取结果 fc1。 第二个矩阵使用尺寸为[`K=128`,`L=1`]的矩阵 W2 和尺寸为[`L=1`]的偏差 B2,它基于 fc1 与 W2 的标准乘积。 将此结果添加到 B2 并传递给 S 型函数: +4. 定义输入 X 的鉴别符。原则上,这与生成器非常相似。 主要区别在于,如果参数重用为 true,则调用`scope.reuse_variables()`触发重用。 然后我们定义两个密集层。 第一层使用尺寸为[`J=784`,`K=128`]的矩阵 W1,尺寸为[`K=128`]的偏差 B1,并且它基于 X 与 W1 的标准乘积。 将该结果添加到 B1 并传递给 RELU 激活函数以获取结果 fc1。 第二个矩阵使用尺寸为[`K=128`,`L=1`]的矩阵 W2 和尺寸为[`L=1`]的偏差 B2,它基于 fc1 与 W2 的标准乘积。 将此结果添加到 B2 并传递给 Sigmoid 函数: ```py def discriminator(X, reuse=False): @@ -337,7 +337,7 @@ def deconv(x, w, b, shape, stride, name): name=name) + b ``` -5. 定义一个标准`LeakyReLU`,这对于 GAN 是非常有效的激活功能: +5. 定义一个标准`LeakyReLU`,这对于 GAN 是非常有效的激活函数: ```py def lrelu(x, alpha=0.2): @@ -345,7 +345,7 @@ def lrelu(x, alpha=0.2): return tf.maximum(x, alpha * x) ``` -6. 定义生成器。 首先,我们定义输入大小为 100(Z 的任意大小,即生成器使用的初始噪声)的完全连接层。 全连接层由尺寸为[100,7 * 7 * 256]且根据正态分布初始化的矩阵 W1 和尺寸为[7 * 7 * 256]的偏置 B1 组成。 该层使用 ReLu 作为激活功能。 在完全连接的层之后,生成器将应用两个反卷积运算 deconv1 和 deconv2,两者的步幅均为 2。 完成第一个 deconv1 操作后,将结果批量标准化。 请注意,第二次反卷积运算之前会出现丢失,概率为 40%。 最后一个阶段是一个 Sigmoid,用作非线性激活,如下面的代码片段所示: +6. 定义生成器。 首先,我们定义输入大小为 100(Z 的任意大小,即生成器使用的初始噪声)的完全连接层。 全连接层由尺寸为[100,7 * 7 * 256]且根据正态分布初始化的矩阵 W1 和尺寸为[7 * 7 * 256]的偏置 B1 组成。 该层使用 ReLu 作为激活函数。 在完全连接的层之后,生成器将应用两个反卷积运算 deconv1 和 deconv2,两者的步幅均为 2。 完成第一个 deconv1 操作后,将结果批量标准化。 请注意,第二次反卷积运算之前会出现丢失,概率为 40%。 最后一个阶段是一个 Sigmoid,用作非线性激活,如下面的代码片段所示: ```py def generator(X, batch_size=64): @@ -368,7 +368,7 @@ def generator(X, batch_size=64): return tf.nn.sigmoid(XX) ``` -7. 定义鉴别符。 与前面的配方一样,如果参数重用为 true,则调用`scope.reuse_variables()`触发重用。 鉴别器使用两个卷积层。 第一个是批处理归一化,而第二个是概率为 40%的辍学,然后是批处理归一化步骤。 之后,我们得到了一个具有激活功能 ReLU 的致密层,然后是另一个具有基于 S 形激活功能的致密层: +7. 定义鉴别符。 与前面的配方一样,如果参数重用为 true,则调用`scope.reuse_variables()`触发重用。 鉴别器使用两个卷积层。 第一个是批处理归一化,而第二个是概率为 40%的辍学,然后是批处理归一化步骤。 之后,我们得到了一个具有激活函数 ReLU 的致密层,然后是另一个具有基于 S 形激活函数的致密层: ```py def discriminator(X, reuse=False): @@ -934,7 +934,7 @@ Squashing function as seen in Hinton's seminal paper A simple CapsNet architecture -该体系结构很浅,只有两个卷积层和一个完全连接的层。 Conv1 具有 256 个 9×9 卷积核,步幅为 1,并具有 ReLU 激活功能。 该层的作用是将像素强度转换为局部特征检测器的活动,然后将其用作主胶囊的输入。 PrimaryCapsules 是具有 32 个通道的卷积胶囊层。 每个主胶囊包含 8 个卷积单元,其内核为 9×9,步幅为 2 *。* 总计,PrimaryCapsules 具有[32,6,6]胶囊输出(每个输出是 8D 矢量),并且[6,6]网格中的每个胶囊彼此共享重量。 最后一层(DigitCaps)每位数字类具有一个 16D 胶囊,这些胶囊中的每个胶囊都接收来自下一层中所有其他胶囊的输入。 路由仅发生在两个连续的胶囊层之间(例如 PrimaryCapsules 和 DigitCaps)。 +该体系结构很浅,只有两个卷积层和一个完全连接的层。 Conv1 具有 256 个 9×9 卷积核,步幅为 1,并具有 ReLU 激活函数。 该层的作用是将像素强度转换为局部特征检测器的活动,然后将其用作主胶囊的输入。 PrimaryCapsules 是具有 32 个通道的卷积胶囊层。 每个主胶囊包含 8 个卷积单元,其内核为 9×9,步幅为 2 *。* 总计,PrimaryCapsules 具有[32,6,6]胶囊输出(每个输出是 8D 矢量),并且[6,6]网格中的每个胶囊彼此共享重量。 最后一层(DigitCaps)每位数字类具有一个 16D 胶囊,这些胶囊中的每个胶囊都接收来自下一层中所有其他胶囊的输入。 路由仅发生在两个连续的胶囊层之间(例如 PrimaryCapsules 和 DigitCaps)。 # 做好准备 diff --git a/docs/tf-1x-dl-cookbook/14.md b/docs/tf-1x-dl-cookbook/14.md index 70c5f95b..83d905bc 100644 --- a/docs/tf-1x-dl-cookbook/14.md +++ b/docs/tf-1x-dl-cookbook/14.md @@ -14,7 +14,7 @@ TPU 是 Google 专门为机器学习而定制的定制专用集成电路(**ASI 前两个成分是矩阵乘法的一部分:权重矩阵 ***W*** 需要与输入矩阵 ***X*** 相乘 ***W T X*** ; 矩阵乘法在 CPU 上的计算量很大,尽管 GPU 使操作并行化,但仍有改进的余地。 -TPU 具有 65,536 个 8 位整数矩阵乘法器单元(**MXU**),峰值吞吐量为 92 TOPS。 GPU 和 TPU 乘法之间的主要区别在于 GPU 包含浮点乘法器,而 TPU 包含 8 位整数乘法器。 TPU 还包含一个统一缓冲区(**UB**),用作寄存器的 24 MB SRAM 和一个包含硬接线激活功能的激活单元(**AU**)。 +TPU 具有 65,536 个 8 位整数矩阵乘法器单元(**MXU**),峰值吞吐量为 92 TOPS。 GPU 和 TPU 乘法之间的主要区别在于 GPU 包含浮点乘法器,而 TPU 包含 8 位整数乘法器。 TPU 还包含一个统一缓冲区(**UB**),用作寄存器的 24 MB SRAM 和一个包含硬接线激活函数的激活单元(**AU**)。 MXU 是使用脉动阵列架构实现的。 它包含一个阵列算术逻辑单元(ALU),该阵列连接到网状拓扑中的少量最近邻居。 每个数据值仅读取一次,但在流过 ALU 数组时会多次用于不同的操作,而无需将其存储回寄存器。 TPU 中的 ALU 仅以固定模式执行乘法和加法。 MXU 已针对矩阵乘法进行了优化,不适用于通用计算。 @@ -25,7 +25,7 @@ MXU 是使用脉动阵列架构实现的。 它包含一个阵列算术逻辑单 * `Read_Weights`:从内存读取权重 * `Read_Host_Memory`:从内存中读取数据 * `MatrixMultiply/Convolve`:与数据相乘或卷积并累加结果 -* `Activate`:应用激活功能 +* `Activate`:应用激活函数 * `Write_Host_Memory`:将结果写入存储器 Google 创建了一个 API 堆栈,以方便 TPU 编程; 它将来自 Tensorflow 图的 API 调用转换为 TPU 指令。 -- GitLab