提交 13c6421d 编写于 作者: W wizardforcel

2020-09-14 14:40:58

上级 70de6394
此差异已折叠。
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
正式地,人工智能研究始于 1956 年的达特茅斯会议,其中定义了 AI 及其使命。 在接下来的几年中,每个人都很乐观,因为机器能够解决代数问题和学习英语,并且在 1972 年制造了第一台机器人。但是在 1970 年代,由于过分的承诺但交付不足,出现了所谓的 AI 冬季,人工智能研究有限且资金不足。 此后,尽管 AI 通过专家系统重生,但可以显示人类水平的分析技能。 之后,第二次 AI 冬季机器学习在 1990 年代被认可为一个单独的领域,当时概率理论和统计学开始得到利用。 正式地,人工智能研究始于 1956 年的达特茅斯会议,其中定义了 AI 及其使命。 在接下来的几年中,每个人都很乐观,因为机器能够解决代数问题和学习英语,并且在 1972 年制造了第一台机器人。但是在 1970 年代,由于过分的承诺但交付不足,出现了所谓的 AI 冬季,人工智能研究有限且资金不足。 此后,尽管 AI 通过专家系统重生,但可以显示人类水平的分析技能。 之后,第二次 AI 冬季机器学习在 1990 年代被认可为一个单独的领域,当时概率理论和统计学开始得到利用。
计算能力的提高和解决特定问题的决心促使 IBM 的 Deep Blue 的发展在 1997 年击败了国际象棋冠军。 迅速发展,时下的 AI 领域涵盖了许多领域,包括机器学习,计算机视觉,自然语言处理,计划调度和优化,推理/专家系统和机器人技术。 计算能力的提高和解决特定问题的决心促使 IBM 的深蓝的发展在 1997 年击败了国际象棋冠军。 迅速发展,时下的 AI 领域涵盖了许多领域,包括机器学习,计算机视觉,自然语言处理,计划调度和优化,推理/专家系统和机器人技术。
在过去的 10 年中,我们目睹了机器学习和一般 AI 的强大功能。 主要感谢深度学习。 在过去的 10 年中,我们目睹了机器学习和一般 AI 的强大功能。 主要感谢深度学习。
...@@ -48,13 +48,13 @@ ML 系统的组成部分是评估。 在评估模型时,我们会看到模型 ...@@ -48,13 +48,13 @@ ML 系统的组成部分是评估。 在评估模型时,我们会看到模型
**监督学习**:我们可以使用输入和所需的输出或标签。 手势分类是一种有监督学习问题的示例,其中为我们提供了手势和相应标签的图像。 我们想要创建一个模型,该模型能够在输入手形图像的情况下输出正确的标签。 **监督学习**:我们可以使用输入和所需的输出或标签。 手势分类是一种有监督学习问题的示例,其中为我们提供了手势和相应标签的图像。 我们想要创建一个模型,该模型能够在输入手形图像的情况下输出正确的标签。
监督技术包括 SVM,LDA,神经网络,CNN,K-NN,决策树等。 监督技术包括 SVM,LDA,神经网络,CNN,KNN,决策树等。
**无监督学习**:只有输入可用,没有标签,我们不一定知道我们想要模型做什么。 例如,如果我们得到一个包含手的图片但没有标签的大型数据集。 在这种情况下,我们可能知道数据中存在某些结构或关系,但是我们将其留给算法来尝试在我们的数据中找到它们。 我们可能希望我们的算法在数据中找到相似手势的簇,因此我们不必手动标记它们。 **无监督学习**:只有输入可用,没有标签,我们不一定知道我们想要模型做什么。 例如,如果我们得到一个包含手的图片但没有标签的大型数据集。 在这种情况下,我们可能知道数据中存在某些结构或关系,但是我们将其留给算法来尝试在我们的数据中找到它们。 我们可能希望我们的算法在数据中找到相似手势的簇,因此我们不必手动标记它们。
无监督学习的另一种用途是找到方法,以减少我们正在使用的数据的维度,这又是通过找到数据中的重要特征并丢弃不重要的特征来实现的。 无监督学习的另一种用途是找到方法,以减少我们正在使用的数据的维度,这又是通过找到数据中的重要特征并丢弃不重要的特征来实现的。
无监督技术包括 PCA,t-SNE,K-means,自编码器,深度自编码器等。 无监督技术包括 PCA,t-SNE,K 均值,自编码器,深度自编码器等。
下图说明了分类和聚类之间的区别(当我们需要在非监督数据上查找结构时)。 下图说明了分类和聚类之间的区别(当我们需要在非监督数据上查找结构时)。
...@@ -93,7 +93,7 @@ ML 的新型深度学习方法具有的最酷的功能是,它们不需要( ...@@ -93,7 +93,7 @@ ML 的新型深度学习方法具有的最酷的功能是,它们不需要(
* 隐藏层 * 隐藏层
* 输出层 * 输出层
基本的人工神经元通过计算输入及其内部*权重*之间的点积来工作(参见下图),然后将结果传递给非线性激活函数`f`S 型) ,在此示例中)。 然后将这些人工神经元连接在一起以形成网络。 在训练该网络期间,目标是找到合适的权重集,这些权重将有助于我们希望网络执行的任何任务: 基本的人工神经元通过计算输入及其内部*权重*之间的点积来工作(参见下图),然后将结果传递给非线性激活函数`f`在此示例中是 Sigmoid)。 然后将这些人工神经元连接在一起以形成网络。 在训练该网络期间,目标是找到合适的权重集,这些权重将有助于我们希望网络执行的任何任务:
![](img/7ceed94c-24a7-4e1b-8225-5786d5c92da7.jpg) ![](img/7ceed94c-24a7-4e1b-8225-5786d5c92da7.jpg)
...@@ -111,11 +111,11 @@ ML 的新型深度学习方法具有的最酷的功能是,它们不需要( ...@@ -111,11 +111,11 @@ ML 的新型深度学习方法具有的最酷的功能是,它们不需要(
我们的神经元可以使用多种不同的激活功能,此处显示了一些; 唯一重要的是函数是非线性的。 每个激活功能都有其自身的优点和缺点。 我们的神经元可以使用多种不同的激活功能,此处显示了一些; 唯一重要的是函数是非线性的。 每个激活功能都有其自身的优点和缺点。
历史上,神经网络选择的激活函数是 Sigmoid 和 *TanH* 。 但是,这些功能对于可靠地训练神经网络不利,因为它们具有不希望的特性,即它们的值在任一端都饱和。 这将导致这些点处的梯度为零,我们将在后面找到,并且在训练神经网络时不是一件好事。 历史上,神经网络选择的激活函数是 Sigmoid 和 *TanH*。 但是,这些功能对于可靠地训练神经网络不利,因为它们具有不希望的特性,即它们的值在任一端都饱和。 这将导致这些点处的梯度为零,我们将在后面找到,并且在训练神经网络时不是一件好事。
![](img/11ef12ae-e5d9-458a-a00a-3be49a15fbb1.png) ![](img/11ef12ae-e5d9-458a-a00a-3be49a15fbb1.png)
结果,更流行的激活功能之一是 ReLU 激活或**整流线性单元**。 ReLU 只是输入和 0-max(x,0)之间的最大运算。 它具有理想的特性,即梯度(至少在一端)不会变为零,这极大地有助于神经网络训练的收敛速度。 结果,更流行的激活功能之一是 ReLU 激活或**整流线性单元**。 ReLU 只是`max(x, 0)`,输入和 0 之间的最大运算。 它具有理想的特性,即梯度(至少在一端)不会变为零,这极大地有助于神经网络训练的收敛速度。
该激活功能用于帮助训练深层的 CNN 之后,变得越来越流行。 它的简单性和有效性使其成为通常使用的激活功能。 该激活功能用于帮助训练深层的 CNN 之后,变得越来越流行。 它的简单性和有效性使其成为通常使用的激活功能。
...@@ -206,7 +206,7 @@ ML 的新型深度学习方法具有的最酷的功能是,它们不需要( ...@@ -206,7 +206,7 @@ ML 的新型深度学习方法具有的最酷的功能是,它们不需要(
![](img/d524acf3-04c6-4d31-b85f-9db358a0b344.png) ![](img/d524acf3-04c6-4d31-b85f-9db358a0b344.png)
TensorFlow 的以下代码行也显示了这一点,因为损失仅需要标签和输出(此处称为 logits)。 TensorFlow 的以下代码行也显示了这一点,因为损失仅需要标签和输出(此处称为对率)。
```py ```py
loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits) loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
...@@ -286,7 +286,7 @@ TensorFlow 的所有不同优化器都可以在`tf.train`类中找到。 例如 ...@@ -286,7 +286,7 @@ TensorFlow 的所有不同优化器都可以在`tf.train`类中找到。 例如
# 全连接层 # 全连接层
组成我们之前看到的 ANN 的神经元层通常称为密集连接层,或**完全连接的****FC**)层,或简称为线性层。 诸如 Caffe 之类的一些深度学习库实际上会将它们视为点乘积运算,非线性层可能会或可能不会跟随它们。 它的主要参数将是输出大小,基本上是其输出中神经元的数量。 组成我们之前看到的 ANN 的神经元层通常称为密集连接层,或**全连接****FC**)层,或简称为线性层。 诸如 Caffe 之类的一些深度学习库实际上会将它们视为点乘积运算,非线性层可能会或可能不会跟随它们。 它的主要参数将是输出大小,基本上是其输出中神经元的数量。
在第 1 章,“TensorFlow 简介和设置”中,我们创建了自己的致密层,但是您可以使用`tf.layers`来更轻松地创建它,如下所示: 在第 1 章,“TensorFlow 简介和设置”中,我们创建了自己的致密层,但是您可以使用`tf.layers`来更轻松地创建它,如下所示:
...@@ -375,7 +375,7 @@ CNN 主要由称为**卷积层**的层组成,这些层对其层输入进行过 ...@@ -375,7 +375,7 @@ CNN 主要由称为**卷积层**的层组成,这些层对其层输入进行过
同样重要的是要清楚卷积层的输入不必是 1 或 3 通道图像。 卷积层的输入张量可以具有任意数量的通道。 同样重要的是要清楚卷积层的输入不必是 1 或 3 通道图像。 卷积层的输入张量可以具有任意数量的通道。
很多时候,在谈论 CNN 中的卷积层时,人们都喜欢将卷积这个词简称为 conv。 这是非常普遍的做法,我们在本书中也会做同样的事情。 很多时候,在谈论 CNN 中的卷积层时,人们都喜欢将卷积这个词简称为`conv`。 这是非常普遍的做法,我们在本书中也会做同样的事情。
# 卷积 # 卷积
...@@ -395,13 +395,13 @@ CNN 主要由称为**卷积层**的层组成,这些层对其层输入进行过 ...@@ -395,13 +395,13 @@ CNN 主要由称为**卷积层**的层组成,这些层对其层输入进行过
在传统的神经网络中,我们将必须将任何输入数据转换为单个一维向量,从而在将该向量发送到全连接层后丢失所有重要的空间信息。 此外,每个像素每个神经元都有一个参数,导致输入大小或输入深度较大的模型中参数数量激增。 在传统的神经网络中,我们将必须将任何输入数据转换为单个一维向量,从而在将该向量发送到全连接层后丢失所有重要的空间信息。 此外,每个像素每个神经元都有一个参数,导致输入大小或输入深度较大的模型中参数数量激增。
但是,在卷积层的情况下,每个内核将在整个输入中“滑动”以搜索特定补丁。 CNN 中的内核很小,并且与它们所卷积的大小无关。 结果,就参数而言,使用 conv 层的开销通常比我们之前了解的传统密集层要少得多。 但是,在卷积层的情况下,每个内核将在整个输入中“滑动”以搜索特定补丁。 CNN 中的内核很小,并且与它们所卷积的大小无关。 结果,就参数而言,使用卷积层的开销通常比我们之前了解的传统密集层要少得多。
下图显示了传统的完全连接层和卷积(局部连接)层之间的区别。 注意参数的巨大差异: 下图显示了传统的完全连接层和卷积(局部连接)层之间的区别。 注意参数的巨大差异:
![](img/d2abbff0-7660-4e55-82dc-dac6c50a0c38.png) ![](img/d2abbff0-7660-4e55-82dc-dac6c50a0c38.png)
现在,也许我们希望卷积层在其输入中查找六种不同的事物,而不仅仅是寻找一种。 在这种情况下,我们将只给卷积层六个相同大小的过滤器(在这种情况下为 5x5x3),而不是一个。 然后,每个转换滤波器都会在输入中查找特定的模式。 现在,也许我们希望卷积层在其输入中查找六种不同的事物,而不仅仅是寻找一种。 在这种情况下,我们将只给卷积层六个相同大小的过滤器(在这种情况下为`5x5x3`),而不是一个。 然后,每个转换滤波器都会在输入中查找特定的模式。
下图显示了此特定的六个滤波器卷积层的输入和输出: 下图显示了此特定的六个滤波器卷积层的输入和输出:
...@@ -414,7 +414,7 @@ CNN 主要由称为**卷积层**的层组成,这些层对其层输入进行过 ...@@ -414,7 +414,7 @@ CNN 主要由称为**卷积层**的层组成,这些层对其层输入进行过
* **零填充(P)**:要放在图像边框上的零数量。 使用填充使内核可以完全过滤输入图像的每个位置,包括边缘。 * **零填充(P)**:要放在图像边框上的零数量。 使用填充使内核可以完全过滤输入图像的每个位置,包括边缘。
* **过滤器数(F)**:我们的卷积层将具有多少个过滤器。 它控制卷积层将要查找的图案或特征的数量。 * **过滤器数(F)**:我们的卷积层将具有多少个过滤器。 它控制卷积层将要查找的图案或特征的数量。
在 TensorFlow 中,我们将在`tf.layers`模块中找到 2-D 卷积层,可以将其添加到模型中,如下所示: 在 TensorFlow 中,我们将在`tf.layers`模块中找到 2D 卷积层,可以将其添加到模型中,如下所示:
```py ```py
conv1 = tf.layers.conv2d( conv1 = tf.layers.conv2d(
...@@ -444,7 +444,7 @@ TensorFlow 卷积操作为您提供了两种用于填充需求的选项:相同 ...@@ -444,7 +444,7 @@ TensorFlow 卷积操作为您提供了两种用于填充需求的选项:相同
![](img/67287ebe-dbe6-4c4c-aaf7-5f0e3eee0428.png) ![](img/67287ebe-dbe6-4c4c-aaf7-5f0e3eee0428.png)
(这里,pad 是添加到每个边框的零的数量。) (这里,`pad`是添加到每个边框的零的数量。)
但是在 TensorFlow 中,由于有效和相同填充选项的性质,公式如下所示: 但是在 TensorFlow 中,由于有效和相同填充选项的性质,公式如下所示:
...@@ -485,13 +485,13 @@ out_height = ceil(float(in_height) / float(strides[1])) ...@@ -485,13 +485,13 @@ out_height = ceil(float(in_height) / float(strides[1]))
# 计算操作数 # 计算操作数
现在,我们对计算特定卷积层的计算成本感兴趣。 如果您想了解如何实现有效的网络结构(例如在移动设备中速度是关键时),则此步骤很重要。 另一个原因是要查看在硬件中实现特定层需要多少个乘法器。 现代 CNN 架构中的卷积层最多可负责模型中所有计算的 90% 现在,我们对计算特定卷积层的计算成本感兴趣。 如果您想了解如何实现有效的网络结构(例如在移动设备中速度是关键时),则此步骤很重要。 另一个原因是要查看在硬件中实现特定层需要多少个乘法器。 现代 CNN 架构中的卷积层最多可负责模型中所有计算的 90%!
这些是影响 MAC(乘加累加器)/操作数量的因素: 这些是影响 MAC(乘加累加器)/操作数量的因素:
* 卷积核大小(F) * 卷积核大小(F)
* 过滤器数量(M) * 过滤器数量(M)
* 输入要素图的高度和宽度(高,宽 * 输入要素图的高度和宽度(H,W
* 输入批量(B) * 输入批量(B)
* 输入深度大小(通道)(C) * 输入深度大小(通道)(C)
* 卷积层步幅(S) * 卷积层步幅(S)
...@@ -499,13 +499,13 @@ out_height = ceil(float(in_height) / float(strides[1])) ...@@ -499,13 +499,13 @@ out_height = ceil(float(in_height) / float(strides[1]))
MAC 的数量可以计算为: MAC 的数量可以计算为:
```py ```py
#MAC = [F * F * C *(H + 2 * P-FS + 1)*(W + 2 * P-FS + 1)* M] * B #MAC = [F * F * C * (H + 2 * P-FS + 1) * (W + 2 * P-FS + 1) * M] * B
``` ```
例如,让我们考虑一个具有输入 224 x 224 x 3,批处理大小为 1,内核为 3x3、64 个过滤器,跨度为 1 和填充 1 的转换层: 例如,让我们考虑一个具有输入`224 x 224 x 3`,批处理大小为 1,内核为`3x3`、64 个过滤器,跨度为 1 和填充 1 的转换层:
```py ```py
#MAC = 3 * 3 *(224 + 2-31 + 1)*(224 + 2-31 + 1)* 3 * 64 * 1 = 9,462,528 #MAC = 3 * 3 * (224 + 2-31 + 1) * (224 + 2-31 + 1) * 3 * 64 * 1 = 9,462,528
``` ```
相反,全连接层具有以下操作数: 相反,全连接层具有以下操作数:
...@@ -522,7 +522,7 @@ MAC 的数量可以计算为: ...@@ -522,7 +522,7 @@ MAC 的数量可以计算为:
(我们已排除了所有运维计算的偏差,但不应增加太多成本。) (我们已排除了所有运维计算的偏差,但不应增加太多成本。)
通常,在 CNN 中,早期的 conv 层贡献了大部分计算成本,但参数最少。 在网络的末尾,相反的情况是后面的层具有更多的参数,但计算成本却较低。 通常,在 CNN 中,早期的卷积层贡献了大部分计算成本,但参数最少。 在网络的末尾,相反的情况是后面的层具有更多的参数,但计算成本却较低。
# 将卷积层转换为全连接层 # 将卷积层转换为全连接层
...@@ -530,11 +530,11 @@ MAC 的数量可以计算为: ...@@ -530,11 +530,11 @@ MAC 的数量可以计算为:
例: 例:
考虑具有 4,096 个输出神经元和输入大小为 7x7x512 的 FC 层,转换为: 考虑具有 4,096 个输出神经元和输入大小为`7x7x512`的 FC 层,转换为:
转换层:内核:7x7,填充:0:步幅:1,过滤器:4,096。 转换层:内核:`7x7`,填充:0:步幅:1,过滤器:4,096。
使用公式来计算输出大小,我们得到大小为 1 x 1 x 4096 的输出。 使用公式来计算输出大小,我们得到大小为`1 x 1 x 4096`的输出。
这样做的主要原因之一是使您的网络完全卷积。 当网络完全卷积时,决定使用比输入的图像更大的输入大小图像并不重要,因为您没有任何需要固定输入大小的全连接层。 这样做的主要原因之一是使您的网络完全卷积。 当网络完全卷积时,决定使用比输入的图像更大的输入大小图像并不重要,因为您没有任何需要固定输入大小的全连接层。
...@@ -558,9 +558,9 @@ MAC 的数量可以计算为: ...@@ -558,9 +558,9 @@ MAC 的数量可以计算为:
tf.layers.max_pooling2d(inputs=some_input_layer, pool_size=[2, 2], strides=2) tf.layers.max_pooling2d(inputs=some_input_layer, pool_size=[2, 2], strides=2)
``` ```
# 1x1 卷积 # `1x1`卷积
这种卷积起初看起来可能有些奇怪,但是 1x1 卷积实际上是通过合并深度来适应深度的,而不更改空间信息。 当需要在不损失空间信息的情况下将一个体积深度转换为另一个体积深度(称为压缩或扩展)时,可以使用这种类型的卷积: 这种卷积起初看起来可能有些奇怪,但是`1x1`卷积实际上是通过合并深度来适应深度的,而不更改空间信息。 当需要在不损失空间信息的情况下将一个体积深度转换为另一个体积深度(称为压缩或扩展)时,可以使用这种类型的卷积:
![](img/88fb04f4-1cdb-45d7-8ecb-5b38bc80215e.png) ![](img/88fb04f4-1cdb-45d7-8ecb-5b38bc80215e.png)
...@@ -570,7 +570,7 @@ tf.layers.max_pooling2d(inputs=some_input_layer, pool_size=[2, 2], strides=2) ...@@ -570,7 +570,7 @@ tf.layers.max_pooling2d(inputs=some_input_layer, pool_size=[2, 2], strides=2)
有时,确切了解激活中每个特定像素在输入图像中“看到”了多少像素可能很有用; 这在对象检测系统中尤其重要,因为我们需要以某种方式查看某些层激活如何映射回原始图像大小。 有时,确切了解激活中每个特定像素在输入图像中“看到”了多少像素可能很有用; 这在对象检测系统中尤其重要,因为我们需要以某种方式查看某些层激活如何映射回原始图像大小。
在下图中,我们可以看到三个连续的 3x3 卷积层的感受域与一个 7x7 卷积层的感受域相同。 在设计新的更好的 CNN 模型时,此属性非常重要,我们将在后面的章节中看到。 在下图中,我们可以看到三个连续的`3x3`卷积层的感受域与一个`7x7`卷积层的感受域相同。 在设计新的更好的 CNN 模型时,此属性非常重要,我们将在后面的章节中看到。
![](img/25c4fa50-dafd-4851-a3f1-d20150dc5d3c.png) ![](img/25c4fa50-dafd-4851-a3f1-d20150dc5d3c.png)
...@@ -580,21 +580,21 @@ tf.layers.max_pooling2d(inputs=some_input_layer, pool_size=[2, 2], strides=2) ...@@ -580,21 +580,21 @@ tf.layers.max_pooling2d(inputs=some_input_layer, pool_size=[2, 2], strides=2)
在这里,组件如下: 在这里,组件如下:
* `R[k]`k 层的感受域 * `R[k]``k`层的感受域
* `Kernel[k]`:第 k 层的内核大小 * `Kernel[k]`:第`k`层的内核大小
* `S[i]`从第 i 层(1..k-1)跨步 * `S[i]``i`层(`1..k-1`)的跨步
* `∏s[i], i=1..(k-1)`所有步长的乘积直到第 k-1 层(所有先前的层,而不是当前的一层) * `∏s[i], i=1..(k-1)`直到第`k-1`层的所有步长的乘积(所有先前的层,而不是当前的一层)
仅对于第一层,接收域就是内核大小。 仅对于第一层,接收域就是内核大小。
这些计算与是否使用卷积或池化层无关,例如,步幅为 2 的 conv 层将与步幅为 2 的池化层具有相同的感受域。 这些计算与是否使用卷积或池化层无关,例如,步幅为 2 的卷积层将与步幅为 2 的池化层具有相同的感受域。
例如,给定以下图层之后的 14x14x3 图像,这将适用: 例如,给定以下图层之后的`14x14x3`图像,这将适用:
* 转换:S:1,P:0,K:3 * 卷积:S:1,P:0,K:3
* 转换:S:1,P:0,K:3 * 卷积:S:1,P:0,K:3
* 最大池:S:2,P:0,K2 * 最大池:S:2,P:0,K2
* 转换:S:1,P:0,K:3 * 卷积:S:1,P:0,K:3
![](img/1ad5b39a-c730-4006-987b-fc280e34940f.jpg) ![](img/1ad5b39a-c730-4006-987b-fc280e34940f.jpg)
...@@ -734,7 +734,7 @@ with tf.Session() as sess: ...@@ -734,7 +734,7 @@ with tf.Session() as sess:
"""Training loop""" """Training loop"""
``` ```
我们需要创建一个`tf.summar.FileWriter`,它负责创建一个目录,该目录将存储我们的摘要日志。 如果在创建 FileWriter 时传递图形,则该图形也将显示在 TensorBoard 中。 通过传入 sess.graph,我们提供了会话正在使用的默认图。 在 TensorBoard 中显示图形的结果可能看起来像这样: 我们需要创建一个`tf.summar.FileWriter`,它负责创建一个目录,该目录将存储我们的摘要日志。 如果在创建`FileWriter`时传递图形,则该图形也将显示在 TensorBoard 中。 通过传入`sess.graph`,我们提供了会话正在使用的默认图。 在 TensorBoard 中显示图形的结果可能看起来像这样:
![](img/a500985f-bedd-457d-82bc-f0dec7d4ebb3.png) ![](img/a500985f-bedd-457d-82bc-f0dec7d4ebb3.png)
...@@ -745,7 +745,7 @@ with tf.Session() as sess: ...@@ -745,7 +745,7 @@ with tf.Session() as sess:
现在,我们将仅按名称和使用位置提及它们: 现在,我们将仅按名称和使用位置提及它们:
* **深度卷积**:用于 MobileNets,旨在使卷积对移动平台友好 * **深度卷积**:用于 MobileNets,旨在使卷积对移动平台友好
* **膨胀卷积(Atrous Convolution)**:它们具有称为膨胀率的额外参数,可让您以相同的计算成本获得更大的视野(例如 3x3 CONV 可以和 5x5 CONV 具有相同的视野) * **膨胀卷积(Atrous Convolution)**:它们具有称为膨胀率的额外参数,可让您以相同的计算成本获得更大的视野(例如`3x3`卷积可以和`5x5`卷积具有相同的视野)
* **转置卷积(Deconvolutions)**:通常用于 CNN 自编码器和语义分割问题 * **转置卷积(Deconvolutions)**:通常用于 CNN 自编码器和语义分割问题
# 摘要 # 摘要
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册