Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
D_ACMER
apachecn-dl-zh
提交
b73848b3
A
apachecn-dl-zh
项目概览
D_ACMER
/
apachecn-dl-zh
与 Fork 源项目一致
Fork自
OpenDocCN / apachecn-dl-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-dl-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b73848b3
编写于
9月 13, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-09-13 23:15:38
上级
2803faca
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
29 addition
and
29 deletion
+29
-29
docs/handson-cnn-tf/3.md
docs/handson-cnn-tf/3.md
+13
-13
docs/handson-cnn-tf/4.md
docs/handson-cnn-tf/4.md
+15
-15
docs/handson-cnn-tf/5.md
docs/handson-cnn-tf/5.md
+1
-1
未找到文件。
docs/handson-cnn-tf/3.md
浏览文件 @
b73848b3
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
一个更好的解决方案是告诉计算机从输入图像中提取一些有意义的特征,例如常见的形状,纹理或颜色。 然后,我们可以使用这些功能而不是原始输入图像作为分类器的输入。 现在,我们正在寻找图像中这些功能的存在,以告诉我们图像是否包含我们要识别的对象。
一个更好的解决方案是告诉计算机从输入图像中提取一些有意义的特征,例如常见的形状,纹理或颜色。 然后,我们可以使用这些功能而不是原始输入图像作为分类器的输入。 现在,我们正在寻找图像中这些功能的存在,以告诉我们图像是否包含我们要识别的对象。
这些提取的特征在我们看来将仅仅是一个高维向量(但通常比原始图像空间要小得多),可以用作分类器的输入。 多年来开发的一些著名的特征提取方法是
**尺度不变特征**
(
**SIFT**
),
**最大稳定的末端区域**
(
**MSER
[**
),
**本地二进制模式**
(
**LBP**
)和定向梯度(
**HOG**
)的
**直方图。**
这些提取的特征在我们看来将仅仅是一个高维向量(但通常比原始图像空间要小得多),可以用作分类器的输入。 多年来开发的一些著名的特征提取方法是
**尺度不变特征**
(
**SIFT**
),
**最大稳定的末端区域**
(
**MSER
**
),
**本地二进制模式**
(
**LBP**
)和
**直方图定向梯度**
(
**HOG**
)。
当使用卷积神经网络进行图像分类时,2012 年是计算机视觉(以及随后的其他机器学习领域)最大的转折点之一,这标志着如何解决这一任务(以及许多其他问题)的方式发生了转变。 我们不是专注于手工制作更好的特征以从图像中提取,而是使用数据驱动的方法来找到代表问题数据集的最佳特征集。 CNN 将使用大量训练图像,并自己学习代表数据的最佳特征,以解决分类任务。
当使用卷积神经网络进行图像分类时,2012 年是计算机视觉(以及随后的其他机器学习领域)最大的转折点之一,这标志着如何解决这一任务(以及许多其他问题)的方式发生了转变。 我们不是专注于手工制作更好的特征以从图像中提取,而是使用数据驱动的方法来找到代表问题数据集的最佳特征集。 CNN 将使用大量训练图像,并自己学习代表数据的最佳特征,以解决分类任务。
...
@@ -23,7 +23,7 @@
...
@@ -23,7 +23,7 @@
# CNN 模型架构
# CNN 模型架构
图像分类模型的关键部分是其 CNN 层。 这些层将负责从图像数据中提取特征。 这些 CNN 图层的输出将是一个特征向量,就像以前一样,我们可以将其用作所选分类器的输入。 对于许多 CNN 模型,分类器将只是连接到我们 CNN 输出的完全连接层。 如第 1 章,
*设置和 TensorFlow*
简介
中所示,我们的线性分类器只是一个全连接层; 除了层的大小和输入会有所不同之外,这里就是这种情况。
图像分类模型的关键部分是其 CNN 层。 这些层将负责从图像数据中提取特征。 这些 CNN 图层的输出将是一个特征向量,就像以前一样,我们可以将其用作所选分类器的输入。 对于许多 CNN 模型,分类器将只是连接到我们 CNN 输出的完全连接层。 如第 1 章,
“TensorFlow 简介和设置”
中所示,我们的线性分类器只是一个全连接层; 除了层的大小和输入会有所不同之外,这里就是这种情况。
重要的是要注意,分类或回归问题(例如本地化)(或其他使用图像的其他问题)所使用的 CNN 架构在本质上是相同的。 唯一真正的不同是,在 CNN 层完成特征提取之后会发生什么。 例如,一个差异可能是用于不同任务的损失函数,如下图所示:
重要的是要注意,分类或回归问题(例如本地化)(或其他使用图像的其他问题)所使用的 CNN 架构在本质上是相同的。 唯一真正的不同是,在 CNN 层完成特征提取之后会发生什么。 例如,一个差异可能是用于不同任务的损失函数,如下图所示:
...
@@ -35,11 +35,11 @@
...
@@ -35,11 +35,11 @@
图像分类的最简单形式是二进制分类。 在这里,我们有一个分类器,该分类器只有一个要分类的对象,例如 dog / no dog。 在这种情况下,我们可能使用的损失函数是二进制交叉熵损失。
图像分类的最简单形式是二进制分类。 在这里,我们有一个分类器,该分类器只有一个要分类的对象,例如 dog / no dog。 在这种情况下,我们可能使用的损失函数是二进制交叉熵损失。
真实标签
*p*
与模型预测
*q*
之间的交叉熵函数定义为:
真实标签
`p`
与模型预测
`q`
之间的交叉熵函数定义为:
![](
img/d779d726-0be1-497d-9c99-80d12f4bd263.png
)
![](
img/d779d726-0be1-497d-9c99-80d12f4bd263.png
)
*i*
是我们标签和预测的每个可能元素的索引。
`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 !
[](
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
)
} 我们得到:
...
@@ -47,7 +47,7 @@
...
@@ -47,7 +47,7 @@
这是等效的
这是等效的
迭代!
[](
img/b2408251-310a-4215-8cad-5e4da25c52d0.png
)
训练示例,将要最小化的成本函数
*L*
变为:
迭代!
[](
img/b2408251-310a-4215-8cad-5e4da25c52d0.png
)
训练示例,将要最小化的成本函数
`L`
变为:
![](
img/07a806c2-2a49-41a4-ba69-c3adee95a705.png
)
![](
img/07a806c2-2a49-41a4-ba69-c3adee95a705.png
)
...
@@ -81,7 +81,7 @@ loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model_logit
...
@@ -81,7 +81,7 @@ loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model_logit
# 训练/测试数据集拆分
# 训练/测试数据集拆分
暂时请注意,我们需要将数据集分为两组:训练和测试。 正如第 1 章,
*设置和 TensorFlow 简介,*
中所述,这是因为我们需要以某种方式检查模型是否能够从其自身的训练样本中进行概括(是否 能够正确识别训练中从未见过的图像)。 如果我们的模型不能做到这一点,对我们来说就没有太大用处。
暂时请注意,我们需要将数据集分为两组:训练和测试。 正如第 1 章,
“TensorFlow 简介和设置”
中所述,这是因为我们需要以某种方式检查模型是否能够从其自身的训练样本中进行概括(是否 能够正确识别训练中从未见过的图像)。 如果我们的模型不能做到这一点,对我们来说就没有太大用处。
还有一些其他要记住的重要点:
还有一些其他要记住的重要点:
...
@@ -96,7 +96,7 @@ loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model_logit
...
@@ -96,7 +96,7 @@ loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model_logit
加州理工学院的数据集由加州理工学院建立,并发布了两个版本。 Caltech-101 于 2003 年发布,包含 101 个类别,每个类别约 40 至 800 张图像; Caltech-256 于 2007 年发布,具有 256 个对象类别,总共包含 30607 张图像。 这些图片是从 Google 图片和 PicSearch 收集的,其大小约为 300x400 像素。
加州理工学院的数据集由加州理工学院建立,并发布了两个版本。 Caltech-101 于 2003 年发布,包含 101 个类别,每个类别约 40 至 800 张图像; Caltech-256 于 2007 年发布,具有 256 个对象类别,总共包含 30607 张图像。 这些图片是从 Google 图片和 PicSearch 收集的,其大小约为 300x400 像素。
Pascal
**视觉对象类**
(
**VOC**
)挑战成立于 2005 年。每年组织到 2012 年,它为
*图像
提供了广泛的自然图像的著名基准数据集。 类别分类,对象检测,分割和操作分类*
。 它是一个多样化的数据集,包含来自各种大小,姿势,方向,照明和遮挡的 flickr 的图像。 从 2005 年(仅四个类别:自行车,汽车,摩托车和人,火车/验证/测试:包含 5 个图像的 2578 个注释对象的 1578 张图像)到 2012 年(二十个类别,火车/验证数据具有 11,530 张图片,包含 27,450 个 ROI 注释对象和 6,929 个细分)。
Pascal
**视觉对象类**
(
**VOC**
)挑战成立于 2005 年。每年组织到 2012 年,它为
*图像
分类,对象检测,分割和操作分类*
提供了广泛的自然图像的著名基准数据集
。 它是一个多样化的数据集,包含来自各种大小,姿势,方向,照明和遮挡的 flickr 的图像。 从 2005 年(仅四个类别:自行车,汽车,摩托车和人,火车/验证/测试:包含 5 个图像的 2578 个注释对象的 1578 张图像)到 2012 年(二十个类别,火车/验证数据具有 11,530 张图片,包含 27,450 个 ROI 注释对象和 6,929 个细分)。
重大变化来自 PASCAL(VOC)2007 挑战赛,当时班级的数量从 4 个增加到 20 个,并且此后一直固定。 分类任务的评估指标已更改为平均精度。 仅在 VOC 2007 挑战赛之前提供测试数据的注释。
重大变化来自 PASCAL(VOC)2007 挑战赛,当时班级的数量从 4 个增加到 20 个,并且此后一直固定。 分类任务的评估指标已更改为平均精度。 仅在 VOC 2007 挑战赛之前提供测试数据的注释。
...
@@ -248,7 +248,7 @@ if __name__ == '__main__':
...
@@ -248,7 +248,7 @@ if __name__ == '__main__':
# 建立 CNN 图
# 建立 CNN 图
让我们通过
`build_graph`
函数进行详细介绍,该函数包含网络定义,损失函数和所使用的优化器。 首先,我们通过为输入定义占位符来启动函数。 我们将使用两个占位符在图表中提供数据和标签:
`__x_`
和
`__y_`
。 占位符
`__x_`
将保存我们输入的 RGB 图像,而占位符
`__y_`
存储一个对应类别的热门标签。 在定义占位符形状的
*N*
部分时,我们使用
`None`
,因为这告诉 TensorFlow 该值可以是任何值,并且在执行图形时将提供该值:
让我们通过
`build_graph`
函数进行详细介绍,该函数包含网络定义,损失函数和所使用的优化器。 首先,我们通过为输入定义占位符来启动函数。 我们将使用两个占位符在图表中提供数据和标签:
`__x_`
和
`__y_`
。 占位符
`__x_`
将保存我们输入的 RGB 图像,而占位符
`__y_`
存储一个对应类别的热门标签。 在定义占位符形状的
`N`
部分时,我们使用
`None`
,因为这告诉 TensorFlow 该值可以是任何值,并且在执行图形时将提供该值:
```
py
```
py
def
build_graph
(
self
):
def
build_graph
(
self
):
...
@@ -358,7 +358,7 @@ decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
...
@@ -358,7 +358,7 @@ decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
一旦定义了图的所有组件,就将图中收集的所有摘要合并到
`__merged_summary_op`
中,并通过
`tf.global_variables_initializer()`
初始化图的所有变量。
一旦定义了图的所有组件,就将图中收集的所有摘要合并到
`__merged_summary_op`
中,并通过
`tf.global_variables_initializer()`
初始化图的所有变量。
自然,在训练模型时,我们希望将网络权重存储为二进制文件,以便我们可以将其加载回去以执行正向传播。 TensorFlow 中的那些二进制文件称为检查点,它们将变量名称映射到张量值。 要在检查点之间保存和还原变量,我们使用
`Saver`
类。 为避免填满磁盘,保护程序会自动管理检查点文件。 例如,他们每训练一次
*N*
小时,就只能保留
*N*
个最新文件或一个检查点。 在我们的例子中,我们将
`max_to_keep`
设置为
`None`
,这意味着将保留所有检查点文件:
自然,在训练模型时,我们希望将网络权重存储为二进制文件,以便我们可以将其加载回去以执行正向传播。 TensorFlow 中的那些二进制文件称为检查点,它们将变量名称映射到张量值。 要在检查点之间保存和还原变量,我们使用
`Saver`
类。 为避免填满磁盘,保护程序会自动管理检查点文件。 例如,他们每训练一次
`N`
小时,就只能保留
`N`
个最新文件或一个检查点。 在我们的例子中,我们将
`max_to_keep`
设置为
`None`
,这意味着将保留所有检查点文件:
```
py
```
py
# Merge op for tensorboard
# Merge op for tensorboard
...
@@ -528,7 +528,7 @@ decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
...
@@ -528,7 +528,7 @@ decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
# Xavier-Bengio 和初始化器
# 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 表明,如果从均匀分布!
[](
img/5a4de500-3124-48fe-95cc-3334edf40879.png
)
初始化每一层的权重,其中!
[](
img/52111d38-7c16-45b3-98e6-8be01332fad5.png
)
是大小 在上一层中,对于乙状结肠激活函数,顶层(更靠近输出)的神经元迅速饱和为 0。我们知道,由于乙状结肠函数的形式,激活值 0 表示权重非常大,并且 反向传播的梯度接近零。 较小的梯度值会减慢学习过程,因为早期图层中的权重停止更新或停止学习。
因此,我们想要的是使权重在最初确定的时间间隔内均匀分布,也就是说,权重的方差应该在我们从底层移动到顶层时保持不变。 这将使错误平稳地流到顶层,从而使网络在训练期间收敛更快。
因此,我们想要的是使权重在最初确定的时间间隔内均匀分布,也就是说,权重的方差应该在我们从底层移动到顶层时保持不变。 这将使错误平稳地流到顶层,从而使网络在训练期间收敛更快。
...
@@ -570,7 +570,7 @@ bias_initializer=tf.zeros_initializer())
...
@@ -570,7 +570,7 @@ bias_initializer=tf.zeros_initializer())
为此,我们在使用的任何损失函数中增加了一个额外的项。 对于 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 正则化,我们添加的术语是!
[](
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 正则化]的第 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/77172207-ce67-4347-b51e-bf6565a195fd.png
)
...
@@ -631,7 +631,7 @@ combined_loss = tf.n_add(train_loss, reg_losses)
...
@@ -631,7 +631,7 @@ combined_loss = tf.n_add(train_loss, reg_losses)
![](
img/eef8f1a2-e6e1-40aa-9c0e-8ef692a60665.png
)
![](
img/eef8f1a2-e6e1-40aa-9c0e-8ef692a60665.png
)
通常,辍学仅适用于全连接层,但也可以适用于卷积/池化层。 如果这样做,则将使用较低的
*p*
(掉线的可能性),接近 0.2。 同样,您将辍学层放置在激活层之后。
通常,辍学仅适用于全连接层,但也可以适用于卷积/池化层。 如果这样做,则将使用较低的
`p`
(掉线的可能性),接近 0.2。 同样,您将辍学层放置在激活层之后。
要在 TensorFlow 模型中使用 dropout,我们在希望将 dropout 应用到的输入层上调用
`tf.layers.dropout()`
。 我们还必须指定我们要使用的辍学率,更重要的是,使用布尔值让 TensorFlow 知道我们的模型是否在训练中。 请记住,当我们在测试时使用模型时,我们会关闭辍学,而这个布尔值将为我们做到这一点。 因此,带有辍学的代码将如下所示:
要在 TensorFlow 模型中使用 dropout,我们在希望将 dropout 应用到的输入层上调用
`tf.layers.dropout()`
。 我们还必须指定我们要使用的辍学率,更重要的是,使用布尔值让 TensorFlow 知道我们的模型是否在训练中。 请记住,当我们在测试时使用模型时,我们会关闭辍学,而这个布尔值将为我们做到这一点。 因此,带有辍学的代码将如下所示:
...
@@ -665,7 +665,7 @@ fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
...
@@ -665,7 +665,7 @@ fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
*
给您的模型某种正则化效果
*
给您的模型某种正则化效果
*
使得可以使用饱和非线性,例如 S 型
*
使得可以使用饱和非线性,例如 S 型
对于更多的数学读者,可以在批处理规范论文“批处理规范化:通过减少内部协变量偏移来加速深层网络训练”中找到更为正式的定义,这是一篇写得很好的论文,易于理解和解释。 更详细的概念。 如果假设我们有一个仅具有全连接层的简单神经网络,则正如我们在第 1 章,
*设置和 TensorFlow*
简介
中所看到的,每一层的激活将是 !
[](
img/9d0ff275-b662-433d-b367-ac3ac9b46b54.png
)
表格。
对于更多的数学读者,可以在批处理规范论文“批处理规范化:通过减少内部协变量偏移来加速深层网络训练”中找到更为正式的定义,这是一篇写得很好的论文,易于理解和解释。 更详细的概念。 如果假设我们有一个仅具有全连接层的简单神经网络,则正如我们在第 1 章,
“TensorFlow 简介和设置”
中所看到的,每一层的激活将是 !
[](
img/9d0ff275-b662-433d-b367-ac3ac9b46b54.png
)
表格。
假设!
[](
img/c0d727f5-4add-40b7-95df-07d67752638f.png
)
是非线性的,例如 S 型或 ReLU,然后将批量归一化!
[](
img/fb58ac38-9b3e-4f29-b02e-ee58df896884.png
)
直接应用于每个单元,例如:
假设!
[](
img/c0d727f5-4add-40b7-95df-07d67752638f.png
)
是非线性的,例如 S 型或 ReLU,然后将批量归一化!
[](
img/fb58ac38-9b3e-4f29-b02e-ee58df896884.png
)
直接应用于每个单元,例如:
...
...
docs/handson-cnn-tf/4.md
浏览文件 @
b73848b3
...
@@ -22,15 +22,15 @@
...
@@ -22,15 +22,15 @@
在上一章学习了图像分类之后,我们现在知道对图像进行分类时,我们只是试图在该图像内输出对象的类标签。 通常,为了简化任务,图像中将只有一个对象。
在上一章学习了图像分类之后,我们现在知道对图像进行分类时,我们只是试图在该图像内输出对象的类标签。 通常,为了简化任务,图像中将只有一个对象。
展望未来,在许多情况下,我们也有兴趣在图像中找到对象的位置。 定位对象这一任务的名称称为
**localization**
。 在这种情况下,我们要产生的输出是围绕对象的盒子的坐标。 此框的名称是边界框或边界矩形。 关于定位的重要细节是,每个图像只能定位一个对象。
展望未来,在许多情况下,我们也有兴趣在图像中找到对象的位置。 定位对象这一任务的名称称为
**定位**
。 在这种情况下,我们要产生的输出是围绕对象的盒子的坐标。 此框的名称是边界框或边界矩形。 关于定位的重要细节是,每个图像只能定位一个对象。
当我们建立一个负责预测类别标签以及感兴趣对象周围的边界框的模型时,称为带有局部化的
**图像分类
。**
当我们建立一个负责预测类别标签以及感兴趣对象周围的边界框的模型时,称为带有局部化的
**图像分类
**
。
# 本地化为回归
# 本地化为回归
可以使用与我们在第 3 章,
*TensorFlow*
中的图像分类
中了解的网络架构相似的网络架构来实现本地化。
可以使用与我们在第 3 章,
“TensorFlow 中的图像分类”
中了解的网络架构相似的网络架构来实现本地化。
除了预测类标签外,我们还将输出一个标志,指示对象的存在以及对象边界框的坐标。 边界框坐标通常是四个数字,分别代表左上角的
*x*
和
*y*
坐标,以及框的高度和宽度。
除了预测类标签外,我们还将输出一个标志,指示对象的存在以及对象边界框的坐标。 边界框坐标通常是四个数字,分别代表左上角的
`x`
和
`y`
坐标,以及框的高度和宽度。
例如,在这种情况下,我们有两个类别(C1(汽车)和 C2(人))进行预测。 我们网络的输出如下所示:
例如,在这种情况下,我们有两个类别(C1(汽车)和 C2(人))进行预测。 我们网络的输出如下所示:
...
@@ -120,7 +120,7 @@ def build_graph(self):
...
@@ -120,7 +120,7 @@ def build_graph(self):
# 本地化的其他应用
# 本地化的其他应用
使用 CNN 在图像中输出兴趣点坐标的想法可以扩展到许多其他应用程序。 其中一些包括人体姿势估计(
*DeepPose:通过深度神经网络进行人体姿势估计)*
,如下所示:
使用 CNN 在图像中输出兴趣点坐标的想法可以扩展到许多其他应用程序。 其中一些包括人体姿势估计(
《DeepPose:通过深度神经网络进行人体姿势估计》)
,如下所示:
![](
img/301f40a0-4a5d-4355-bcc2-118d1c180495.png
)
![](
img/301f40a0-4a5d-4355-bcc2-118d1c180495.png
)
...
@@ -150,7 +150,7 @@ def build_graph(self):
...
@@ -150,7 +150,7 @@ def build_graph(self):
区域提议方法将在图像中提供类似斑点的矩形区域,这些区域可能包含感兴趣的对象。 这些区域是存在感兴趣对象的候选区域。 然后,仅将 CNN 分类器应用于这些建议的区域。 与滑动窗口方法相比,这大大减少了发送到 CNN 进行分类的农作物的数量。
区域提议方法将在图像中提供类似斑点的矩形区域,这些区域可能包含感兴趣的对象。 这些区域是存在感兴趣对象的候选区域。 然后,仅将 CNN 分类器应用于这些建议的区域。 与滑动窗口方法相比,这大大减少了发送到 CNN 进行分类的农作物的数量。
该特定方法在 2013 年提出,并被称为
*R-CNN:
具有 CNN*
的区域
。 下图描述了 R-CNN 的过程:
该特定方法在 2013 年提出,并被称为
*R-CNN:
区域 CNN*
。 下图描述了 R-CNN 的过程:
![](
img/686ba064-f451-4a2d-b691-320dc2bc08b9.png
)
![](
img/686ba064-f451-4a2d-b691-320dc2bc08b9.png
)
...
@@ -172,7 +172,7 @@ R-CNN 与 FastRCNN 的比较表明,后者在训练时快约 10 倍,而在测
...
@@ -172,7 +172,7 @@ R-CNN 与 FastRCNN 的比较表明,后者在训练时快约 10 倍,而在测
这项技术在 2015 年 Fast R-CNN 之后不久提出,解决了使用外部区域建议方法的需求,并消除了与之相关的计算成本。
这项技术在 2015 年 Fast R-CNN 之后不久提出,解决了使用外部区域建议方法的需求,并消除了与之相关的计算成本。
该算法的主要区别在于,不是使用外部算法(例如选择性搜索)来创建提案,而是使用称为
**区域
提案网络**
(
**RPN**
)的子网
为我们学习并提出建议。 在此屏幕快照中显示:
该算法的主要区别在于,不是使用外部算法(例如选择性搜索)来创建提案,而是使用称为
**区域
候选网络**
(
**RPN**
)的子网
为我们学习并提出建议。 在此屏幕快照中显示:
![](
img/126d2b47-420b-482c-a03f-a43408f3fd04.jpg
)
![](
img/126d2b47-420b-482c-a03f-a43408f3fd04.jpg
)
...
@@ -196,7 +196,7 @@ RoI 层的输入将是建议和最后的卷积层激活。 例如,考虑以下
...
@@ -196,7 +196,7 @@ RoI 层的输入将是建议和最后的卷积层激活。 例如,考虑以下
这里,我们有一个表格,总结了方法之间的差异:
这里,我们有一个表格,总结了方法之间的差异:
| |
**R-CNN**
|
**
快速 R-CNN**
|
**更快的
R-CNN**
|
| |
**R-CNN**
|
**
Fast R-CNN**
|
**Faster
R-CNN**
|
| 每个图像的测试时间 | 50 秒 | 2 秒 | 0.2 秒 |
| 每个图像的测试时间 | 50 秒 | 2 秒 | 0.2 秒 |
| 加速 | 1 倍 | 25 倍 | 250 倍 |
| 加速 | 1 倍 | 25 倍 | 250 倍 |
| 准确性 | 66% | 66.9% | 66.9% |
| 准确性 | 66% | 66.9% | 66.9% |
...
@@ -223,7 +223,7 @@ RoI 层的输入将是建议和最后的卷积层激活。 例如,考虑以下
...
@@ -223,7 +223,7 @@ RoI 层的输入将是建议和最后的卷积层激活。 例如,考虑以下
YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输入图像中各个位置的预测计算。为实现此目的,网络以大小为!
[](
img/a70666c6-6cd7-4919-8f13-5e4a4ea873b5.png
)
单元格的网格形式输出特征图。
YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输入图像中各个位置的预测计算。为实现此目的,网络以大小为!
[](
img/a70666c6-6cd7-4919-8f13-5e4a4ea873b5.png
)
单元格的网格形式输出特征图。
每个单元格都有
B
* 5 + C 条目。 其中“ B”是每个单元格的边界框的数量,C 是类概率的数量,而 5 是每个边界框的元素(x,y:边界框相对于其所在单元格的中心点坐标 , *
w
* -相对于原始图像的边界框的宽度, *
h
*
-相对于原始图像的边界框的高度,置信度:边界中对象存在的可能性 框
)。
每个单元格都有
`B * 5 + C`
条目。 其中
`B`
是每个单元格的边界框的数量,C 是类概率的数量,而 5 是每个边界框的元素(x,y:边界框相对于其所在单元格的中心点坐标,
`w`
是相对于原始图像的边界框的宽度,
`h`
是相对于原始图像的边界框的高度,置信度:边界框中对象存在的可能性
)。
我们将置信度得分定义为:
我们将置信度得分定义为:
...
@@ -263,7 +263,7 @@ YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输
...
@@ -263,7 +263,7 @@ YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输
![](
img/1240f8dd-6aba-4dde-b00a-384cac6c7295.png
)
![](
img/1240f8dd-6aba-4dde-b00a-384cac6c7295.png
)
第一个条目是类别!
[](
img/d1365f23-8d32-4254-ab51-1f228e448671.png
)
存在的置信度得分,对于没有对象的单元格中的两个锚定框,该得分均为 0。 其余值将
是
*无关*
。 单元格编号 8 有一个对象,并且对象的边界框具有较高的 IOU。
第一个条目是类别!
[](
img/d1365f23-8d32-4254-ab51-1f228e448671.png
)
存在的置信度得分,对于没有对象的单元格中的两个锚定框,该得分均为 0。 其余值将
*无关*
。 单元格编号 8 有一个对象,并且对象的边界框具有较高的 IOU。
对于大小为 NxM 的输入训练图像,训练后从 ConvNet 输出的目标向量的最终体积将为 3x3x16(在此玩具示例中)
对于大小为 NxM 的输入训练图像,训练后从 ConvNet 输出的目标向量的最终体积将为 3x3x16(在此玩具示例中)
...
@@ -279,7 +279,7 @@ YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输
...
@@ -279,7 +279,7 @@ YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输
![](
img/e0d3c104-c2bd-41f8-a3f7-7ad0d63c1e6c.png
)
![](
img/e0d3c104-c2bd-41f8-a3f7-7ad0d63c1e6c.png
)
我们还需要定义一个条件类别概率; 给定对象 P(class | Pr)的存在,我们想要这样做是因为我们不希望损失函数在单元格上没有对象的情况下惩罚错误的类预测。 该网络仅预测每个单元格的一组类别概率,而不考虑框数
*B。*
我们还需要定义一个条件类别概率; 给定对象 P(class | Pr)的存在,我们想要这样做是因为我们不希望损失函数在单元格上没有对象的情况下惩罚错误的类预测。 该网络仅预测每个单元格的一组类别概率,而不考虑框数
`B`
。
# 评估检测(并口交集)
# 评估检测(并口交集)
...
@@ -410,7 +410,7 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
...
@@ -410,7 +410,7 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
![](
img/a6b0764f-f0af-4fd1-bbc3-00fd2958c7fc.png
)
![](
img/a6b0764f-f0af-4fd1-bbc3-00fd2958c7fc.png
)
请注意,
**…**
条目表示即使对于没有对象的单元格,预测向量中也会有一些随机值。 但是,在单元格 8 中,x,y,h,w 的预测值有望接近准确。
请注意,
`...`
条目表示即使对于没有对象的单元格,预测向量中也会有一些随机值。 但是,在单元格 8 中,x,y,h,w 的预测值有望接近准确。
在最后阶段,我们可以使用非最大值抑制算法过滤每个像元中的多个预测边界框。
在最后阶段,我们可以使用非最大值抑制算法过滤每个像元中的多个预测边界框。
...
@@ -420,12 +420,12 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
...
@@ -420,12 +420,12 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
![](
img/7b0edf3c-b27d-4d1a-952d-ad10176656fd.png
)
![](
img/7b0edf3c-b27d-4d1a-952d-ad10176656fd.png
)
成员
*1ij*
obj
成员用于基于特定单元 i,j 上对象的存在来调制损耗:
成员
`1[ij]^obj`
成员用于基于特定单元 i,j 上对象的存在来调制损耗:
*
如果在网格单元格 i 和第 i 个边界框中具有最高 IoU 的对象存在:1
*
如果在网格单元格 i 和第 i 个边界框中具有最高 IoU 的对象存在:1
*
否则:0
*
否则:0
同样,
*1ij noobj*
正好相反。
同样,
`1[ij]^noobj`
正好相反。
# 损失第 1 部分
# 损失第 1 部分
...
@@ -530,7 +530,7 @@ def loss_layer(self, predicts, labels, scope='loss_layer'):
...
@@ -530,7 +530,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 章,
*自编码器,变分自编码器和生成模型*
中详细介绍。 现在,他们的基本思想是首先在空间上将输入量减小为某种压缩形式,然后恢复原始的空间大小:
有几种流行的 CNN 架构已被证明在分割任务中表现出色。 它们中的大多数是称为自编码器的一类模型的变体,我们将在第 6 章,
“自编码器,变分自编码器和生成模型”
中详细介绍。 现在,他们的基本思想是首先在空间上将输入量减小为某种压缩形式,然后恢复原始的空间大小:
![](
img/5043cb38-9cbf-4b58-b8b7-529a4e52031d.png
)
![](
img/5043cb38-9cbf-4b58-b8b7-529a4e52031d.png
)
...
...
docs/handson-cnn-tf/5.md
浏览文件 @
b73848b3
...
@@ -301,7 +301,7 @@ GoogLeNet 的主要优点是,它比 VGG 更为准确,同时使用的参数
...
@@ -301,7 +301,7 @@ GoogLeNet 的主要优点是,它比 VGG 更为准确,同时使用的参数
# 残留网络
# 残留网络
在前面的部分中,已经证明了网络的深度是有助于提高准确性的关键因素(请参见 VGG)。 TensorFlow 中的第 3 章
和
*图像分类中也显示,可以通过正确的权重初始化和批处理归一化来缓解深度网络中梯度消失或爆炸的问题。 但是,这是否意味着我们添加的层越多,我们得到的系统就越准确? 亚洲研究机构 Microsoft 的*
用于图像识别的深度残差学习
*的作者发现,只要网络深度达到 30 层,准确性就会达到饱和。 为了解决此问题,他们引入了一个称为残差块的新层块,该块将上一层的输出添加到下一层的输出中(请参见下图)。 Residual Net 或 ResNet 在非常深的网络(甚至超过 100 层!)中都显示了出色的结果,例如 152 层的 ResNet 赢得了 2015 LRVC 图像识别挑战,其前 5 个测试错误为 3.57。 事实证明,诸如 ResNets 之类的更深层网络要比包括 Inception 模块(例如 GoogLeNet)在内的更广泛的网络更好地工作。*
在前面的部分中,已经证明了网络的深度是有助于提高准确性的关键因素(请参见 VGG)。 TensorFlow 中的第 3 章
“图像分类”中也显示,可以通过正确的权重初始化和批处理归一化来缓解深度网络中梯度消失或爆炸的问题。 但是,这是否意味着我们添加的层越多,我们得到的系统就越准确? 亚洲研究机构 Microsoft 的《用于图像识别的深度残差学习》的作者发现,只要网络深度达到 30 层,准确性就会达到饱和。 为了解决此问题,他们引入了一个称为残差块的新层块,该块将上一层的输出添加到下一层的输出中(请参见下图)。 Residual Net 或 ResNet 在非常深的网络(甚至超过 100 层!)中都显示了出色的结果,例如 152 层的 ResNet 赢得了 2015 LRVC 图像识别挑战,其前 5 个测试错误为 3.57。 事实证明,诸如 ResNets 之类的更深层网络要比包括 Inception 模块(例如 GoogLeNet)在内的更广泛的网络更好地工作。
![](
img/d8ad63df-15dd-4d20-b918-a3f18767a9c8.png
)
![](
img/d8ad63df-15dd-4d20-b918-a3f18767a9c8.png
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录