From 4c6db4e7a5260a3ebeeccb9633484c4f2d7cecff Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Mon, 14 Sep 2020 11:13:12 +0800 Subject: [PATCH] 2020-09-14 11:13:12 --- docs/handson-cnn-tf/1.md | 6 +++--- docs/handson-cnn-tf/2.md | 12 +++++++----- docs/handson-cnn-tf/3.md | 6 +++--- docs/handson-cnn-tf/6.md | 4 +++- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/docs/handson-cnn-tf/1.md b/docs/handson-cnn-tf/1.md index 3efd8fbe..8f06f26c 100644 --- a/docs/handson-cnn-tf/1.md +++ b/docs/handson-cnn-tf/1.md @@ -316,7 +316,7 @@ initializer = tf.global_variables_initializer() 要训​​练我们的模型,我们必须定义一些称为损失函数的函数。 损失函数将告诉我们我们的模型目前做得如何好坏。 -损失可在`tf.losses`模块中找到。 对于此模型,我们将使用铰链损耗。 铰链损耗是创建**支持向量机**(**SVM**)时使用的损耗函数。 铰链损失严重惩罚了错误的预测。 对于一个给定的示例![](img/e4655c62-f4c7-4ac5-b435-8c8f4081016c.png),其中![](img/815f18aa-759e-4460-ba09-b6ade1d1caf5.png)是数据点的特征向量,![](img/f58f1ac7-cc4b-4fac-b17b-8f5d92f64c49.png)是其标记,其铰链损耗如下: +损失可在`tf.losses`模块中找到。 对于此模型,我们将使用铰链损耗。 铰链损耗是创建**支持向量机**(**SVM**)时使用的损耗函数。 铰链损失严重惩罚了错误的预测。 对于一个给定的示例`(x[i], y[i])`,其中`x[i]`是数据点的特征向量,`y[i]`是其标记,其铰链损耗如下: ![](img/18f2de01-7b99-4a9d-a016-fd44db07e0b5.png) @@ -348,13 +348,13 @@ loss = tf.reduce_mean(tf.losses.hinge_loss(logits=model_out, labels=y)) 现在我们定义了要使用的损失函数; 我们可以使用这个损失函数来训练我们的模型。 如前面的方程式所示,损耗函数是权重和偏差的函数。 因此,我们要做的就是详尽地搜索权重和偏差的空间,并查看哪种组合最大程度地减少了损失。 当我们具有一维或二维权向量时,此过程可能还可以,但是当权向量空间太大时,我们需要一个更有效的解决方案。 为此,我们将使用一种名为**梯度下降**的优化技术。 -通过使用损失函数和演算,梯度下降法可以看到如何调整模型权重和偏差的值,以使损失值减小。 这是一个迭代过程,需要多次迭代才能针对我们的训练数据对权重和偏差的值进行适当调整。 这个想法是,通过相对于目标函数![](img/9530e4e9-229a-4d8a-9314-de81cd1259bc.png) w 的梯度的相反方向更新参数,可以最小化由权重`w`参数化的损失函数`L`。 权重和偏差的更新功能如下所示: +通过使用损失函数和演算,梯度下降法可以看到如何调整模型权重和偏差的值,以使损失值减小。 这是一个迭代过程,需要多次迭代才能针对我们的训练数据对权重和偏差的值进行适当调整。 这个想法是,通过相对于目标函数`ᐁ[w]L(w)`的梯度的相反方向更新参数,可以最小化由权重`w`参数化的损失函数`L`。 权重和偏差的更新功能如下所示: ![](img/56711c81-eedc-45e4-82ae-b0bcacc0d52c.png) ![](img/e4fc664a-e5c2-4fc9-b18e-678055a6782a.png) -在这里,![](img/580f5aaf-7c8b-432c-977a-4b6f774462b4.png)是迭代次数,![](img/4f52cf0a-7b12-4259-b6bd-5c208e68a6ad.png)是称为学习率的超参数。 +在这里,`t`是迭代次数,`α`是称为学习率的超参数。 由两个变量`w1`和`w2`参数化的损失函数将如下图所示: diff --git a/docs/handson-cnn-tf/2.md b/docs/handson-cnn-tf/2.md index 8c7f1afe..9752a1fb 100644 --- a/docs/handson-cnn-tf/2.md +++ b/docs/handson-cnn-tf/2.md @@ -440,7 +440,9 @@ TensorFlow 卷积操作为您提供了两种用于填充需求的选项:相同 通常,我们可以使用以下公式计算卷积运算的输出大小: -![](img/0ef1adda-27e2-4f34-8ecf-c6290ffff544.png),![](img/67287ebe-dbe6-4c4c-aaf7-5f0e3eee0428.png) +![](img/0ef1adda-27e2-4f34-8ecf-c6290ffff544.png) + +![](img/67287ebe-dbe6-4c4c-aaf7-5f0e3eee0428.png) (这里,pad 是添加到每个边框的零的数量。) @@ -578,10 +580,10 @@ tf.layers.max_pooling2d(inputs=some_input_layer, pool_size=[2, 2], strides=2) 在这里,组件如下: -* ![](img/a7f7c3ff-5d04-4af7-9f6c-33f23f3424e5.png):k 层的感受域 -* ![](img/7766947c-888c-43ea-b00e-9c23280dee08.png):第 k 层的内核大小 -* ![](img/383c173c-2090-4aa3-bb63-86181ec0e729.png):从第 i 层(1..k-1)跨步 -* ![](img/89e2bd31-53be-4660-a85b-0938aa3276bf.png):所有步长的乘积直到第 k-1 层(所有先前的层,而不是当前的一层) +* `R[k]`:k 层的感受域 +* `Kernel[k]`:第 k 层的内核大小 +* `S[i]`:从第 i 层(1..k-1)跨步 +* `∏s[i], i=1..(k-1)`:所有步长的乘积直到第 k-1 层(所有先前的层,而不是当前的一层) 仅对于第一层,接收域就是内核大小。 diff --git a/docs/handson-cnn-tf/3.md b/docs/handson-cnn-tf/3.md index 67531a98..f2ce65b1 100644 --- a/docs/handson-cnn-tf/3.md +++ b/docs/handson-cnn-tf/3.md @@ -59,17 +59,17 @@ `i`是我们标签和预测的每个可能元素的索引。 -但是,当我们处理只有两个可能结果 y = 1 和 y = 0 的二元情况时,可以简化 p ![](img/3650d030-8116-4a21-a375-705a9246f7b0.png) {![](img/0afb24f4-1a7e-4684-8840-d68759f8c533.png)}和 q ![](img/e65b665e-d509-4b75-a50c-b59e17395df2.png) {![](img/d7ae08fd-fd8d-4d8b-8683-4a14dcb66466.png)} 我们得到: +但是,当我们处理只有两个可能结果 y = 1 和 y = 0 的二元情况时,可以简化`p ∈ {y, 1-y}`和`q ∈ {y_hat, 1-y_hat}`我们得到: ![](img/5ec5f2c3-86c8-406a-938a-ec371e7919d5.png) 这是等效的 -迭代![](img/b2408251-310a-4215-8cad-5e4da25c52d0.png)训练示例,将要最小化的成本函数`L`变为: +迭代`m`训练示例,将要最小化的成本函数`L`变为: ![](img/07a806c2-2a49-41a4-ba69-c3adee95a705.png) -这在直觉上是正确的,因为当![](img/c4e8a23d-48cb-41ef-83b8-b99014f01caf.png)时,我们要最小化需要大![](img/c99b624f-2c53-4830-b652-097ff277404e.png)的![](img/b3c76e2e-6082-4ee3-9f9e-e4c9729fc551.png);当![](img/820eae1c-4566-4245-83a6-ed72af7690fd.png)时,我们要最小化![](img/723646a7-5c3e-4876-a5d5-118bd4e1fc44.png)的我们要最小化![](img/a2de4135-a00f-402a-952f-0a52075e3943.png)。 +这在直觉上是正确的,因为当`y=1`时,我们要最小化`L(y, y_hat) = - log(y_hat)`,需要最大化`y_hat`;当`y=0`时,我们要最小化`L(y, y_hat) = - log(1 - y_hat)`,需要最小化`y_hat`。 在 TensorFlow 中,可以在`tf.losses`模块中找到二进制交叉熵损失。 知道我们模型的原始输出![](img/811ffc49-acd0-4f5c-a4e4-eab74c6e581c.png)的名称是 logits 很有用。 在将其传递给交叉熵损失之前,我们需要对其应用 **Sigmoid** 函数,以便我们的输出在 0 到 1 之间缩放。TensorFlow 实际上将所有这些步骤组合为一个操作,如 下面的代码。 TensorFlow 还将为我们平均分批处理损失。 diff --git a/docs/handson-cnn-tf/6.md b/docs/handson-cnn-tf/6.md index edc93549..630f809e 100644 --- a/docs/handson-cnn-tf/6.md +++ b/docs/handson-cnn-tf/6.md @@ -414,7 +414,9 @@ def generator(z): # 鉴别器损失 -鉴别者希望能够区分真实图像和生成图像。 它想为真实图像输出 1,为生成图像输出 0。 鉴别器损失函数具有以下公式,由于 GAN 训练和标记的工作方式而再次简化:![](img/6afbb7c8-d706-49dc-b74b-f8d9f894e8d3.png) +鉴别者希望能够区分真实图像和生成图像。 它想为真实图像输出 1,为生成图像输出 0。 鉴别器损失函数具有以下公式,由于 GAN 训练和标记的工作方式而再次简化: + +![](img/6afbb7c8-d706-49dc-b74b-f8d9f894e8d3.png) 此损失函数有两个术语: -- GitLab