From c5bfe7bd796945b81d4d5da7e7dddb8121d4b40d Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Sun, 13 Sep 2020 23:19:45 +0800 Subject: [PATCH] 2020-09-13 23:19:44 --- docs/handson-cnn-tf/2.md | 2 +- docs/handson-cnn-tf/3.md | 6 ++--- docs/handson-cnn-tf/6.md | 50 ++++++++++++++++++++-------------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/docs/handson-cnn-tf/2.md b/docs/handson-cnn-tf/2.md index e3122fd6..eb77b34e 100644 --- a/docs/handson-cnn-tf/2.md +++ b/docs/handson-cnn-tf/2.md @@ -280,7 +280,7 @@ TensorFlow 的所有不同优化器都可以在`tf.train`类中找到。 例如 ![](img/01d83517-803f-4442-b37d-a508371fdd0b.jpg) -通常,您将对数据进行一些标准化,例如在使用数据之前减去平均值并除以数据集的标准偏差。 对于 RGB 图像,通常只需从每个像素值中减去 128 即可使数据居中于零附近。 但是,更好的方法是为数据集中的每个图像通道计算平均像素值。 现在,您具有三个值,每个图像通道一个,现在从输入图像中删除这些值。 我们一开始就不必担心缩放问题,因为所有功能一开始的缩放比例都相同(0-255)。 +通常,您将对数据进行一些标准化,例如在使用数据之前减去平均值并除以数据集的标准差。 对于 RGB 图像,通常只需从每个像素值中减去 128 即可使数据居中于零附近。 但是,更好的方法是为数据集中的每个图像通道计算平均像素值。 现在,您具有三个值,每个图像通道一个,现在从输入图像中删除这些值。 我们一开始就不必担心缩放问题,因为所有功能一开始的缩放比例都相同(0-255)。 要记住非常重要的一点-如果您在训练时对数据进行了一些预处理,则必须在测试时进行完全相同的预处理,否则可能会得到不好的结果! diff --git a/docs/handson-cnn-tf/3.md b/docs/handson-cnn-tf/3.md index 6c7a36c8..afd8b376 100644 --- a/docs/handson-cnn-tf/3.md +++ b/docs/handson-cnn-tf/3.md @@ -540,7 +540,7 @@ decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps) 我们还可以从零均值和前面的方差的正态分布中采样权重。 对于 ReLu 激活功能,He 等人证明了这一点。 方差应该改为![](img/f093a9d2-6556-437c-b66d-541edccd858f.png)。 -因此,作者使用零均值高斯分布初始化其权重,其标准偏差(std)为![](img/54a6c0be-d7b4-4bc7-a075-16da0f29d2f0.png)。 然后将该初始化称为 He 初始化。 +因此,作者使用零均值高斯分布初始化其权重,其标准差(std)为![](img/54a6c0be-d7b4-4bc7-a075-16da0f29d2f0.png)。 然后将该初始化称为 He 初始化。 默认情况下,TensorFlow 的大部分`tf.layers`都使用 Glorot(xavier)初始化程序,但是我们可以覆盖它并指定我们自己的初始化。 在这里,我们展示了一个如何覆盖`conv2d`层的默认初始化器的示例: @@ -649,13 +649,13 @@ fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training) 之前,我们已经完成了权重的初始化工作,以使梯度下降优化器的工作更加轻松。 但是,好处仅在训练的早期阶段才能看到,并不能保证在后期阶段有所改善。 那就是我们转向另一个称为批处理规范层的伟大发明的地方。 在 CNN 模型中使用批处理规范层产生的效果与第 2 章,“深度学习和卷积神经网络”中看到的输入标准化大致相同。 现在唯一的区别是,这将在模型中所有卷积层和完全连接层的输出处发生。 -批处理规范层通常将附加到每个完全连接或卷积层的末端,但是在激活功能之前,它将对层输出进行规范化,如下图所示。 它通过获取图层输出(一批激活)并减去批次平均值并除以批次标准偏差来执行此操作,因此图层输出具有零均值和单位标准偏差。 请注意,在激活函数之前或之后放置 batchnorm 是一个引起激烈争论的话题,但是两者都应该起作用。 +批处理规范层通常将附加到每个完全连接或卷积层的末端,但是在激活功能之前,它将对层输出进行规范化,如下图所示。 它通过获取图层输出(一批激活)并减去批次平均值并除以批次标准差来执行此操作,因此图层输出具有零均值和单位标准差。 请注意,在激活函数之前或之后放置 batchnorm 是一个引起激烈争论的话题,但是两者都应该起作用。 ![](img/3e1365ac-328e-48f0-8077-920bb837324e.png) 进行此标准化之后,批处理规范层还具有两个可学习的参数,这些参数将按比例缩放标准化的激活并将其转移到模型认为最有助于其学习的内容。 整个过程通过消除消失的梯度问题来帮助训练。 反过来,这又允许模型在训练时使用更高的学习率,因此可以减少迭代次数。 -在训练过程中,记录平均值和标准偏差值的移动平均值。 然后在测试时使用这些值,而不是计算批次统计信息。 +在训练过程中,记录平均值和标准差值的移动平均值。 然后在测试时使用这些值,而不是计算批次统计信息。 批处理规范层的一些优点如下: diff --git a/docs/handson-cnn-tf/6.md b/docs/handson-cnn-tf/6.md index 36b795a6..95ad4bd9 100644 --- a/docs/handson-cnn-tf/6.md +++ b/docs/handson-cnn-tf/6.md @@ -1,8 +1,8 @@ # 自编码器,变分自编码器和生成对抗网络 -本章将介绍一种与到目前为止所看到的模型稍有不同的模型。 到目前为止提供的所有模型都属于一种称为判别模型的模型。 判别模型旨在找到不同类别之间的界限。 他们对找到 *P(Y | X)*-给定某些输入 *X* 的输出 *Y* 的概率感兴趣。 这是用于分类的自然概率分布,因为您通常要在给定一些输入 *X* 的情况下找到标签 *Y,*。 +本章将介绍一种与到目前为止所看到的模型稍有不同的模型。 到目前为止提供的所有模型都属于一种称为判别模型的模型。 判别模型旨在找到不同类别之间的界限。 他们对找到`P(Y|X)`-给定某些输入`X`的输出`Y`的概率感兴趣。 这是用于分类的自然概率分布,因为您通常要在给定一些输入`X`的情况下找到标签`Y`。 -但是,还有另一种类型的模型称为生成模型。 建立了生成模型以对不同类的分布进行建模。 他们对找到 *P(Y,X)*-输出 *Y* 和输入 *X* 一起出现的概率分布感兴趣。 从理论上讲,如果您可以捕获数据中类别的概率分布,则将了解更多信息,并且可以使用贝叶斯规则来计算 *P(Y | X)*。 +但是,还有另一种类型的模型称为生成模型。 建立了生成模型以对不同类的分布进行建模。 他们对找到`P(Y,X)`-输出`Y`和输入`X`一起出现的概率分布感兴趣。 从理论上讲,如果您可以捕获数据中类别的概率分布,则将了解更多信息,并且可以使用贝叶斯规则来计算`P(Y|X)`。 生成模型属于无监督学习算法的类别。 无监督意味着我们不需要标签数据。 @@ -34,7 +34,7 @@ 我们将要看到的第一个生成模型是自编码器模型。 自编码器是一个简单的神经网络,由两部分组成:**编码器**和**解码器**。 这个想法是编码器部分会将您的输入压缩到较小的尺寸。 然后,从这个较小的维度尝试使用模型的解码器部分重建输入。 通常用许多名称来称呼这种较小的尺寸,例如潜在空间,隐藏空间,嵌入或编码。 -如果自编码器能够再现其输入,则从理论上讲,该潜在空间应该对表示原始数据所需的所有重要信息进行编码,但其优点是尺寸小于输入。 编码器可以被认为是一种压缩输入数据的方式,而解码器是一种将其解压缩的方式。 在下图中,我们可以看到一个简单的自编码器的外观。 我们的潜在空间或编码是中间标记为 *z 的部分。* +如果自编码器能够再现其输入,则从理论上讲,该潜在空间应该对表示原始数据所需的所有重要信息进行编码,但其优点是尺寸小于输入。 编码器可以被认为是一种压缩输入数据的方式,而解码器是一种将其解压缩的方式。 在下图中,我们可以看到一个简单的自编码器的外观。 我们的潜在空间或编码是中间标记为`z`的部分。 ![](img/bace7dc4-4820-4dcd-934d-7215a3d8e4ce.png) @@ -133,9 +133,9 @@ with tf.name_scope("Solver"): 我们需要两个参数来跟踪并强制我们的 VAE 模型在潜在空间中产生正态分布: * **平均值**(应为零) -* **标准偏差**(应为 1) +* **标准差**(应为 1) -在下图中,我们给出了具有不同均值和标准偏差值的正态分布示例。 仅使用这两个值,我们就可以产生一个正态分布,可以从中采样: +在下图中,我们给出了具有不同均值和标准差值的正态分布示例。 仅使用这两个值,我们就可以产生一个正态分布,可以从中采样: ![](img/ce4aa377-1bf4-483a-ab86-23ab2b9dc716.jpg) @@ -160,23 +160,23 @@ KL 散度损失将产生一个数字,该数字指示两个分布彼此之间 # 训练 VAE -为了训练 VAE 并使用 KL 散度损失,我们首先需要研究如何生成潜矢量。 我们将使编码器产生两个向量,而不是让编码器直接精确地产生一个潜在向量。 第一个是平均值的向量**μ**,第二个是标准偏差值的向量**σ**。 根据这些,我们可以创建第三个向量,其中使用**μ**和**的 *i* th 值从高斯分布中采样 *i* 元素 σ**向量作为该高斯分布的均值和标准差。 然后,该第三采样矢量被发送到解码器。 +为了训练 VAE 并使用 KL 散度损失,我们首先需要研究如何生成潜矢量。 我们将使编码器产生两个向量,而不是让编码器直接精确地产生一个潜在向量。 第一个是平均值的向量`μ`,第二个是标准差值的向量`σ`。 根据这些,我们可以创建第三个向量,其中使用`μ`和`σ`从高斯分布中采样元素向量的第`i`个值作为该高斯分布的均值和标准差。 然后,该第三采样矢量被发送到解码器。 现在,我们的模型如下所示: ![](img/944095bc-4bde-4e04-86e3-1ccc3e0b1c04.png) -上图中的均值和标准偏差块将只是正常的全连接层,它们将通过 KL 损失函数来学习如何返回所需的值。 更改我们如何获得潜矢量的原因是因为它使我们能够轻松计算 KL 散度损失。 KL 损失现在如下:`latent_mean`为**μ**,`latent_stddev`为**σ**: +上图中的均值和标准差块将只是正常的全连接层,它们将通过 KL 损失函数来学习如何返回所需的值。 更改我们如何获得潜矢量的原因是因为它使我们能够轻松计算 KL 散度损失。 KL 损失现在如下:`latent_mean`为`μ`,`latent_stddev`为`σ`: ```py 0.5 * tf.reduce_sum(tf.square(latent_mean) + tf.square(latent_stddev) - tf.log(tf.square(latent_stddev)) - 1, 1) ``` -不幸的是,有一个 **Sample** 块,您可以将其视为随机生成器节点,无法区分。 这意味着我们不能使用反向传播来训练我们的 VAE。 我们需要一种称为“重新参数化”技巧的东西,该技巧将从反向传播流中取出采样。 +不幸的是,有一个**样本**块,您可以将其视为随机生成器节点,无法区分。 这意味着我们不能使用反向传播来训练我们的 VAE。 我们需要一种称为“重新参数化”技巧的东西,该技巧将从反向传播流中取出采样。 # 重新参数化技巧 -重新参数化技巧的想法是从反向传播循环中取出随机样本节点。 它是通过从高斯分布中获取样本ε,然后将其乘以我们的标准偏差矢量**σ**的结果,然后加上**μ**来实现的。 现在,我们的潜在向量的公式是: +重新参数化技巧的想法是从反向传播循环中取出随机样本节点。 它是通过从高斯分布中获取样本ε,然后将其乘以我们的标准差矢量`σ`的结果,然后加上`μ`来实现的。 现在,我们的潜在向量的公式是: ![](img/16915d9b-677d-4f06-b381-1fe5e7353406.jpg) @@ -336,7 +336,7 @@ class VAE_CNN_GEN(object): 让我们总结一下 GAN 模型的两个主要模块或网络: * **生成器**:使用大小为 N 的一维矢量作为输入,创建类似于*真实图像*数据集的图像(选择 N 取决于我们) -* **鉴别符**:验证提供给它的图像是真实的还是伪造的 +* **判别器**:验证提供给它的图像是真实的还是伪造的 GAN 的一些实际用法如下: @@ -385,30 +385,30 @@ def generator(z): ![](img/1d24b043-c4b8-42f0-8f9c-8f2c7db22ec3.png) -在这里,D 是我们的鉴别符,G 是我们的生成器,z 是输入到生成器的随机矢量,x 是真实图像。 尽管我们在此处给出了 GAN 损失的总和,但实际上更容易分别考虑这两种优化。 +在这里,D 是我们的判别器,G 是我们的生成器,z 是输入到生成器的随机矢量,x 是真实图像。 尽管我们在此处给出了 GAN 损失的总和,但实际上更容易分别考虑这两种优化。 -为了训练 GAN,我们将在鉴别器和生成器之间交替进行梯度步骤更新。 在更新鉴别符时,我们要尝试使**最大化**鉴别符做出**正确选择**的概率。 在更新生成器时,我们想尝试使**最小化**鉴别器做出**正确选择**的可能性。 +为了训练 GAN,我们将在鉴别器和生成器之间交替进行梯度步骤更新。 在更新判别器时,我们要尝试使**最大化**判别器做出**正确选择**的概率。 在更新生成器时,我们想尝试使**最小化**鉴别器做出**正确选择**的可能性。 但是,为了实际实现,我们将与之前给出的内容相比,稍微改变 GAN 损失函数; 这样做是为了帮助训练收敛。 变化是,当更新生成器时,而不是**最小化**鉴别器做出**正确选择**的可能性; 我们改为**最大化**判别器做出**错误选择**的概率: ![](img/5222b764-d50d-4fbc-9747-47a475579e50.png) -更新鉴别符时,我们尝试使**最大化**,它对真实数据和伪数据均做出正确选择的可能性: +更新判别器时,我们尝试使**最大化**,它对真实数据和伪数据均做出正确选择的可能性: ![](img/82987b0d-594f-4f08-9c76-436c0ec89fbc.png) # 发电机损耗 -生成器想要欺骗鉴别器,换句话说,使鉴别器输出 *1* 用于生成的图像 *G(z)*。 发生器损失只是施加到发生器结果的鉴别器输出的二项式交叉熵损失的负值。 请注意,由于生成器始终尝试生成“真实”图像,因此交叉熵损失可简化为: +生成器想要欺骗鉴别器,换句话说,使鉴别器输出`q`用于生成的图像`G(z)`。 发生器损失只是施加到发生器结果的鉴别器输出的二项式交叉熵损失的负值。 请注意,由于生成器始终尝试生成“真实”图像,因此交叉熵损失可简化为: ![](img/1761cebc-4eca-4a0f-81cf-9a128632ee81.png) 在这里,每个术语的含义如下: -* **m** :批量 -* **D** :鉴别器 -* **G** :生成器 -* **z** :随机噪声向量 +* `m`:批量 +* `D`:鉴别器 +* `G`:生成器 +* `z`:随机噪声向量 我们想在训练 GAN 时最大化损失函数。 当损失最大化时,这意味着生成器能够生成可能使鉴别器蒙蔽的图像,并且鉴别器针对生成的图像输出 1。 @@ -418,8 +418,8 @@ def generator(z): 此损失函数有两个术语: -* 应用于鉴别器模型的二项式交叉熵产生了一些真实数据 *x* -* 将二项式交叉熵应用于所生成数据 *G(z)*的鉴别器模型结果 +* 应用于鉴别器模型的二项式交叉熵产生了一些真实数据`x` +* 将二项式交叉熵应用于所生成数据`G(z)`的鉴别器模型结果 如前所述,我们采取这些不利条件,并希望在训练 GAN 时最大化此损失函数。 当这种损失最大化时,这意味着鉴别器能够区分实际输出和生成的输出。 注意,当鉴别器对于真实图像输出 1 而对于所生成图像输出 0 时,该损失最大。 @@ -607,15 +607,15 @@ BEGAN 的一些优点如下: # 有条件的 GAN -条件 GAN 是普通 GAN 的扩展,其中鉴别器和生成器都被设置为某些特定类别 *y。* 这具有有趣的应用程序,因为您可以将生成器固定到特定的类,然后使其生成我们选择的特定同一类的多个不同版本。 例如,如果将 *y* 设置为与 MNIST 中的数字 7 对应的标签,则生成器将仅生成 7 的图像。 +条件 GAN 是普通 GAN 的扩展,其中鉴别器和生成器都被设置为某些特定类别`y`。这具有有趣的应用程序,因为您可以将生成器固定到特定的类,然后使其生成我们选择的特定同一类的多个不同版本。 例如,如果将`y`设置为与 MNIST 中的数字 7 对应的标签,则生成器将仅生成 7 的图像。 使用条件 GAN,minimax 游戏变为: ![](img/ade35614-04cc-4447-b1a0-b8e94dc0ce7a.png) -在这里,我们依赖于额外输入 *y* ,它是输入图像的类标签。 +在这里,我们依赖于额外输入`y`,它是输入图像的类标签。 -合并 *x* 和 *y,*或 *z* 和 *y,*的最简单方法是将它们串联在一起,这样我们的输入向量就是 更长。 这将创建一个更加受控制的数据集扩充系统。 这是 TensorFlow 代码中的一个示例: +合并`x`和`y`,或`z`和`y`的最简单方法是将它们串联在一起,这样我们的输入向量就是 更长。 这将创建一个更加受控制的数据集扩充系统。 这是 TensorFlow 代码中的一个示例: ![](img/63ca28dd-5605-482d-95b3-4e1c027f3c89.jpg) @@ -642,7 +642,7 @@ GAN 当前最大的问题是,它们很难训练。 幸运的是,有一些技 # 模式崩溃 -这可能是您在训练 GAN 时遇到的第一个问题。 当生成器找到一组特定的输入来欺骗鉴别器时,就会发生模式崩溃,并且它会继续利用这种故障情况并将潜伏 *Z* 空间中的许多值折叠为相同的值。 +这可能是您在训练 GAN 时遇到的第一个问题。 当生成器找到一组特定的输入来欺骗鉴别器时,就会发生模式崩溃,并且它会继续利用这种故障情况并将潜伏`Z`空间中的许多值折叠为相同的值。 解决此问题的一种方法是使用“迷你批处理功能”或“展开甘斯”,或者完全停止训练,然后在生成器开始创建非常狭窄的输出分布时重新开始: @@ -681,4 +681,4 @@ GAN 当前最大的问题是,它们很难训练。 幸运的是,有一些技 在本章中,我们了解了生成模型及其与判别模型的不同之处。 我们还讨论了各种自编码器,包括深度,变体和卷积。 此外,我们了解了一种新型的生成模型,称为生成对抗网络(GAN)。 在了解了所有这些生成模型之后,我们看到了如何在 TensorFlow 中自己训练它们以生成手写数字,并看到了它们可以产生的不同质量的图像。 -在第 7 章,*迁移学习*中,我们将学习迁移学习及其如何帮助我们加快训练速度。 \ No newline at end of file +在第 7 章,“迁移学习”中,我们将学习迁移学习及其如何帮助我们加快训练速度。 \ No newline at end of file -- GitLab