提交 781ea579 编写于 作者: W wizardforcel

2020-09-14 11:45:38

上级 4c6db4e7
......@@ -71,7 +71,7 @@
这在直觉上是正确的,因为当`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 还将为我们平均分批处理损失。
在 TensorFlow 中,可以在`tf.losses`模块中找到二进制交叉熵损失。 知道我们模型的原始输出`y_hat`的名称是 logits 很有用。 在将其传递给交叉熵损失之前,我们需要对其应用 **Sigmoid** 函数,以便我们的输出在 0 到 1 之间缩放。TensorFlow 实际上将所有这些步骤组合为一个操作,如 下面的代码。 TensorFlow 还将为我们平均分批处理损失。
```py
loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=labels_in, logits=model_prediction)
......@@ -83,11 +83,11 @@ loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=labels_in, logits=mode
![](img/b53e5bab-5f7a-4cf0-b749-92b36255f365.png)
在此,![](img/66307b67-080c-4c61-ae4a-3fa14f58bdef.png)为 0 或 1,表示类别标签![](img/5e2d48c5-bbb7-4d73-a35f-21f619196f87.png)是否是用于预测![](img/1e880ac2-aa6e-4739-9ca9-c9b6f5a86036.png)的正确分类。 要使用此损耗,我们首先需要向模型中最终 FC 层的输出![](img/ee64b3f7-99fb-4146-b6cc-816dd90b96ae.png)添加 softmax 激活。 交叉熵与 softmax 的组合如下所示:
在此,`y^(k)`为 0 或 1,表示类别标签`k`是否是用于预测`y_hat^(k)`的正确分类。 要使用此损耗,我们首先需要向模型中最终 FC 层的输出`y_hat`添加 softmax 激活。 交叉熵与 softmax 的组合如下所示:
![](img/208109f6-4aed-4f92-bbfc-eb093331aadd.png)
知道我们模型的原始输出![](img/1a632480-8569-43ce-a34a-1475707ce340.png)的名称是 logits 很有用。 Logits 是传递给 softmax 函数的内容。 softmax 函数是 S 型函数的多类版本。 一旦通过 softmax 函数,我们就可以使用我们的多类交叉熵损失。 TensorFlow 实际上将所有这些步骤组合为一个操作,如下所示:
知道我们模型的原始输出`y_hat`的名称是 logits 很有用。 Logits 是传递给 softmax 函数的内容。 softmax 函数是 S 型函数的多类版本。 一旦通过 softmax 函数,我们就可以使用我们的多类交叉熵损失。 TensorFlow 实际上将所有这些步骤组合为一个操作,如下所示:
```py
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model_logits, labels=labels_in))
......@@ -130,9 +130,9 @@ ImageNet 数据集由 Alex Berg(哥伦比亚大学),Jia Deng(普林斯
自 2010 年以来,一年一度的 ImageNet 大规模视觉识别挑战赛(ILSVRC)挑战集中于图像分类,单对象定位和检测。 对象分类挑战的数据包括 120 万张图像(来自 1000 个类别/同义词),训练数据,50,000 张验证数据图像和 100,000 张测试数据图像。
在分类挑战中,用于评估算法的主要指标是前 5 位错误率。 该算法允许给出五个预测类别,并且如果至少一个预测类别与地面真相标签匹配,则不会受到惩罚。
在分类挑战中,用于评估算法的主要指标是前 5 位错误率。 该算法允许给出五个预测类别,并且如果至少一个预测类别与真实情况标签匹配,则不会受到惩罚。
正式地,如果我们让![](img/98d6f30f-1c72-4cec-92cf-f6ccd95c271d.png)为图像,让![](img/3c40eb89-0f79-41d8-8b51-dcbb7b3bbe2a.png)为地面真相标签。 然后,我们有了预测的标签![](img/55a0bddf-7126-4132-b169-819ad4a62bdd.png),其中至少一个等于![](img/537d3e8a-b1b3-4d82-97d5-3404bd605635.png)才能将其视为成功的预测。 考虑预测误差如下:
正式地,如果我们让`i`为图像,让`C[i]`为真实情况标签。 然后,我们有了预测的标签`c[ij], j ∈ [1, 5]`,其中至少一个等于`C[i]`才能将其视为成功的预测。 考虑预测误差如下:
![](img/6436a6ce-fd4b-463c-b195-3c34040e17df.png)
......@@ -546,19 +546,23 @@ decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
# Xavier-Bengio 和初始化器
在了解*训练深度前馈神经网络*的难度时,Xavier Glorot 和 Yoshua Bengio 表明,如果从均匀分布![](img/5a4de500-3124-48fe-95cc-3334edf40879.png)初始化每一层的权重,其中![](img/52111d38-7c16-45b3-98e6-8be01332fad5.png)是大小 在上一层中,对于乙状结肠激活函数,顶层(更靠近输出)的神经元迅速饱和为 0。我们知道,由于乙状结肠函数的形式,激活值 0 表示权重非常大,并且 反向传播的梯度接近零。 较小的梯度值会减慢学习过程,因为早期图层中的权重停止更新或停止学习。
在了解*训练深度前馈神经网络*的难度时,Xavier Glorot 和 Yoshua Bengio 表明,如果从均匀分布`U ~ [-1/√n, 1/√n]`初始化每一层的权重,其中`n`是大小 在上一层中,对于乙状结肠激活函数,顶层(更靠近输出)的神经元迅速饱和为 0。我们知道,由于乙状结肠函数的形式,激活值 0 表示权重非常大,并且 反向传播的梯度接近零。 较小的梯度值会减慢学习过程,因为早期图层中的权重停止更新或停止学习。
因此,我们想要的是使权重在最初确定的时间间隔内均匀分布,也就是说,权重的方差应该在我们从底层移动到顶层时保持不变。 这将使错误平稳地流到顶层,从而使网络在训练期间收敛更快。
为了实现这一点,Glorot 和 Bengio 证明了对于单位导数为 0 的对称激活函数 f,每一层的权重方差必须如下:![](img/dc439c6f-2535-4f33-9412-d579615c20bb.png)
为了实现这一点,Glorot 和 Bengio 证明了对于单位导数为 0 的对称激活函数 f,每一层的权重方差必须如下:
在此,![](img/51a6011e-63da-404f-9e0e-675dd447cab4.png)是到所讨论的层的单元数,![](img/0c0533e4-5f13-4662-a3f6-1aa67b730048.png)是在下一层的单元数。 这意味着权重必须从以下均匀分布中采样:
![](img/dc439c6f-2535-4f33-9412-d579615c20bb.png)
在此,`n[in]`是到所讨论的层的单元数,`n[out]`是在下一层的单元数。 这意味着权重必须从以下均匀分布中采样:
![](img/b802c1b0-4ed0-4d2f-87c4-57fd4027e470.png)
我们还可以从零均值和前面的方差的正态分布中采样权重。 对于 ReLu 激活功能,He 等人证明了这一点。 方差应该改为![](img/f093a9d2-6556-437c-b66d-541edccd858f.png)
我们还可以从零均值和前面的方差的正态分布中采样权重。 对于 ReLu 激活功能,He 等人证明了这一点。 方差应该改为:
![](img/f093a9d2-6556-437c-b66d-541edccd858f.png)
因此,作者使用零均值高斯分布初始化其权重,其标准差(std)为![](img/54a6c0be-d7b4-4bc7-a075-16da0f29d2f0.png)。 然后将该初始化称为 He 初始化。
因此,作者使用零均值高斯分布初始化其权重,其标准差(std)为`√(2/n[in])`。 然后将该初始化称为 He 初始化。
默认情况下,TensorFlow 的大部分`tf.layers`都使用 Glorot(xavier)初始化程序,但是我们可以覆盖它并指定我们自己的初始化。 在这里,我们展示了一个如何覆盖`conv2d`层的默认初始化器的示例:
......@@ -586,13 +590,17 @@ bias_initializer=tf.zeros_initializer())
创建更强大模型的第一种方法是使用 L1 或 L2 正则化。 到目前为止,这些是最常见的正则化方法。 基本思想是在训练模型时,我们积极尝试使用这些权重的 L1 或 L2 范数对模型权重的值施加一些约束。
为此,我们在使用的任何损失函数中增加了一个额外的项。 对于 L1 正则化,我们添加的术语是![](img/c268cf6e-ae76-4959-97fa-cc3cec5a6481.png),对于 L2 正则化,我们添加的术语是![](img/ed95b274-32f1-4c6a-80fc-3843d1c55f48.png)。 在前面的术语中,![](img/1104730d-78f3-469a-bc47-be1042611784.png)是我们网络中的所有权重,![](img/325652fe-77e5-434c-ae47-8c4d05c6daa0.png)是称为**正则化强度**的超参数。 通过添加该术语,我们可以防止权重值变得太大。
为此,我们在使用的任何损失函数中增加了一个额外的项。 对于 L1 正则化,我们添加的术语是`λ |w|`,对于 L2 正则化,我们添加的术语是`0.5 λ w^2`。 在前面的术语中,`w`是我们网络中的所有权重,`λ`是称为**正则化强度**的超参数。 通过添加该术语,我们可以防止权重值变得太大。
因此,用于[L1 正则化]的第 1 章,“TensorFlow 简介和设置”的 SVM 损失函数,即:
![](img/cfe9a672-085c-42e6-a838-2f8620ea6afb.png)
因此,用于[L1 正则化]的第 1 章,“TensorFlow 简介和设置”的 SVM 损失函数,即![](img/cfe9a672-085c-42e6-a838-2f8620ea6afb.png)变为:
变为:
![](img/77172207-ce67-4347-b51e-bf6565a195fd.png)
在这里,我们添加了对网络所有权重求和的正则化项。 此处,![](img/79c3facc-6820-4331-81de-13ffd441a44e.png)是层索引,![](img/a768718b-3d2d-4584-825b-4b7007032c3b.png)是每一层的权重矩阵的索引。 L2 正则化的表达式看起来类似。
在这里,我们添加了对网络所有权重求和的正则化项。 此处,`l`是层索引,`m, n`是每一层的权重矩阵的索引。 L2 正则化的表达式看起来类似。
对于 L1 正则化,此额外项鼓励权重向量变得稀疏,这意味着许多权重值变为零。 结果,该模型变得不受噪声输入的影响,因为权重向量将仅使用重要输入的子集,这有助于避免过拟合。
......@@ -683,13 +691,13 @@ fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
* 给您的模型某种正则化效果
* 使得可以使用饱和非线性,例如 S 型
对于更多的数学读者,可以在批处理规范论文《批处理规范化:通过减少内部协变量偏移来加速深层网络训练》中找到更为正式的定义,这是一篇写得很好的论文,易于理解和解释。 更详细的概念。 如果假设我们有一个仅具有全连接层的简单神经网络,则正如我们在第 1 章,“TensorFlow 简介和设置”中所看到的,每一层的激活将是 ![](img/9d0ff275-b662-433d-b367-ac3ac9b46b54.png)表格。
对于更多的数学读者,可以在批处理规范论文《批处理规范化:通过减少内部协变量偏移来加速深层网络训练》中找到更为正式的定义,这是一篇写得很好的论文,易于理解和解释。 更详细的概念。 如果假设我们有一个仅具有全连接层的简单神经网络,则正如我们在第 1 章,“TensorFlow 简介和设置”中所看到的,每一层的激活将是`s = f(x; W, b) = W · x + b`表格。
假设![](img/c0d727f5-4add-40b7-95df-07d67752638f.png)是非线性的,例如 S 型或 ReLU,然后将批量归一化![](img/fb58ac38-9b3e-4f29-b02e-ee58df896884.png)直接应用于每个单元,例如:
假设`g(·)`是非线性的,例如 S 型或 ReLU,然后将批量归一化`BN(·)`直接应用于每个单元,例如:
![](img/f6f795f4-9365-4b91-a0de-82a9af9f7fca.png)
在这里,可以忽略偏差,因为它将通过均值减法消除。 如果我们的批次大小为![](img/c70951bb-1f7b-4c20-ab3c-0bc131baabde.png),则标准化激活![](img/9ea2becf-9055-4ac0-af74-61edb68ed2d2.png)的计算如下:
在这里,可以忽略偏差,因为它将通过均值减法消除。 如果我们的批次大小为`m`,则标准化激活`s[i]^(BN)`的计算如下:
![](img/56f97aa9-6ca0-4d54-b7ce-09718a1ec857.png)
......@@ -699,7 +707,7 @@ fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
![](img/beb96e74-a946-4584-ae02-9f859031dc96.png)
其中![](img/7efb4c88-3a90-42ce-9099-4f26eac1c76b.png)和![](img/8adf7c5a-5001-4ad1-9cf6-f9e470d6a2b7.png)是可学习的参数,它们将缩放并移动您的标准化激活。 网络可以使用这些参数来决定是否需要标准化以及需要多少标准化。 这是正确的,因为如果我们设置![](img/53c19172-7f05-423d-ad0a-ad31b5197e5b.png)和![](img/4fc9cbe4-89e5-4b0a-9e8e-c5751d18dc5e.png),则设置![](img/f646cc18-2504-47fd-9a31-90b5aeaaf880.png)
其中`γ``β`是可学习的参数,它们将缩放并移动您的标准化激活。 网络可以使用这些参数来决定是否需要标准化以及需要多少标准化。 这是正确的,因为如果我们设置`β = μ``γ = √(δ^s + ε)`,则设置`s[i]^(BN) = s[i]`
最后,这是一个如何在本章开始的分类示例代码中使用批处理规范层的示例。 在这种情况下,我们将 batchnorm 层放在卷积层之后和激活函数之前:
......
......@@ -51,7 +51,7 @@
从图中可以清楚地看到三个全连接层,每个层都输出不同的损耗(状态,类和框)。 使用的损失是逻辑回归/对数损失,交叉熵/ softmax 损失和 Huber 损失。 胡贝尔损失是我们从未见过的损失。 这是用于回归的损失,是 L1 和 L2 损失的一种组合。
局部化的回归损失给出了图像中对象的地面真实边界框坐标与模型预测的边界框坐标之间的某种相似度度量。 我们在这里使用 Huber 损失,但是可以使用各种不同的损失函数,例如 L2,L1 或平滑 L1 损失。
局部化的回归损失给出了图像中对象的真实情况边界框坐标与模型预测的边界框坐标之间的某种相似度度量。 我们在这里使用 Huber 损失,但是可以使用各种不同的损失函数,例如 L2,L1 或平滑 L1 损失。
分类损失和局部损失被合并并通过标量比加权。 此处的想法是,如果首先存在一个对象,则我们只对反向传播分类和边界框损失感兴趣。
......@@ -184,7 +184,7 @@ RPN 的工作是预测我们称为锚点的对象(本质上只是一个边界
![](img/7c57ffe8-af41-47a0-b295-5aeb633e866f.png)
在内部,在训练过程中,我们选择 IoU 最大的锚定边界框和地面真实边界框进行反向传播。
在内部,在训练过程中,我们选择 IoU 最大的锚定边界框和真实情况边界框进行反向传播。
# RoI 汇聚层
......@@ -222,7 +222,7 @@ RoI 层的输入将是建议和最后的卷积层激活。 例如,考虑以下
在本节中,我们将继续介绍一种稍有不同的对象检测器,称为单发检测器。 单发检测器尝试将对象检测伪装为回归问题。 此类别下的主要架构之一是 YOLO 架构(您只看一次),我们现在将对其进行详细介绍。
YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输入图像中各个位置的预测计算。为实现此目的,网络以大小为![](img/a70666c6-6cd7-4919-8f13-5e4a4ea873b5.png)单元格的网格形式输出特征图。
YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输入图像中各个位置的预测计算。为实现此目的,网络以大小为`N x N`单元格的网格形式输出特征图。
每个单元格都有`B * 5 + C`条目。 其中`B`是每个单元格的边界框的数量,C 是类概率的数量,而 5 是每个边界框的元素(x,y:边界框相对于其所在单元格的中心点坐标, `w`是相对于原始图像的边界框的宽度, `h`是相对于原始图像的边界框的高度,置信度:边界框中对象存在的可能性)。
......@@ -230,7 +230,7 @@ YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输
![](img/f044a469-78d5-4625-bbcc-c6fa810e8d88.png)
如果单元格中没有对象,则将为零。 否则将等于地面真值框与预测框之间的 IOU。
如果单元格中没有对象,则将为零。 否则将等于真实情况框与预测框之间的 IOU。
请注意,网格的每个单元格都负责预测固定数量的边界框。
......@@ -264,7 +264,7 @@ YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输
![](img/1240f8dd-6aba-4dde-b00a-384cac6c7295.png)
第一个条目是类别![](img/d1365f23-8d32-4254-ab51-1f228e448671.png)存在的置信度得分,对于没有对象的单元格中的两个锚定框,该得分均为 0。 其余值将*无关*。 单元格编号 8 有一个对象,并且对象的边界框具有较高的 IOU。
第一个条目是类别`P[c]`存在的置信度得分,对于没有对象的单元格中的两个锚定框,该得分均为 0。 其余值将*无关*。 单元格编号 8 有一个对象,并且对象的边界框具有较高的 IOU。
对于大小为 NxM 的输入训练图像,训练后从 ConvNet 输出的目标向量的最终体积将为 3x3x16(在此玩具示例中)
......@@ -284,7 +284,7 @@ YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输
# 评估检测(并口交集)
在继续进行之前,我们需要知道如何衡量我们的模型是否正确检测到物体。 为此,我们计算会返回一个数字的联合交叉点(IoU),根据某个参考(地面真相)告诉我们检测的效果如何。 IoU 的计算方法是:将检测和地面真理框彼此重叠的区域除以检测和地面真理框所覆盖的总面积:
在继续进行之前,我们需要知道如何衡量我们的模型是否正确检测到物体。 为此,我们计算会返回一个数字的联合交叉点(IoU),根据某个参考(真实情况)告诉我们检测的效果如何。 IoU 的计算方法是:将检测和地面真理框彼此重叠的区域除以检测和地面真理框所覆盖的总面积:
![](img/8a083f5a-2925-4206-abc5-7cdfc4a3ba0b.png)
......@@ -417,7 +417,7 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
# 检测器损耗功能(YOLO 损耗)
作为定位器,YOLO 损失函数分为三个部分:负责查找边界框坐标,边界框分数预测和类分数预测的部分。 它们都是均方误差损失,并由预测和地面真实情况之间的一些标量元参数或 IoU 得分进行调制:
作为定位器,YOLO 损失函数分为三个部分:负责查找边界框坐标,边界框分数预测和类分数预测的部分。 它们都是均方误差损失,并由预测和真实情况情况之间的一些标量元参数或 IoU 得分进行调制:
![](img/7b0edf3c-b27d-4d1a-952d-ad10176656fd.png)
......@@ -430,9 +430,11 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
# 损失第 1 部分
![](img/957dd494-38eb-4b48-9961-30a36494c0dd.png)第一部分计算与预测的边界框位置坐标![](img/0d6e23ab-6be1-47e0-9001-cf98da676c4d.png)相关的损耗。 ![](img/dc710dce-5f37-4916-bcbf-4a3a46644025.png)是训练集中地面真实数据的边界框坐标。
![](img/957dd494-38eb-4b48-9961-30a36494c0dd.png)
![](img/87ac2a79-feb5-4ee8-aa26-a5339f3f683a.png)表示一个常数,当有错误时,该常数将给予更多的补偿。 B 是边界框的数量。 ![](img/7999da7f-1eb2-4a09-b5bc-5671ec7fa796.png)是网格中的单元数。
第一部分计算与预测的边界框位置坐标`(x, y)`相关的损耗。 `(x_hat, y_hat)`是训练集中真实情况数据的边界框坐标。
`λ[coord] = 5.0`表示一个常数,当有错误时,该常数将给予更多的补偿。 B 是边界框的数量。 `S^2`是网格中的单元数。
使用类似的公式来处理边界框的宽度/高度
......@@ -446,7 +448,7 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
![](img/a96483b7-4839-448c-b67c-09b8c05d871c.png)
![](img/c4e8c779-49ae-4ec8-8edf-4f4ba443f7e0.png)是置信度分数(受物体的存在调制的项)。![](img/169b79a0-8a0a-4973-90ee-31786959345d.png)是带有地面真值框的预测边界框的 IOU。 参数![](img/36df6474-b17d-4fb0-b24b-f6ea0233f835.png)用于使无对象时的丢失关注度降低。
`C`是置信度分数(受物体的存在调制的项)。`C_hat`是带有真实情况的预测边界框的 IOU。 参数`λ[noobj] = 0.5`用于使无对象时的丢失关注度降低。
# 损失第 3 部分
......@@ -454,9 +456,9 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
![](img/28ad37ab-56de-4f07-86d2-c4bcd0fc5dfb.png)
该损失是分类误差损失平方的总和。 同样,当单元上有一个对象时,术语![](img/f02c17f3-a6f0-4ec8-a662-039aa884c958.png)为 1,否则为 0。 我们的想法是,当存在对象时,我们不考虑分类错误。
该损失是分类误差损失平方的总和。 同样,当单元上有一个对象时,术语`1[i]^(obj)`为 1,否则为 0。 我们的想法是,当存在对象时,我们不考虑分类错误。
![](img/da6e4b6e-cf0a-484e-8e34-1aa6aed0cade.png)这些术语可以掩盖我们在地面真相上有一个对象而在特定单元的模型输出中有一个对象的情况下的损失。 当地面真相与模型输出不匹配时,也是如此。
`1[i]^(obj), 1[ij]^(obj), 1[ij]^(noobj)`这些术语可以掩盖我们在真实情况上有一个对象而在特定单元的模型输出中有一个对象的情况下的损失。 当真实情况与模型输出不匹配时,也是如此。
因此,例如,当特定单元格不匹配时,我们的损失将是:
......@@ -529,7 +531,7 @@ def loss_layer(self, predicts, labels, scope='loss_layer'):
在语义分割中,目标是根据像素所属的对象类别标记图像的每个像素。 最终结果是一个位图,其中每个像素将属于某个类:
**![](img/5c1dcbee-f8a6-4a9f-a2c2-09d6ea91d4cc.png)**
![](img/5c1dcbee-f8a6-4a9f-a2c2-09d6ea91d4cc.png)
有几种流行的 CNN 架构已被证明在分割任务中表现出色。 它们中的大多数是称为自编码器的一类模型的变体,我们将在第 6 章,“自编码器,变分自编码器和生成模型”中详细介绍。 现在,他们的基本思想是首先在空间上将输入量减小为某种压缩形式,然后恢复原始的空间大小:
......
......@@ -305,19 +305,19 @@ GoogLeNet 的主要优点是,它比 VGG 更为准确,同时使用的参数
![](img/d8ad63df-15dd-4d20-b918-a3f18767a9c8.png)
让我们更详细地了解残差块的外观以及其功能背后的直觉。 如果我们有一个输入![](img/54cb6769-dfa9-4ed2-8a98-04904ad5ed2e.png)和一个输出![](img/0df834df-790e-4fd2-b5fd-f6d8afbd04fe.png),则存在一个将![](img/ac3e4947-4de7-4f5d-9b05-9a892b4aa2b8.png)映射到![](img/429cb4f4-0cb2-4408-80d7-8185e46ae29c.png)的非线性函数![](img/2bc69477-f997-406b-9f65-4cd1d59170df.png)。 假设函数![](img/2bc69477-f997-406b-9f65-4cd1d59170df.png)可以由两个堆叠的非线性卷积层近似。 然后,残差函数![](img/04c577da-ec4e-42e8-8a2e-659b7a2570bd.png)也可以近似。 我们可以等效地写为![](img/6ff3c055-c8f0-41e4-adbb-655f94f1f14f.png),其中![](img/076d8c2c-5fd2-4cd0-90ee-002c1b80fd2b.png)表示两个堆叠的非线性层,![](img/8b38461a-1ec6-4f8f-a0d2-0977201c727c.png)标识函数(输入=输出)
让我们更详细地了解残差块的外观以及其功能背后的直觉。 如果我们有一个输入`x`和一个输出`y`,则存在一个将`x`映射到`y`的非线性函数`H(x)`。 假设函数`H(x)`可以由两个堆叠的非线性卷积层近似。 然后,残差函数`F(x) = H(x) - x`也可以近似。 我们可以等效地写为`H(x) = F(x) + x`,其中`F(x)`表示两个堆叠的非线性层,`x`标识输入等于输出的函数
更正式地说,对于通过网络的前向传递,如果![](img/48890ce8-4d40-4ced-9c20-0f0fe7258f49.png)是来自![](img/3cbd4bac-33c6-44e9-855c-4559561e7400.png)层的张量,并且![](img/cf39e814-f34f-4ee6-8669-04d386f69236.png)和![](img/290b2b0d-9cc0-433f-9797-31ecf9cf0db5.png)是当前层和先前层的权重矩阵,则输入![](img/bca942f2-dddf-4e8d-aaf4-48722f648d63.png)到 下一层![](img/32d5f07f-1c7c-40ab-9cbf-695177d3cfd2.png)
更正式地说,对于通过网络的前向传递,如果`x`是来自`l-2`层的张量,并且`W[l-1]``W[l]`是当前层和先前层的权重矩阵,则下一层`l+1`的输入`y`是:
![](img/2a75b154-8239-4fce-968d-441d25d69a27.png)
其中![](img/9848c713-134c-4eb9-9f35-3d3076854a6d.png)是非线性激活函数,例如 ReLu 和![](img/75a30ef9-ee69-49eb-92e5-738eeef18b10.png),即两层堆叠卷积。 ReLu 函数可以在添加 x 之前或之后添加。 剩余的块应由 2 层或更多层组成,因为一层的块没有明显的好处。
其中`g`是非线性激活函数,例如 ReLu 和`F(x) = W[l] g(W[l-1] x)`,即两层堆叠卷积。 ReLu 函数可以在添加 x 之前或之后添加。 剩余的块应由 2 层或更多层组成,因为一层的块没有明显的好处。
为了理解该概念背后的直觉,我们假设我们有一个经过训练的浅层 CNN,其更深的对应层具有与浅层 CNN 相同的层,并且在它们之间随机插入了一些层。 为了拥有一个与浅层模型至少具有相似性能的深层模型,附加层必须近似标识函数。 但是,要学习具有 CONV 层堆栈的标识函数比将残差函数推为零要困难得多。 换句话说,如果单位函数是最优解,则很容易实现![](img/54b2d5db-424c-4399-b2d3-081897501f57.png),因此很容易实现![](img/ffc658b8-7e88-4b94-8f69-53d3904a01fc.png)
为了理解该概念背后的直觉,我们假设我们有一个经过训练的浅层 CNN,其更深的对应层具有与浅层 CNN 相同的层,并且在它们之间随机插入了一些层。 为了拥有一个与浅层模型至少具有相似性能的深层模型,附加层必须近似标识函数。 但是,要学习具有 CONV 层堆栈的标识函数比将残差函数推为零要困难得多。 换句话说,如果单位函数是最优解,则很容易实现`F(x)`,因此很容易实现`H(x) = x`
另一种思考的方式是,在训练期间,特定的层不仅会从上一层学习一个概念,还会从它之前的其他层学习一个概念。 这比只从上一层学习概念要好。
在实现方面,我们应注意确保![](img/269bb145-9df7-475f-b3cb-5bdd3993537b.png)和![](img/47cbd75c-bae1-4ed3-86b7-ad75747293b1.png)的大小相同。
在实现方面,我们应注意确保`x``F(x)`的大小相同。
查看残差块的重要性的另一种方法是,我们将为梯度创建一个“高速公路”(加法块),以避免随着梯度的增加而消失的梯度问题!
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册