Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
安浅Y
apachecn-dl-zh
提交
d731805d
A
apachecn-dl-zh
项目概览
安浅Y
/
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,体验更适合开发者的 AI 搜索 >>
提交
d731805d
编写于
9月 14, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-09-14 10:56:56
上级
b1621a64
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
38 addition
and
38 deletion
+38
-38
docs/handson-cnn-tf/1.md
docs/handson-cnn-tf/1.md
+2
-2
docs/handson-cnn-tf/2.md
docs/handson-cnn-tf/2.md
+7
-7
docs/handson-cnn-tf/3.md
docs/handson-cnn-tf/3.md
+7
-7
docs/handson-cnn-tf/4.md
docs/handson-cnn-tf/4.md
+2
-2
docs/handson-cnn-tf/5.md
docs/handson-cnn-tf/5.md
+6
-6
docs/handson-cnn-tf/6.md
docs/handson-cnn-tf/6.md
+2
-2
docs/handson-cnn-tf/8.md
docs/handson-cnn-tf/8.md
+10
-10
docs/handson-cnn-tf/9.md
docs/handson-cnn-tf/9.md
+2
-2
未找到文件。
docs/handson-cnn-tf/1.md
浏览文件 @
d731805d
...
...
@@ -201,7 +201,7 @@ test_labels = shuffled_labels[105:]
# 一热载体
改组后,我们对数据标签进行一些预处理。 随数据集加载的标签只是一个 150 长度的整数向量,表示每个数据点所属的目标类,在这种情况下为 1、2 或 3。 在创建机器学习模型时,我们希望将标签转换为一种新的形式,通过执行一种称为“
一键
编码”的方式可以更轻松地使用它。
改组后,我们对数据标签进行一些预处理。 随数据集加载的标签只是一个 150 长度的整数向量,表示每个数据点所属的目标类,在这种情况下为 1、2 或 3。 在创建机器学习模型时,我们希望将标签转换为一种新的形式,通过执行一种称为“
单热
编码”的方式可以更轻松地使用它。
不是使用单个数字作为每个数据点的标签,而是使用向量。 每个向量将与您拥有的不同目标类别的数目一样长。 因此,例如,如果您有 5 个目标类,则每个向量将有 5 个元素;例如, 如果您有 1,000 个目标类别,则每个向量将具有 1,000 个元素。 向量中的每一列代表我们的目标类别之一,我们可以使用二进制值来确定向量是其标签的类别。 可以通过将所有值设置为 0 并将 1 放入我们希望向量标签表示的类的列中来完成。
...
...
@@ -217,7 +217,7 @@ test_labels = shuffled_labels[105:]
最后,我们将数据集的一部分放到一边。 这就是我们的测试集,在我们训练模型之后我们才接触它。 该集合用于评估我们训练有素的模型对从未见过的新数据的性能。 有许多方法可以将数据分为训练集和测试集,我们将在本书的后面详细介绍它们。
但就目前而言,我们将进行一个简单的 70:30 拆分,因此我们仅使用总数据的 70
%来训练我们的模型,然后对剩余的 30%
进行测试。
但就目前而言,我们将进行一个简单的 70:30 拆分,因此我们仅使用总数据的 70
% 来训练我们的模型,然后对剩余的 30%
进行测试。
# 创建 TensorFlow 图
...
...
docs/handson-cnn-tf/2.md
浏览文件 @
d731805d
...
...
@@ -40,7 +40,7 @@ ML 使用诸如统计分析,概率模型,决策树和神经网络之类的*
假设对于我们的手部数据,我们有 1000 张不同的图像,现在我们已经对其进行处理以提取每个图像的特征向量。 在机器学习阶段,所有特征向量都将被提供给创建模型的机器学习系统。 我们希望该模型能够推广并能够预测未经过系统训练的任何未来图像的数字。
ML 系统的组成部分是评估。 在评估模型时,我们会看到模型在特定任务中的表现。 在我们的示例中,我们将研究它可以多么准确地从图像中预测数字。 90
%
的准确度意味着正确预测了 100 张给定图像中的 90 张。 在接下来的章节中,我们将更详细地讨论机器训练和评估过程。
ML 系统的组成部分是评估。 在评估模型时,我们会看到模型在特定任务中的表现。 在我们的示例中,我们将研究它可以多么准确地从图像中预测数字。 90
%
的准确度意味着正确预测了 100 张给定图像中的 90 张。 在接下来的章节中,我们将更详细地讨论机器训练和评估过程。
# ML 的类型
...
...
@@ -483,7 +483,7 @@ out_height = ceil(float(in_height) / float(strides[1]))
# 计算操作数
现在,我们对计算特定卷积层的计算成本感兴趣。 如果您想了解如何实现有效的网络结构(例如在移动设备中速度是关键时),则此步骤很重要。 另一个原因是要查看在硬件中实现特定层需要多少个乘法器。 现代 CNN 架构中的卷积层最多可负责模型中所有计算的 90
%
!
现在,我们对计算特定卷积层的计算成本感兴趣。 如果您想了解如何实现有效的网络结构(例如在移动设备中速度是关键时),则此步骤很重要。 另一个原因是要查看在硬件中实现特定层需要多少个乘法器。 现代 CNN 架构中的卷积层最多可负责模型中所有计算的 90
%
!
这些是影响 MAC(乘加累加器)/操作数量的因素:
...
...
@@ -564,28 +564,28 @@ 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/de62d0a3-1282-4fe4-a7b3-c454f4f0f4b7.png
)
在这里,组件如下:
*
!
[](
img/a7f7c3ff-5d04-4af7-9f6c-33f23f3424e5.png
)
:k 层的
接收场
*
!
[](
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 层(所有先前的层,而不是当前的一层)
仅对于第一层,接收域就是内核大小。
这些计算与是否使用卷积或池化层无关,例如,步幅为 2 的 conv 层将与步幅为 2 的池化层具有相同的
接收场
。
这些计算与是否使用卷积或池化层无关,例如,步幅为 2 的 conv 层将与步幅为 2 的池化层具有相同的
感受域
。
例如,给定以下图层之后的 14x14x3 图像,这将适用:
...
...
docs/handson-cnn-tf/3.md
浏览文件 @
d731805d
...
...
@@ -104,7 +104,7 @@ loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=model_logit
还有一些其他要记住的重要点:
*
训练和测试数据必须来自相同的分布(因此在拆分之前合并并混洗所有数据)
*
训练集通常大于测试集(例如,训练:占总数的 70
%,测试:占总数的 30%
)。
*
训练集通常大于测试集(例如,训练:占总数的 70
%,测试:占总数的 30%
)。
对于我们在前几章中要处理的示例,这些基础知识就足够了,但是在随后的章节中,我们将更详细地介绍如何为大型项目正确设置数据集。
...
...
@@ -140,9 +140,9 @@ ImageNet 数据集由 Alex Berg(哥伦比亚大学),Jia Deng(普林斯
![](
img/bd6af112-f4ec-4983-96cf-5b293eeb3e44.png
)
Imagenet 是近年来深度学习蓬勃发展的主要原因之一。 在深度学习开始流行之前,ILSVRC 的前五位错误率大约为 28
%,并且丝毫没有下降太多。 但是,在 2012 年,挑战赛的冠军 SuperVision 将前 5 名的分类错误降低到了 16.4%
。 团队模型(现在称为 AlexNet)是一个深度卷积神经网络。 这项巨大的胜利唤醒了人们使用 CNN 的力量,它成为许多现代 CNN 体系结构的垫脚石。
Imagenet 是近年来深度学习蓬勃发展的主要原因之一。 在深度学习开始流行之前,ILSVRC 的前五位错误率大约为 28
%,并且丝毫没有下降太多。 但是,在 2012 年,挑战赛的冠军 SuperVision 将前 5 名的分类错误降低到了 16.4%
。 团队模型(现在称为 AlexNet)是一个深度卷积神经网络。 这项巨大的胜利唤醒了人们使用 CNN 的力量,它成为许多现代 CNN 体系结构的垫脚石。
在接下来的几年中,CNN 模型继续占主导地位,前 5 个错误率持续下降。 2014 年冠军 GoogLeNet 将错误率降低到 6.7
%,而 ResNet 在 2015 年将错误率再次降低了一半,降至 3.57%。 此后,2017 年的赢家“ WMW 挤压和激励网络”产生了 2.25%
的误差,出现了较小的改进。
在接下来的几年中,CNN 模型继续占主导地位,前 5 个错误率持续下降。 2014 年冠军 GoogLeNet 将错误率降低到 6.7
%,而 ResNet 在 2015 年将错误率再次降低了一半,降至 3.57%。 此后,2017 年的赢家“WMW 挤压和激励网络”产生了 2.25%
的误差,出现了较小的改进。
# CIFAR
...
...
@@ -154,7 +154,7 @@ CIFAR-10 和 CIFAR-100 数据集是 Alex Krizhevsky,Vinod Nair 和 Geoffrey Hi
CIFAR-100 具有 100 个类别,每个类别 600 张图像。 这 100 个类别分为 20 个超类。 每个图像都有一个
**精细**
标签(它属于的类)和一个
**粗糙**
标签(它属于的超类)。 CIFAR-100 中的类和超类的列表可在
[
这个页面
](
https://www.cs.toronto.edu/~kriz/cifar.html
)
中找到。 将类别的数量从粗糙(20)增加到精细(100)有助于最大程度地提高类别间的可变性。 这意味着我们希望模型考虑图像中两个看起来相似的对象属于不同的类。 例如,一张床和一张沙发看起来相似但不完全相同,将它们放在单独的类中将确保它们与受训模型看起来不同。
CIFAR 的算法评估过程与 ImageNet 中的相同。 据 Saining Xie 等人报道,CIFAR-10 的报告最好的 top-1 误差为 3.58
%,而 CIFAR-100 的误差为 17.31%
。 深入神经网络的聚合残差转换中,他们介绍了新颖的 ResNeXt 体系结构。 可以在
[
这里
](
http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html
)
和
[
这里
](
https://github.com/RedditSota/state-of-the-art-result-for-machine-learning-problems
)
找到在 CIFAR-10 和 CIFAR-100 上将深度学习结果用于图像分类的最新技术。
CIFAR 的算法评估过程与 ImageNet 中的相同。 据 Saining Xie 等人报道,CIFAR-10 的报告最好的 top-1 误差为 3.58
%,而 CIFAR-100 的误差为 17.31%
。 深入神经网络的聚合残差转换中,他们介绍了新颖的 ResNeXt 体系结构。 可以在
[
这里
](
http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html
)
和
[
这里
](
https://github.com/RedditSota/state-of-the-art-result-for-machine-learning-problems
)
找到在 CIFAR-10 和 CIFAR-100 上将深度学习结果用于图像分类的最新技术。
# 加载 CIFAR
...
...
@@ -339,7 +339,7 @@ def build_graph(self):
在上一章中,我们简要提到了在训练过程中保持恒定的学习率可能会出现的问题。 随着我们模型的开始学习,我们的初始学习率很可能会变得太大而无法继续学习。 梯度下降更新将开始超出或绕过我们的最小值; 结果,损失函数的值不会降低。 为了解决这个问题,我们可以不时降低学习率的值。 这个过程称为学习率调度,有几种流行的方法。
第一种方法是在训练过程中的固定时间步长(例如,当训练完成 33
%和 66%
时)降低学习率。 通常,当达到这些设置时间时,您会将学习率降低 10 倍。
第一种方法是在训练过程中的固定时间步长(例如,当训练完成 33
% 和 66%
时)降低学习率。 通常,当达到这些设置时间时,您会将学习率降低 10 倍。
第二种方法涉及根据时间步长的指数或二次函数降低学习率。 可以执行此操作的函数的示例如下:
...
...
@@ -637,7 +637,7 @@ combined_loss = tf.n_add(train_loss, reg_losses)
# 退出
我们将要讨论的另一种用于正则化的技术是一种称为 Dropout 的东西。 辍学是由 G.E. Hinton 于 2012 年提出的,它是一种简单的正则化方法,可带来很好的效果。 辍学背后的想法是,在每次训练迭代中,一层中的所有神经元都可以以随机概率(通常为 50
%
)打开和关闭。
我们将要讨论的另一种用于正则化的技术是一种称为 Dropout 的东西。 辍学是由 G.E. Hinton 于 2012 年提出的,它是一种简单的正则化方法,可带来很好的效果。 辍学背后的想法是,在每次训练迭代中,一层中的所有神经元都可以以随机概率(通常为 50
%
)打开和关闭。
这种打开和关闭迫使网络学习与往常相同的概念,但是要通过多个不同的路径。 训练后,所有神经元都保持打开状态,这些路径的行为就像是多个网络的集合,用于平均最终结果,从而提高了泛化能力。 它迫使权重分布在整个网络中,并且像正则化一样将权重保持在较低水平。
...
...
@@ -683,7 +683,7 @@ fc1 = tf.layers.dropout(fc1, rate=dropout, training=is_training)
*
给您的模型某种正则化效果
*
使得可以使用饱和非线性,例如 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
)
直接应用于每个单元,例如:
...
...
docs/handson-cnn-tf/4.md
浏览文件 @
d731805d
...
...
@@ -41,7 +41,7 @@
1.
我们将输入图像输入到 CNN。
2.
CNN 产生一个特征向量,该特征向量被馈送到三个不同的 FC 层。 这些不同的 FC 层(或负责人)中的每一个都将负责预测不同的事物:对象存在,对象位置或对象类。
3.
训练中使用了三种不同的损耗:每个头部一个。
4.
计算当前训练批次的比率,以权衡给定物体的存在对分类和位置损失的影响。 例如,如果批次中只有 10
%
的物体图像,那么这些损失将乘以 0.1。
4.
计算当前训练批次的比率,以权衡给定物体的存在对分类和位置损失的影响。 例如,如果批次中只有 10
%
的物体图像,那么这些损失将乘以 0.1。
提醒一下:输出数字(即 4 个边界框坐标)称为
**回归**
。
...
...
@@ -382,7 +382,7 @@ def tf_iou_vectorized(self, box_vec_1, box_vec_2):
# 过滤输出
实际上,您的模型通常会返回同一对象的多个检测窗口。 为了解决这个问题,我们使用一种称为非最大抑制的算法。 该算法使用“
IoU 和对象的存在”作为启发式过滤这些多个框。 运作方式如下:
实际上,您的模型通常会返回同一对象的多个检测窗口。 为了解决这个问题,我们使用一种称为非最大抑制的算法。 该算法使用“IoU 和对象的存在”作为启发式过滤这些多个框。 运作方式如下:
1.
丢弃所有包含物体的可能性低的框(pc <0.6)
2.
选择最有可能出现物体的盒子(标签上的 pc)
...
...
docs/handson-cnn-tf/5.md
浏览文件 @
d731805d
...
...
@@ -16,15 +16,15 @@
在开始之前,我们将首先学习可以减少模型使用的参数数量的技术。 首先,这很重要,因为它可以提高网络的泛化能力,因为使用该模型中存在的参数数量将需要较少的训练数据。 其次,较少的参数意味着更高的硬件效率,因为将需要更少的内存。
在这里,我们将从解释减少模型参数的重要技术入手,将几个小卷积级联在一起。 在下图中,我们有两个 3x3 卷积层。 如果回头看图右侧的第二层,可以看到第二层中的一个神经元具有 3x3 的
接收场
:
在这里,我们将从解释减少模型参数的重要技术入手,将几个小卷积级联在一起。 在下图中,我们有两个 3x3 卷积层。 如果回头看图右侧的第二层,可以看到第二层中的一个神经元具有 3x3 的
感受域
:
![](
img/5eaf2681-cfa7-4907-b95f-c6204b5c4721.png
)
当我们说“感受野”时,是指它可以从上一层看到的区域。 在此示例中,需要一个 3x3 区域来创建一个输出,因此需要一个 3x3 的
接收场
。
当我们说“感受野”时,是指它可以从上一层看到的区域。 在此示例中,需要一个 3x3 区域来创建一个输出,因此需要一个 3x3 的
感受域
。
回溯到另一层,该 3x3 区域的每个元素在输入端也具有 3x3
接收场
。 因此,如果我们将所有这 9 个元素的接受场组合在一起,那么我们可以看到在输入上创建的总接受场大小为 5x5。
回溯到另一层,该 3x3 区域的每个元素在输入端也具有 3x3
感受域
。 因此,如果我们将所有这 9 个元素的接受场组合在一起,那么我们可以看到在输入上创建的总接受场大小为 5x5。
因此,用简单的话来说,将较小的卷积级联在一起可以获得与使用较大卷积相同的
接收场
。 这意味着我们可以用级联的小卷积代替大卷积。
因此,用简单的话来说,将较小的卷积级联在一起可以获得与使用较大卷积相同的
感受域
。 这意味着我们可以用级联的小卷积代替大卷积。
请注意,由于第一卷积层和输入文件深度之间的深度不匹配(输出的深度需要保持一致),因此无法在作用于输入图像的第一个卷积层上进行此替换:还应在图像上观察我们如何 计算每层参数的数量。
...
...
@@ -76,9 +76,9 @@ VGGNet 由牛津大学的**视觉几何组**(**VGG**)创建,是真正引
与只有 11x11 的 AlexNet 相比,VGGNet 仅使用空间大小为 3x3 的非常小的滤镜。 这些 3x3 卷积滤波器经常散布在 2x2 最大池化层中。
使用如此小的滤波器意味着可见像素的邻域也非常小。 最初,这可能给人的印象是,本地信息是模型所考虑的全部内容。 但是,有趣的是,通过依次堆叠小型滤波器,它提供了与单个大型滤波器相同的“
接收场”。 例如,堆叠三批 3x3 滤镜将具有与一个 7x7 滤镜相同的接收场
。
使用如此小的滤波器意味着可见像素的邻域也非常小。 最初,这可能给人的印象是,本地信息是模型所考虑的全部内容。 但是,有趣的是,通过依次堆叠小型滤波器,它提供了与单个大型滤波器相同的“
感受域”。 例如,堆叠三批 3x3 滤镜将具有与一个 7x7 滤镜相同的感受域
。
堆叠过滤器的这种洞察力带来了能够拥有更深的结构(我们通常会看到更好的结构)的优点,该结构保留了相同的
接收场
大小,同时还减少了参数数量。 本章后面将进一步探讨这个想法。
堆叠过滤器的这种洞察力带来了能够拥有更深的结构(我们通常会看到更好的结构)的优点,该结构保留了相同的
感受域
大小,同时还减少了参数数量。 本章后面将进一步探讨这个想法。
# 建筑
...
...
docs/handson-cnn-tf/6.md
浏览文件 @
d731805d
...
...
@@ -44,7 +44,7 @@
![](
img/460f5473-9a64-4f05-8479-e9f9f36b5eb4.png
)
对于任何自编码器,损失函数都会引导编码器和解码器重建输入。 使用的常见损耗是自编码器的输出与网络输入之间的 L2 损耗。 我们现在应该问自己一个问题:“使用 L2 损失比较图像是一个好主意吗?”。 如果您拍摄以下图像,即使它们看起来截然不同,它们实际上彼此之间的距离
*L2*
也相同:
对于任何自编码器,损失函数都会引导编码器和解码器重建输入。 使用的常见损耗是自编码器的输出与网络输入之间的 L2 损耗。 我们现在应该问自己一个问题:“使用 L2 损失比较图像是一个好主意吗?”。 如果您拍摄以下图像,即使它们看起来截然不同,它们实际上彼此之间的距离
`L2`
也相同:
![](
img/1d80926b-a372-459a-8c13-ab3f74dd6fc5.png
)
...
...
@@ -644,7 +644,7 @@ GAN 当前最大的问题是,它们很难训练。 幸运的是,有一些技
这可能是您在训练 GAN 时遇到的第一个问题。 当生成器找到一组特定的输入来欺骗鉴别器时,就会发生模式崩溃,并且它会继续利用这种故障情况并将潜伏
`Z`
空间中的许多值折叠为相同的值。
解决此问题的一种方法是使用“迷你批处理功能”或“展开
甘斯
”,或者完全停止训练,然后在生成器开始创建非常狭窄的输出分布时重新开始:
解决此问题的一种方法是使用“迷你批处理功能”或“展开
GANs
”,或者完全停止训练,然后在生成器开始创建非常狭窄的输出分布时重新开始:
![](
img/febfacea-0ff5-4ee3-9fec-729292f70e27.jpg
)
...
...
docs/handson-cnn-tf/8.md
浏览文件 @
d731805d
...
...
@@ -40,7 +40,7 @@
为了获得高性能的神经网络,将数据集正确划分为训练集,开发集和测试集非常重要。 它有助于更快地迭代。 另外,它允许更有效地测量算法的偏差和方差,以便我们可以选择有效方式进行改进的方法。
在以前的时代,我们拥有较小的数据集(例如最多 10,000 个示例)和简单的分类器,我们会将数据集拆分为训练和测试集。 通常将训练集分成较小的集,以使用称为交叉验证的技术来训练分类器。 优良作法是按 60/20/20 的比例拆分数据集(即 60
%的训练数据,20%的开发数据,20%的测试数据)。 但是,大数据的现代时代已经改变了这一经验法则。 如果我们有 1,000,000 个示例,则拆分比例已更改为 98/1/1(即 98%的训练数据,1%的 dev 数据,1%
的测试数据)。
在以前的时代,我们拥有较小的数据集(例如最多 10,000 个示例)和简单的分类器,我们会将数据集拆分为训练和测试集。 通常将训练集分成较小的集,以使用称为交叉验证的技术来训练分类器。 优良作法是按 60/20/20 的比例拆分数据集(即 60
% 的训练数据,20% 的开发数据,20% 的测试数据)。 但是,大数据的现代时代已经改变了这一经验法则。 如果我们有 1,000,000 个示例,则拆分比例已更改为 98/1/1(即 98% 的训练数据,1% 的 dev 数据,1%
的测试数据)。
随着我们拥有更多的数据,开发和测试集的比例将变小。
...
...
@@ -64,7 +64,7 @@
![](
img/00d0d711-3009-4542-bb6e-3988f1007b50.png
)
最好的方法是根据上图将其拆分。 分配 1 被拆分为训练集,其一部分用作开发集。 在这里,我们称其为“
Train-Dev
集”(因为开发集与火车集具有相同的分布)。 分布 1 主要用于训练,因为它是一个大型数据集。 发行版 2 分为测试集和开发集,它们与发行版 1 中的任一集无关。这里要强调的一点是,测试和开发集应来自同一发行版,并且属于我们实际上关心的应用程序,即 目标应用程序。 开发集和测试集通常是小的数据集,因为它们的目的是给出模型/算法的无偏性能估计。
最好的方法是根据上图将其拆分。 分配 1 被拆分为训练集,其一部分用作开发集。 在这里,我们称其为“
训练开发
集”(因为开发集与火车集具有相同的分布)。 分布 1 主要用于训练,因为它是一个大型数据集。 发行版 2 分为测试集和开发集,它们与发行版 1 中的任一集无关。这里要强调的一点是,测试和开发集应来自同一发行版,并且属于我们实际上关心的应用程序,即 目标应用程序。 开发集和测试集通常是小的数据集,因为它们的目的是给出模型/算法的无偏性能估计。
模型在不同数据集分区上的误差差异,以及查看人为误差可为我们提供诊断偏见和方差问题的见解
...
...
@@ -72,7 +72,7 @@
![](
img/43b92390-d3d8-4104-a0e8-0b0e03958557.png
)
下表可以更好地说明这一点。 在这些示例中,我们假设在所有情况下的最佳/人为错误均最小,即 1
%
。 通常,深度学习模型的准确性与人类相似,因此将其作为比较可帮助您找到良好的架构。
下表可以更好地说明这一点。 在这些示例中,我们假设在所有情况下的最佳/人为错误均最小,即 1
%
。 通常,深度学习模型的准确性与人类相似,因此将其作为比较可帮助您找到良好的架构。
*
高偏差/拟合不足
...
...
@@ -164,11 +164,11 @@ Tensorflow 已经具有其损失功能,并内置了加权选项:
*
`tf.losses.sparse_softmax_cross_entropy(labels=label, logits=logits, weights=weights)`
*
`Tf.nn.weighted_cross_entropy_with_logits`
例如,如果您尝试对 A,B,C 三个类别进行分类,其中 A 为 10
%,B 为 45%,C 为 45%
,则可以将
`tf.losses.sparse_softmax_cross_entropy`
用于以下权重:[1.0、0.3, 0.3]。
例如,如果您尝试对 A,B,C 三个类别进行分类,其中 A 为 10
%,B 为 45%,C 为 45%
,则可以将
`tf.losses.sparse_softmax_cross_entropy`
用于以下权重:[1.0、0.3, 0.3]。
# 评估指标
在为模型选择评估指标时,我们还需要小心。 假设对于狗/非狗分类问题,我们有两种算法的准确度分别为 98
%和 96%
。 乍一看,这些算法看起来都具有相似的性能。 让我们记住,分类准确度定义为做出的正确预测数除以做出的预测总数。 换句话说,True Positive(TP)和 True Negative(TN)预测数除以预测总数。 但是,可能出现的情况是,随着狗图像的出现,我们还会得到大量被错误分类为狗的背景或类似外观的物体,通常称为误报(FP)。 另一个不良行为可能是许多狗图像被错误分类为负片或假阴性(FN)。 显然,根据定义,分类准确性不能捕获误报或误报的概念。 因此,需要更好的评估指标。
在为模型选择评估指标时,我们还需要小心。 假设对于狗/非狗分类问题,我们有两种算法的准确度分别为 98
% 和 96%
。 乍一看,这些算法看起来都具有相似的性能。 让我们记住,分类准确度定义为做出的正确预测数除以做出的预测总数。 换句话说,True Positive(TP)和 True Negative(TN)预测数除以预测总数。 但是,可能出现的情况是,随着狗图像的出现,我们还会得到大量被错误分类为狗的背景或类似外观的物体,通常称为误报(FP)。 另一个不良行为可能是许多狗图像被错误分类为负片或假阴性(FN)。 显然,根据定义,分类准确性不能捕获误报或误报的概念。 因此,需要更好的评估指标。
第一步,我们将构建一个混淆矩阵,该矩阵总结最后显示的段落:
...
...
@@ -203,9 +203,9 @@ Tensorflow 已经具有其损失功能,并内置了加权选项:
精度:(TP + TN)/(TP + TN + FP + FN)= 201/286 = 0.70 TPR:TP /(TP + FN)= 0/85 = 0 FPR:FP /(FP + TN)= 0 / 201 = 0 PPV:TP /(TP + FP)= 0/0 = 0 NPV:TN /(TN + FN)= 201/286 = 0.70
在第一个示例中,我们可以得到 69
%的正确精度,但是在第二个示例中,通过仅对每个示例进行预测,我们实际上将我们的精度提高到 70%
! 显然,仅预测所有事物为负类的模型并不是一个很好的模型,这就是我们所说的准确性悖论。 简单来说,“准确性悖论”说,即使模型可能具有更高的准确性,但实际上可能并不是更好的模型。
在第一个示例中,我们可以得到 69
% 的正确精度,但是在第二个示例中,通过仅对每个示例进行预测,我们实际上将我们的精度提高到 70%
! 显然,仅预测所有事物为负类的模型并不是一个很好的模型,这就是我们所说的准确性悖论。 简单来说,“准确性悖论”说,即使模型可能具有更高的准确性,但实际上可能并不是更好的模型。
如前面的示例中所示,当类别不平衡变大时,更可能发生这种现象。 鼓励读者对包含 85 个正样本和 85 个负样本的平衡数据集重复上述测试。 如果假阳性与假阴性的比例与前面的示例相同,则这将导致第一个示例的分类准确度为 52
%,第二个示例的分类准确度为 50%
,这表明准确性悖论不适用于平衡数据集。
如前面的示例中所示,当类别不平衡变大时,更可能发生这种现象。 鼓励读者对包含 85 个正样本和 85 个负样本的平衡数据集重复上述测试。 如果假阳性与假阴性的比例与前面的示例相同,则这将导致第一个示例的分类准确度为 52
%,第二个示例的分类准确度为 50%
,这表明准确性悖论不适用于平衡数据集。
为了能够正确评估算法,我们需要查看其他评估指标,例如 TPR 和 FPR。 我们可以看到在第二个示例中它们都为零,这表明算法根本无法检测到所需的正向对象。
...
...
@@ -219,7 +219,7 @@ Tensorflow 已经具有其损失功能,并内置了加权选项:
精度:(TP + TN)/(TP + TN + FP + FN)= 0.99 TPR:TP /(TP + FN)= 0.99 FPR:FP /(FP + TN)= 0.01 PPV:TP /(TP + FP) = 0.09 净现值:TN /(TN + FN)= 0.99
此处的测试似乎表现不错,因为准确性为 99
%。 但是,如果您被诊断出患有癌症,这并不意味着您患该病的可能性为 99%。 应该注意的是,在 1098 个测试阳性的患者中,只有 99 个患有该疾病。 这意味着,如果您获得了阳性测试,那么对于准确度高达 99%的测试,您实际患病的可能性仅为 9%
。
此处的测试似乎表现不错,因为准确性为 99
%。 但是,如果您被诊断出患有癌症,这并不意味着您患该病的可能性为 99%。 应该注意的是,在 1098 个测试阳性的患者中,只有 99 个患有该疾病。 这意味着,如果您获得了阳性测试,那么对于准确度高达 99% 的测试,您实际患病的可能性仅为 9%
。
这些示例很好地警告了我们的目标是在测试数据中进行均衡分配,尤其是当您使用准确性指标比较不同模型的有效性时。
...
...
@@ -315,7 +315,7 @@ class CAE_CNN_Encoder(object):
以下几点基于我们在训练神经网络方面的经验以及该领域研究人员认为的当前最佳实践。 希望如果您需要从头开始设计自己的 CNN 架构,他们将为您提供帮助。 但是,在尝试设计自己的 CNN 之前,您应该查看其他现成的体系结构以从中学习,并检查它们是否已经为您完成了工作。
1.
使用内核大小为 3x3 的卷积层。 就参数和计算而言,较大的内核更昂贵。 最重要的是,如我们在前面的章节中所看到的,您可以堆叠卷积层以产生更大的
接收场
,并受益于更多的非线性激活。
1.
使用内核大小为 3x3 的卷积层。 就参数和计算而言,较大的内核更昂贵。 最重要的是,如我们在前面的章节中所看到的,您可以堆叠卷积层以产生更大的
感受域
,并受益于更多的非线性激活。
2.
第一层卷积通常应至少具有 32 个过滤器。 这样,更深的层不受第一层提取的特征数量的限制。
3.
尽可能避免使用池化层。 相反,请使用步长为 2 的卷积层。这将像池化那样对输入进行下采样,但它不会像池化那样丢弃宝贵的信息。 同样,使用跨步卷积就像将 conv 和合并在一层中一样。
4.
减小要素地图的空间大小时,应增加使用的过滤器数量,以免丢失过多信息。 在深度网络中,请避免在第一层中过快减小空间大小。
...
...
@@ -323,7 +323,7 @@ class CAE_CNN_Encoder(object):
6.
使用 batchnorm。 确实有助于训练您的网络!
7.
随着您对网络的深入了解,逐渐减小要素地图的空间大小。
8.
最小化 FC 层的数量(在最后一层之前使用 dropout)。 仅在最终需要连接某些标量特征时才使用 FC。 (您甚至可以通过在输入通道上进行编码来避免这种情况)
9.
如果您需要较大的
接收场
(物体大小接近总图像大小的检测或分类),请尝试对每层使用具有指数膨胀因子的膨胀卷积。 这样,您将在保持少量参数的同时非常迅速地扩大接收范围。
9.
如果您需要较大的
感受域
(物体大小接近总图像大小的检测或分类),请尝试对每层使用具有指数膨胀因子的膨胀卷积。 这样,您将在保持少量参数的同时非常迅速地扩大接收范围。
10.
如果网络变深并且训练损失没有减少,请考虑使用剩余连接。
11.
在使网络精度在期望值之内并且如果计算成本成为问题之后,您可能会根据使用情况,研究深度卷积,瓶颈模块之类的技术,或现场出现的任何技术。
...
...
docs/handson-cnn-tf/9.md
浏览文件 @
d731805d
...
...
@@ -78,7 +78,7 @@ for index in range(len(labels)):
# 分片
尽管我们说最好将所有数据保存在一个文件中,但实际上并非 100
%
正确。 由于 TFRecords 是按顺序读取的,因此,如果仅使用一个文件,我们将无法重新整理数据集。 经过一段时间的训练之后,每次到达 TFRecord 的末尾时,您都将返回到数据集的开头,但是不幸的是,每次浏览文件时,数据的顺序都相同。
尽管我们说最好将所有数据保存在一个文件中,但实际上并非 100
%
正确。 由于 TFRecords 是按顺序读取的,因此,如果仅使用一个文件,我们将无法重新整理数据集。 经过一段时间的训练之后,每次到达 TFRecord 的末尾时,您都将返回到数据集的开头,但是不幸的是,每次浏览文件时,数据的顺序都相同。
为了允许我们随机播放数据,我们可以做的一件事是通过创建多个 TFRecord 文件并将数据散布到这些多个文件中来
*分片*
我们的数据。 这样,我们可以在每个纪元处重新整理加载 TFRecord 文件的顺序,因此我们在训练时将为我们有效地整理数据。 每 100 万张图像需要 1000 个碎片,这是可以遵循的良好基准。
...
...
@@ -150,7 +150,7 @@ train_dataset = train_dataset.batch(128) # Take a batch of 128 from the dataset
# 预取
我们能够建立有效数据管道的另一种方法是始终准备好一批数据准备发送到 GPU。 理想情况下,在训练模型时,我们希望 GPU 的使用率始终保持在 100
%
。 这样,我们可以最大程度地利用昂贵的硬件,该硬件可以在训练时有效地计算前进和后退的传球次数。
我们能够建立有效数据管道的另一种方法是始终准备好一批数据准备发送到 GPU。 理想情况下,在训练模型时,我们希望 GPU 的使用率始终保持在 100
%
。 这样,我们可以最大程度地利用昂贵的硬件,该硬件可以在训练时有效地计算前进和后退的传球次数。
为此,我们需要 CPU 加载并准备一批图像,以准备在向前和向后传递模型的过程中传递给 GPU。 幸运的是,在收集批处理之后,我们可以使用简单的预取转换轻松完成此操作,如下所示:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录