提交 31f667ba 编写于 作者: W wizardforcel

2020-09-05 21:58:29

上级 adb20f23
......@@ -12,7 +12,7 @@
第 2 章,“图像分类”讨论图像分类问题,该问题将整个图像标记为图像。 读者将学习图像分类技术,并训练用于宠物分类的深度学习模型。 他们还将学习提高准确性的方法,并深入研究各种先进的架构。
第 3 章,“图像检索”涵盖了深层功能和图像检索。 读者将学习获得模型可视化,视觉特征,使用 TensorFlow 进行推理以及服务和使用视觉特征进行产品检索的各种方法。
第 3 章,“图像检索”涵盖了深层特征和图像检索。 读者将学习获得模型可视化,视觉特征,使用 TensorFlow 进行推理以及服务和使用视觉特征进行产品检索的各种方法。
第 4 章,“对象检测”讨论了检测图像中的对象。 读者将学习各种对象检测技术,并将其应用于行人检测。 本章将使用用于对象检测的 TensorFlow API。
......
......@@ -17,13 +17,13 @@
![](img/1e292483-bf0f-4474-9ee4-9f18966861b6.png)
如上图所示,对输入进行加权和求和。 然后,对于二进制分类问题,该总和然后通过单位步长函数传递。 感知机只能通过从示例中学习权重来学习简单功能。 学习权重的过程称为训练。 可以通过基于梯度的方法对感知机进行训练,这将在后面的部分中进行介绍。 感知机的输出可以通过 `activation` 函数或 `transfer` 函数传递,这将在下一部分中进行说明。
如上图所示,对输入进行加权和求和。 然后,对于二进制分类问题,该总和然后通过单位步长函数传递。 感知机只能通过从示例中学习权重来学习简单函数。 学习权重的过程称为训练。 可以通过基于梯度的方法对感知机进行训练,这将在后面的部分中进行介绍。 感知机的输出可以通过 `activation` 函数或 `transfer` 函数传递,这将在下一部分中进行说明。
# 激活函数
`activation`函数使**神经网络**成为非线性。 激活函数决定是否应触发感知机。 在训练激活期间,功能在调整梯度中起着重要作用。 下一节所示的`activation`功能(如 Sigmoid)会衰减较大幅度的值。 `activation`函数的这种非线性行为为学习复杂函数提供了深层网络。 `activation`的大多数功能是连续和微分功能,但整流单元为 0 除外。输入的每一个小变化,连续功能的输出都会有很小的变化。 微分函数在域中的每个点都有一个导数。
`activation`函数使**神经网络**成为非线性。 激活函数决定是否应触发感知机。 在训练激活期间,函数在调整梯度中起着重要作用。 下一节所示的`activation`函数(如 Sigmoid)会衰减较大幅度的值。 `activation`函数的这种非线性行为为学习复杂函数提供了深层网络。 `activation`的大多数函数是连续和微分函数,但整流单元为 0 除外。输入的每一个小变化,连函数能的输出都会有很小的变化。 微分函数在域中的每个点都有一个导数。
为了训练神经网络,功能必须是可微的。 以下是一些`activation`功能
为了训练神经网络,函数必须是可微的。 以下是一些`activation`函数
如果您不了解诸如连续性和可区分性之类的术语,请不要担心。 在各章中将变得更加清楚。
......@@ -49,17 +49,17 @@ ReLu 可以让大量数字通过。 这会使一些神经元陈旧,并且它
![](img/f869a450-2d05-4d78-9ad6-8cc941adcfff.png)
由于 ReLU 不会一直触发,因此可以更快地进行训练。 由于功能简单,因此在计算上最便宜。 选择`activation`功能在很大程度上取决于应用。 尽管如此,ReLU 在许多问题上都运行良好。 在下一节中,您将学习如何将几个感知机堆叠在一起,这些感知机可以学习比感知机更复杂的功能
由于 ReLU 不会一直触发,因此可以更快地进行训练。 由于功能简单,因此在计算上最便宜。 选择`activation`函数在很大程度上取决于应用。 尽管如此,ReLU 在许多问题上都运行良好。 在下一节中,您将学习如何将几个感知机堆叠在一起,这些感知机可以学习比感知机更复杂的函数
# 人工神经网络(ANN)
ANN 是感知机函数的集合。 感知机连接形成隐藏的层或单元。 隐藏的单元形成了将低层空间中的输入层映射到输出层的非线性基础,这也称为人工神经网络。 ANN 是从输入到输出的映射。 该图是通过将输入与偏差进行加权相加来计算的。 权重和偏置值以及架构称为`model`
训练过程确定这些权重和偏置的值。 在训练开始时,使用随机值初始化模型值。 通过使用损失函数将误差与基本事实进行对比来计算误差。 根据计算出的损耗,在每一步调整权重。 如果无法进一步减少错误,则停止训练。 训练过程会在训练过程中学习功能。 这些特征比原始图像更好地表示。 以下是人工神经网络或多层感知机的示意图:
训练过程确定这些权重和偏置的值。 在训练开始时,使用随机值初始化模型值。 通过使用损失函数将误差与基本事实进行对比来计算误差。 根据计算出的损耗,在每一步调整权重。 如果无法进一步减少错误,则停止训练。 训练过程会在训练过程中学习特征。 这些特征比原始图像更好地表示。 以下是人工神经网络或多层感知机的示意图:
![](img/386212ca-7e62-482c-b6b3-d0d30426ca19.png)
*x* 的多个输入通过感知机的隐藏层传递并求和。 通用逼近定理表明,这样的神经网络可以逼近任何函数。 隐藏层也可以称为密集层。 每个层都可以具有上一节中描述的`activation`功能之一。 可以根据问题选择隐藏层和感知机的数量。 还有更多的事情可以使此多层感知机适用于多类分类问题。 一个多类别的分类问题试图区分十多个类别。 我们将在以下各节中探讨这些术语。
*x* 的多个输入通过感知机的隐藏层传递并求和。 通用逼近定理表明,这样的神经网络可以逼近任何函数。 隐藏层也可以称为密集层。 每个层都可以具有上一节中描述的`activation`函数之一。 可以根据问题选择隐藏层和感知机的数量。 还有更多的事情可以使此多层感知机适用于多类分类问题。 一个多类别的分类问题试图区分十多个类别。 我们将在以下各节中探讨这些术语。
# 单热编码
......@@ -71,7 +71,7 @@ Softmax 是一种强制神经网络输出 1 之和的方法。因此,`softmax`
# 交叉熵
交叉熵比较 softmax 和一键编码输出之间的距离。 交叉熵是一种损失函数,必须将其误差降至最低。 神经网络估计每个类别给定数据的概率。 必须将概率最大化到正确的目标标签。 交叉熵是负对数概率的总和。 对数值用于数值稳定性。 最大化一个功能等同于最小化相同功能的负数。 在下一节中,我们将看到以下正则化方法,以避免 ANN 的过拟合:
交叉熵比较 softmax 和一键编码输出之间的距离。 交叉熵是一种损失函数,必须将其误差降至最低。 神经网络估计每个类别给定数据的概率。 必须将概率最大化到正确的目标标签。 交叉熵是负对数概率的总和。 对数值用于数值稳定性。 最大化一个函数等同于最小化相同函数的负数。 在下一节中,我们将看到以下正则化方法,以避免 ANN 的过拟合:
* 丢弃法
* 批量规范化
......@@ -147,7 +147,7 @@ TensorFlow 游乐场中的仪表板
# 最大池
池化层位于卷积层之间。 合并层通过采样减小了跨层图像的大小。 通过在窗口中选择最大值来完成采样。 窗口中的平均池平均值。 池化还可以作为一种正则化技术来避免过度拟合。 在功能的所有通道上进行池化。 合并也可以进行各种步骤。
池化层位于卷积层之间。 合并层通过采样减小了跨层图像的大小。 通过在窗口中选择最大值来完成采样。 窗口中的平均池平均值。 池化还可以作为一种正则化技术来避免过度拟合。 在特征的所有通道上进行池化。 合并也可以进行各种步骤。
窗口的大小是 CNN 接收场的量度。 下图显示了最大池化的示例:
......
......@@ -146,7 +146,7 @@ x_input_reshape = tf.reshape(x_input, [-1, 28, 28, 1],
name='input_reshape')
```
尺寸`-1`表示批量大小可以是任何数字。 请注意,有一个名为`name`的自变量会在 TensorBoard 图形中反映出来,以便于理解。 我们将定义一个 2D 卷积层,其中定义了输入,过滤器,内核和激活。 可以在任何地方调用此方法以获取更多示例,并且在激活函数必须具有**整流线性单元****ReLU**)的情况下很有用。 `convolution`功能层定义如下:
尺寸`-1`表示批量大小可以是任何数字。 请注意,有一个名为`name`的自变量会在 TensorBoard 图形中反映出来,以便于理解。 我们将定义一个 2D 卷积层,其中定义了输入,过滤器,内核和激活。 可以在任何地方调用此方法以获取更多示例,并且在激活函数必须具有**整流线性单元****ReLU**)的情况下很有用。 `convolution`函数层定义如下:
```py
def convolution_layer(input_layer, filters, kernel_size=[3, 3],
......@@ -315,7 +315,7 @@ for batch_no in range(total_batches):
![](img/04d8485e-8078-4516-8203-27c99d3f2e66.png)
这些是对数的权重分布。 这些是 TensorBoard 可能提供的美丽可视化效果,并且在训练中非常有帮助。 通过使模型更深入,我们可以见证准确性的巨大提高。 在下一节中,我们将看到如何使用 Keras API 训练相同的模型。 现在您可以看到 TensorBoard 在检查深度学习模型和训练过程中的功能
这些是对数的权重分布。 这些是 TensorBoard 可能提供的美丽可视化效果,并且在训练中非常有帮助。 通过使模型更深入,我们可以见证准确性的巨大提高。 在下一节中,我们将看到如何使用 Keras API 训练相同的模型。 现在您可以看到 TensorBoard 在检查深度学习模型和训练过程中的特征
# 在 Keras 中训练 MNIST 模型
......@@ -687,7 +687,7 @@ generator_train = tf.keras.preprocessing.image.ImageDataGenerator(
# 瓶颈特征训练
上一节中介绍的模型很简单,因此准确性可能较低。 应该从它们构建复杂的模型。 它们不能从头开始构建。 因此,提取瓶颈特征并对它们进行分类器训练。 瓶颈特征是训练数百万张图像的复杂架构所产生的功能。 图像是通过前进完成的,并存储了最终层的特征。 从这些中,训练了一个简单的逻辑分类器进行分类。 提取瓶颈层,如下所示:
上一节中介绍的模型很简单,因此准确性可能较低。 应该从它们构建复杂的模型。 它们不能从头开始构建。 因此,提取瓶颈特征并对它们进行分类器训练。 瓶颈特征是训练数百万张图像的复杂架构所产生的特征。 图像是通过前进完成的,并存储了最终层的特征。 从这些中,训练了一个简单的逻辑分类器进行分类。 提取瓶颈层,如下所示:
```py
generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1\. / 255)
......
......@@ -4,7 +4,7 @@
* 如何从经过分类训练的模型中提取特征
* 如何使用 TensorFlow Serving 在生产系统中进行更快的推断
* 如何使用这些功能计算查询图像和目标集之间的相似度
* 如何使用这些特征计算查询图像和目标集之间的相似度
* 将分类模型用于排名
* 如何提高检索系统的速度
* 从整体上看系统的架构
......@@ -30,7 +30,7 @@
* **最大补丁**:激活一个神经元,并捕获最大激活的相应补丁。
* **遮挡**:在各个位置遮挡(遮挡)图像,并且激活以热图显示,以了解图像的哪些部分很重要。
在以下各节中,我们将看到如何实现这些功能的可视化。
在以下各节中,我们将看到如何实现这些特征的可视化。
# 可视化深度学习模型的激活
......@@ -87,7 +87,7 @@ TensorBoard 说明了代码的输出
# 引导反向传播
直接将特征可视化可能会减少信息量。 因此,我们使用反向传播的训练过程来激活滤镜以实现更好的可视化。 由于我们选择了要激活的神经元以进行反向传播,因此称为引导反向传播。 在本节中,我们将实现引导式反向传播以可视化功能
直接将特征可视化可能会减少信息量。 因此,我们使用反向传播的训练过程来激活滤镜以实现更好的可视化。 由于我们选择了要激活的神经元以进行反向传播,因此称为引导反向传播。 在本节中,我们将实现引导式反向传播以可视化特征
我们将定义大小并加载 VGG 模型,如下所示:
......@@ -220,7 +220,7 @@ imagenet_mean_value = 117.0 preprocessed_input = tf.expand_dims(input_placeholde
tf.import_graph_def(graph_defnition, {'input': preprocessed_input})
```
现在,会话和图形已准备好进行推断。 双线性插值需要`resize_image`功能。 可以添加`resize`函数方法,该函数通过 TensorFlow 会话来调整图像的大小,如下所示:
现在,会话和图形已准备好进行推断。 双线性插值需要`resize_image`函数。 可以添加`resize`函数方法,该函数通过 TensorFlow 会话来调整图像的大小,如下所示:
```py
def resize_image(image, size):
......@@ -453,7 +453,7 @@ result.add_done_callback(
因此,我们训练了一个用于对象分类的模型,并使用该模型中的特征进行检索。 然后,我们通过相同的模型传递查询图像和目标数据库以获得特征。 这些模型也可以称为**编码器**,因为它们对特定任务的图像信息进行编码。 编码器应该能够捕获全局和局部特征。 我们可以使用我们在图像分类一章中研究过的模型,这些模型经过训练可以进行分类任务。 由于强力扫描或线性扫描速度较慢,因此图像搜索可能会花费大量时间。 因此,需要一些用于更快检索的方法。 以下是一些加快匹配速度的方法:
* **局部敏感哈希****LSH**):LSH 将要素投影到其子空间,并可以向候选对象提供列表,并在以后进行精细特征排名。 这也是我们本章前面介绍的降维技术,例如 PCA 和 t-SNE。 它具有较小尺寸的铲斗。
* **多索引哈希**:此方法对功能进行哈希处理,就像信鸽拟合一样,可以使其更快。 它使用汉明距离来加快计算速度。 汉明距离不过是以二进制表示的数字的位置差异的数量。
* **多索引哈希**:此方法对特征进行哈希处理,就像信鸽拟合一样,可以使其更快。 它使用汉明距离来加快计算速度。 汉明距离不过是以二进制表示的数字的位置差异的数量。
这些方法更快,需要更少的内存,但要权衡准确性。 这些方法也没有捕获语义上的差异。 可以根据查询对匹配结果进行重新排名以获得更好的结果。 重新排序可以通过对返回的目标图像重新排序来改善结果。 重新排序可以使用以下技术之一:
......@@ -465,11 +465,11 @@ result.add_done_callback(
# 建立检索流水线
从查询图像的目标图像中获得最佳匹配的步骤序列称为**检索流水线**。 检索流水线具有多个步骤或组件。 图像数据库的功能必须脱机提取并存储在数据库中。 对于每个查询图像,必须提取特征并且必须在所有目标图像之间计算相似度。 然后,可以对图像进行排名以最终输出。 检索流水线如下所示:
从查询图像的目标图像中获得最佳匹配的步骤序列称为**检索流水线**。 检索流水线具有多个步骤或组件。 图像数据库的特征必须脱机提取并存储在数据库中。 对于每个查询图像,必须提取特征并且必须在所有目标图像之间计算相似度。 然后,可以对图像进行排名以最终输出。 检索流水线如下所示:
![](img/c9ea2c8e-b149-4890-8a5e-ba4d03ade21e.png)
特征提取步骤必须快速,为此可以使用 TensorFlow Serving。 您可以根据应用选择使用哪些功能。 例如,当需要基于纹理的匹配时可以使用初始层,而当必须在对象级别进行匹配时可以使用更高的层。 在下一部分中,我们将看到如何从预训练的初始模型中提取特征。
特征提取步骤必须快速,为此可以使用 TensorFlow Serving。 您可以根据应用选择使用哪些特征。 例如,当需要基于纹理的匹配时可以使用初始层,而当必须在对象级别进行匹配时可以使用更高的层。 在下一部分中,我们将看到如何从预训练的初始模型中提取特征。
# 提取图像的瓶颈特征
......@@ -515,7 +515,7 @@ bottleneck, image, resized_input = (
)
```
进行查询和目标图像并将其加载到内存中。 `gfile`功能提供了一种更快的方式将图像加载到内存中。
进行查询和目标图像并将其加载到内存中。 `gfile`函数提供了一种更快的方式将图像加载到内存中。
```py
query_image_path = os.path.join(work_dir, 'cat.1000.jpg')
......
......@@ -121,7 +121,7 @@ mAP 用于评估检测算法。 mAP 度量是检测到的边界框的精度和
# 将全连接层训练为卷积层
滑动窗口的问题是计算复杂度。 复杂性是因为对每个窗口都进行了预测。 已针对重叠区域的每个窗口计算了深度学习功能。 可以减少裁剪窗口中重叠区域的特征计算。 解决方案是使用仅计算一次特征的全卷积网络。 为了理解全卷积网络,让我们首先看看如何将全连接层转换为`convolution_layer`。 内核更改为相同的大小,并使用与神经元数量相同的过滤器数量。 也可以对其他层重复此操作。 更改内核大小是将全连接层转换为`convolution_layer`的简便方法:
滑动窗口的问题是计算复杂度。 复杂性是因为对每个窗口都进行了预测。 已针对重叠区域的每个窗口计算了深度学习特征。 可以减少裁剪窗口中重叠区域的特征计算。 解决方案是使用仅计算一次特征的全卷积网络。 为了理解全卷积网络,让我们首先看看如何将全连接层转换为`convolution_layer`。 内核更改为相同的大小,并使用与神经元数量相同的过滤器数量。 也可以对其他层重复此操作。 更改内核大小是将全连接层转换为`convolution_layer`的简便方法:
```py
convolution_layer_1 = convolution_layer(x_input_reshape, 64)
......@@ -169,7 +169,7 @@ logits = tf.reshape(logits, [-1, 10])
![](img/e4493c04-62ab-4564-9465-cb134209a626.png)
上图显示网络越深,结果越好。 对于 AlexNet,定位方法未在本文中描述。 OverFeat 使用带有框合并的多尺度卷积回归。 VGG 使用了定位,但比例尺和位置较少。 这些收益归因于深层特征。 ResNet 使用不同的定位方法和更深入的功能
上图显示网络越深,结果越好。 对于 AlexNet,定位方法未在本文中描述。 OverFeat 使用带有框合并的多尺度卷积回归。 VGG 使用了定位,但比例尺和位置较少。 这些收益归因于深层特征。 ResNet 使用不同的定位方法和更深入的特征
回归编码器和分类编码器独立运行。 因此,有可能预测边界框的标签不正确。 通过在不同的层上附加回归编码器可以解决此问题。 该方法也可以用于多个对象,从而解决了对象检测问题。 给定一个图像,找到其中的所有实例。 很难将检测视为回归,因为输出的数量是可变的。 一个图像可能有两个对象,而另一个可能有三个或更多。 在下一节中,我们将看到更有效地处理检测问题的算法。
......@@ -187,7 +187,7 @@ logits = tf.reshape(logits, [-1, 10])
经 Girshick 等人许可复制。
编码器可以是标准深度学习模型的预训练模型。 从训练数据为所有区域计算特征。 存储功能,然后训练 SVM。 接下来,用标准化坐标训练边界框。 在图像坐标之外可能会有一些建议,因此将其标准化以进行训练和推理。
编码器可以是标准深度学习模型的预训练模型。 从训练数据为所有区域计算特征。 存储特征,然后训练 SVM。 接下来,用标准化坐标训练边界框。 在图像坐标之外可能会有一些建议,因此将其标准化以进行训练和推理。
这种方法的缺点是:
......@@ -197,7 +197,7 @@ logits = tf.reshape(logits, [-1, 10])
# Fast R-CNN
Girshick 等人提出的 [Fast R-CNN](https://arxiv.org/pdf/1504.08083.pdf) 方法仅运行一次 CNN 推理,因此减少了计算量。 CNN 的输出用于建议网络并选择边界框。 它介绍了一种称为**兴趣区域池**的技术。 兴趣区域池采用 CNN 功能,并根据区域将它们合并在一起。 合并使用 CNN 进行推理后获得的特征,并选择区域,如下图所示:
Girshick 等人提出的 [Fast R-CNN](https://arxiv.org/pdf/1504.08083.pdf) 方法仅运行一次 CNN 推理,因此减少了计算量。 CNN 的输出用于建议网络并选择边界框。 它介绍了一种称为**兴趣区域池**的技术。 兴趣区域池采用 CNN 特征,并根据区域将它们合并在一起。 合并使用 CNN 进行推理后获得的特征,并选择区域,如下图所示:
![](img/9607861d-014a-4574-980d-90fb23f91ae4.png)
......@@ -207,17 +207,17 @@ Girshick 等人提出的 [Fast R-CNN](https://arxiv.org/pdf/1504.08083.pdf) 方
# Faster R-CNN
Ren 等人提出了 [Faster R-CNN](https://arxiv.org/pdf/1506.01497.pdf)。 Faster R-CNN 和 Fast R-CNN 方法之间的区别在于,Faster R-CNN 使用诸如 VGG 和 Inception 等架构的 CNN 功能来提案而不是选择性搜索。 CNN 功能进一步通过区域提议网络传递。 滑动窗口通过具有潜在边界框和分数的要素传递,并输出一些直观的长宽比,模型输出边界框和分数:
Ren 等人提出了 [Faster R-CNN](https://arxiv.org/pdf/1506.01497.pdf)。 Faster R-CNN 和 Fast R-CNN 方法之间的区别在于,Faster R-CNN 使用诸如 VGG 和 Inception 等架构的 CNN 特征来提案而不是选择性搜索。 CNN 特征进一步通过区域提议网络传递。 滑动窗口通过具有潜在边界框和分数的要素传递,并输出一些直观的长宽比,模型输出边界框和分数:
![](img/ea103e8f-b553-4d9d-89cd-077888fb7db0.png)
经 Ren 等人许可复制。
更快的 R-CNN 比快速 R-CNN 更快,因为它通过仅计算一次功能来节省计算量。
更快的 R-CNN 比快速 R-CNN 更快,因为它通过仅计算一次特征来节省计算量。
# 单发多框探测器
SSD(单发多框)是所有方法中最快的。 此方法同时预测对象并找到边界框。 在训练期间,可能会有很多负面因素,因此很难否定地挖掘班级失衡。 CNN 的输出具有各种大小的功能。 这些被传递到`3x3`卷积过滤器以预测边界框。
SSD(单发多框)是所有方法中最快的。 此方法同时预测对象并找到边界框。 在训练期间,可能会有很多负面因素,因此很难否定地挖掘班级失衡。 CNN 的输出具有各种大小的特征。 这些被传递到`3x3`卷积过滤器以预测边界框。
此步骤将预测对象和边界框:
......
......@@ -76,7 +76,7 @@
# 语义分割算法
提出了几种基于深度学习的算法来解决图像分割任务。 可以在像素级别应用滑动窗口方法进行分割。 滑动窗口方法会拍摄图像并将图像分成较小的作物。 图像的每种裁剪都被分类为标签。 这种方法昂贵且效率低下,因为它不会重用重叠补丁之间的共享功能。 在以下各节中,我们将讨论一些可以克服此问题的算法。
提出了几种基于深度学习的算法来解决图像分割任务。 可以在像素级别应用滑动窗口方法进行分割。 滑动窗口方法会拍摄图像并将图像分成较小的作物。 图像的每种裁剪都被分类为标签。 这种方法昂贵且效率低下,因为它不会重用重叠补丁之间的共享特征。 在以下各节中,我们将讨论一些可以克服此问题的算法。
# 全卷积网络
......@@ -100,7 +100,7 @@
![](img/6c6fa429-432a-4bc4-af17-015e872d5490.png)
将零添加到与上采样数字相同的位置。 通过记住下采样的位置并将其用于上采样,可以改善解池功能,如下所示:
将零添加到与上采样数字相同的位置。 通过记住下采样的位置并将其用于上采样,可以改善反池化,如下所示:
![](img/7793c888-12eb-40b1-944f-85470767c43c.png)
......@@ -227,7 +227,7 @@ Chen 等人提出的 [DeepLab](https://arxiv.org/pdf/1606.00915.pdf) 在多个
经 Reid 等人许可复制。
RefiNet 使用编码器,然后使用解码器。 CNN 的编码器输出。 解码器连接各种大小的功能
RefiNet 使用编码器,然后使用解码器。 CNN 的编码器输出。 解码器连接各种大小的特征
![](img/836b137d-c3de-4c2c-baa2-c6e86dd1b6fc.png)
......@@ -253,7 +253,7 @@ RefiNet 使用编码器,然后使用解码器。 CNN 的编码器输出。 解
# DeepLab v3
[Chen 等人在论文中使用批量归一化](https://arxiv.org/pdf/1706.05587.pdf)以提高表现。 功能的多尺度以级联方式编码,以提高表现:
[Chen 等人在论文中使用批量归一化](https://arxiv.org/pdf/1706.05587.pdf)以提高表现。 特征的多尺度以级联方式编码,以提高表现:
![](img/301dc866-0bfd-4010-a5f1-df4e33e12e34.png)
......@@ -522,7 +522,7 @@ fcn_model = tf.keras.models.Model(input=input_tensor, output=x)
经 He 等人许可复制。
该架构看起来与 R-CNN 类似,但增加了分段功能。 这是一个具有端到端训练的多阶段网络。 学习了区域提案。 该网络分为两个部分,一个用于检测,另一个用于分类评分。 结果非常好,如下所示:
该架构看起来与 R-CNN 类似,但增加了分段。 这是一个具有端到端训练的多阶段网络。 学习了区域提案。 该网络分为两个部分,一个用于检测,另一个用于分类评分。 结果非常好,如下所示:
![](img/a0697d7c-9d03-46fd-9ae2-ff00ff587825.png)
......
......@@ -510,7 +510,7 @@ def compute_distance(embedding_1, embedding_2):
# 寻找最佳阈值
使用前面的功能,可以计算出该系统的精度。 以下代码可用于计算最佳阈值:
使用前面的函数,可以计算出该系统的精度。 以下代码可用于计算最佳阈值:
```py
import sys
......
......@@ -127,7 +127,7 @@ Chen 等人在[论文](https://www.cs.cmu.edu/~xinleic/papers/cvpr15_rnn.pdf)中
转载自 Chen 等人(2015)
图像中的第一个模型是用于训练的完整模型。 如图中所示,视觉功能也可以用于生成句子,反之亦然。
图像中的第一个模型是用于训练的完整模型。 如图中所示,视觉特征也可以用于生成句子,反之亦然。
# 密集字幕
......@@ -301,7 +301,7 @@ predictions = tf.keras.layers.TimeDistributed(
tf.keras.layers.Dense(vocabulary_size, activation='softmax'))(h)
```
在前面的代码的帮助下,我们定义了一个深度学习模型,该模型将 CNN 功能与 RNN 结合在一起,并借助注意力机制。 目前,这是生成字幕的最佳方法。
在前面的代码的帮助下,我们定义了一个深度学习模型,该模型将 CNN 特征与 RNN 结合在一起,并借助注意力机制。 目前,这是生成字幕的最佳方法。
# 总结
......
......@@ -138,11 +138,11 @@
# 神经艺术风格迁移
我们将要实现的第一个应用是**神经艺术风格转换**。 在这里,我们将**梵高**艺术的风格迁移到图像上。 图像可以视为样式和内容的组合。 艺术风格转换技术将图像转换为看起来像具有特定绘画风格的绘画。 我们将看到如何编写这个想法。 `loss`功能将比较生成的图像与照片内容和绘画风格。 因此,针对图像像素而不是针对网络权重执行优化。 通过将照片的内容与生成的图像相比较,然后是绘画风格和生成的图像,可以计算出两个值。
我们将要实现的第一个应用是**神经艺术风格转换**。 在这里,我们将**梵高**艺术的风格迁移到图像上。 图像可以视为样式和内容的组合。 艺术风格转换技术将图像转换为看起来像具有特定绘画风格的绘画。 我们将看到如何编写这个想法。 `loss`函数将比较生成的图像与照片内容和绘画风格。 因此,针对图像像素而不是针对网络权重执行优化。 通过将照片的内容与生成的图像相比较,然后是绘画风格和生成的图像,可以计算出两个值。
# 内容损失
由于像素不是一个好的选择,我们将使用各个层的 CNN 功能,因为它们可以更好地表示内容。 如第 3 章,“图像检索”, 所示,初始层具有高频,例如边缘,拐角和纹理。 后面的层代表对象,因此更适合内容。 后者可以比像素更好地将对象与对象进行比较。 但是为此,我们需要先使用以下代码导入所需的库:
由于像素不是一个好的选择,我们将使用各个层的 CNN 特征,因为它们可以更好地表示内容。 如第 3 章,“图像检索”, 所示,初始层具有高频,例如边缘,拐角和纹理。 后面的层代表对象,因此更适合内容。 后者可以比像素更好地将对象与对象进行比较。 但是为此,我们需要先使用以下代码导入所需的库:
```py
import numpy as np
......@@ -183,7 +183,7 @@ def add_imagenet_mean(image, s):
首先,我们将了解如何使用其他图像中的内容创建图像。 这是根据**随机噪声**创建图像的过程。 此处使用的内容是某层中**激活**的总和。 我们将使随机噪声和图像之间的内容损失最小化,这被称为内容损失。 该损耗类似于逐像素损耗,但应用于层激活,因此将捕获内容而没有噪声。 任何 CNN 架构都可以用来转发内容图像和随机噪声。 比较这两个输出的激活,进行激活并计算均方误差。
冻结 CNN 权重时,将更新随机图像的像素。 在这种情况下,我们将冻结 VGG 网络。 现在,可以加载 VGG 模型。 生成图像对子采样技术(例如**最大池化**)非常敏感。 无法从最大池化中取回像素值。 因此,**平均池化**比最大池化更平滑。 使用平均池化转换 VGG 模型的功能用于加载模型,如下所示:
冻结 CNN 权重时,将更新随机图像的像素。 在这种情况下,我们将冻结 VGG 网络。 现在,可以加载 VGG 模型。 生成图像对子采样技术(例如**最大池化**)非常敏感。 无法从最大池化中取回像素值。 因此,**平均池化**比最大池化更平滑。 使用平均池化转换 VGG 模型的特征用于加载模型,如下所示:
```py
vgg_model = VGG16_Avg(include_top=False)
......@@ -195,7 +195,7 @@ vgg_model = VGG16_Avg(include_top=False)
content_layer = vgg_model.get_layer('block5_conv1').output
```
现在,使用截断的 VGG 创建新模型,直到具有良好功能的层。 因此,该图像现在可以加载,并且可以用于执行前向推断,以获得**实际激活的层**。 使用以下代码创建 TensorFlow 变量以捕获激活:
现在,使用截断的 VGG 创建新模型,直到具有良好特征的层。 因此,该图像现在可以加载,并且可以用于执行前向推断,以获得**实际激活的层**。 使用以下代码创建 TensorFlow 变量以捕获激活:
```py
content_model = Model(vgg_model.input, content_layer)
......@@ -243,7 +243,7 @@ cost_function = K.function([vgg_model.input], [mse_loss]+grads)
optimiser = ConvexOptimiser(cost_function, content_image_shape)
```
可以使用简单的优化程序来优化此功能,因为它是凸的,因此是确定性的。 我们还可以在迭代的每个步骤中保存图像。 我们将以可访问梯度的方式进行定义,就像我们使用 scikit-learn 的优化程序进行最终优化一样。 注意,该损失函数是凸的,因此,简单的优化器足以满足计算要求。 可以使用以下代码定义优化器:
可以使用简单的优化程序来优化此函数,因为它是凸的,因此是确定性的。 我们还可以在迭代的每个步骤中保存图像。 我们将以可访问梯度的方式进行定义,就像我们使用 scikit-learn 的优化程序进行最终优化一样。 注意,该损失函数是凸的,因此,简单的优化器足以满足计算要求。 可以使用以下代码定义优化器:
```py
def optimise(optimiser, iterations, point, tensor_shape, file_name):
......@@ -428,7 +428,7 @@ content_model = Model(model.input, content_layer)
content_targ = K.variable(content_model.predict(src))
```
现在,两种方法的合并就像合并它们各自的损失函数一样简单。 请注意,与我们之前的功能相反,此功能将产生三种不同类型的输出:
现在,两种方法的合并就像合并它们各自的损失函数一样简单。 请注意,与我们之前的函数相反,此函数将产生三种不同类型的输出:
* 一个用于原始图像
* 一个用于模仿我们风格的图片
......
......@@ -38,7 +38,7 @@
# YouTube-8M
**YouTube-8M** 数据集用于视频分类问题。 数据集包含带有标签和视觉功能的视频 URL。 以下是有关数据集的一些统计信息:
**YouTube-8M** 数据集用于视频分类问题。 数据集包含带有标签和视觉特征的视频 URL。 以下是有关数据集的一些统计信息:
* **视频 URL 的数量**:700 万
* **影片剪辑的时长**:450,000
......@@ -130,8 +130,8 @@ logits = dense_layer(dense_layer_bottleneck, no_classes)
融合方法适用于短视频片段。 分类较长的视频很困难,因为必须计算和记住很多帧。 [Ng 等人](https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Ng_Beyond_Short_Snippets_2015_CVPR_paper.pdf)提出了两种对较长视频进行分类的方法:
* 第一种方法是在时间上合并卷积特征。 最大池用作功能`aggregation`方法。
* 第二种方法是使用 LSTM 连接处理各种可变长度视频的卷积功能
* 第一种方法是在时间上合并卷积特征。 最大池用作函数`aggregation`方法。
* 第二种方法是使用 LSTM 连接处理各种可变长度视频的卷积特征
下图显示了这两种方法:
......@@ -139,7 +139,7 @@ logits = dense_layer(dense_layer_bottleneck, no_classes)
摘自 Ng 等人
可以提取 CNN 功能并将其馈送到小型 LSTM 网络,如以下代码所示:
可以提取 CNN 特征并将其馈送到小型 LSTM 网络,如以下代码所示:
```py
net = tf.keras.models.Sequential()
......@@ -152,7 +152,7 @@ net.add(tf.keras.layers.Dropout(0.5))
net.add(tf.keras.layers.Dense(no_classes, activation='softmax'))
```
添加 LSTM 进行功能池可提供更好的表现。 功能以各种方式合并,如下图所示:
添加 LSTM 进行特征池化可提供更好的表现。 特征以各种方式合并,如下图所示:
![](img/72c1430c-6604-4c17-abe6-133fe2d4daa9.png)
......@@ -230,7 +230,7 @@ net.compile(loss=tf.keras.losses.categorical_crossentropy,
# 使用轨迹的分类
[Wang 等人](https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Wang_Action_Recognition_With_2015_CVPR_paper.pdf)使用身体各部分的轨迹对所执行的动作进行分类。 这项工作结合了手工制作和深度学习的功能,可以进行最终预测。 以下是分类的表示形式:
[Wang 等人](https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Wang_Action_Recognition_With_2015_CVPR_paper.pdf)使用身体各部分的轨迹对所执行的动作进行分类。 这项工作结合了手工制作和深度学习的特征,可以进行最终预测。 以下是分类的表示形式:
![](img/fa390d0d-4a3e-48af-8fe6-4896c092d2e9.png)
......@@ -281,7 +281,7 @@ net.compile(loss=tf.keras.losses.categorical_crossentropy,
转载自 Sharma 等人
根据注意,计算并加权 **CNN** 功能。 对某些区域的关注或权重可以用于可视化。 [Sharma 等人](https://arxiv.org/pdf/1511.04119.pdf)使用此想法对视频进行分类。 **LSTM** 被用作卷积特征。 **LSTM** 通过注意以下帧来预测区域,如下图所示:
根据注意,计算并加权 **CNN** 特征。 对某些区域的关注或权重可以用于可视化。 [Sharma 等人](https://arxiv.org/pdf/1511.04119.pdf)使用此想法对视频进行分类。 **LSTM** 被用作卷积特征。 **LSTM** 通过注意以下帧来预测区域,如下图所示:
![](img/c835ef24-72c0-4144-9fd8-890500f2c8ac.png)
......@@ -345,9 +345,9 @@ net.compile(loss=tf.keras.losses.categorical_crossentropy,
转载自 Yao 等人
[Donahue 等人](https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Donahue_Long-Term_Recurrent_Convolutional_2015_CVPR_paper.pdf)提出了另一种视频字幕或描述方法,该方法将 **LSTM** 与卷积功能组合。
[Donahue 等人](https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Donahue_Long-Term_Recurrent_Convolutional_2015_CVPR_paper.pdf)提出了另一种视频字幕或描述方法,该方法将 **LSTM** 与卷积特征组合。
这类似于前面的方法,除了我们在此处使用 2D 卷积功能,如下图所示:
这类似于前面的方法,除了我们在此处使用 2D 卷积特征,如下图所示:
![](img/fe273a12-ded0-4027-b3d1-0657dee35178.png)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册