提交 107963b0 编写于 作者: W wizardforcel

2020-09-15 14:17:44

上级 01d7172b
......@@ -9,7 +9,7 @@
* 机器学习工程师
* 数据科学家
* 对学习深度学习和计算机视觉领域感兴趣的开发人员
*生学习机器学习
*习机器学习的学生
# 本书涵盖的内容
......
......@@ -68,7 +68,7 @@ ML 工程师可能会遵循的典型流程来开发预测模型,如下所示
1. 收集数据
2. 从数据中提取相关特征
3. 选择 ML 体系结构(CNN,ANN,SVM,决策树等)
3. 选择 ML 构(CNN,ANN,SVM,决策树等)
4. 训练模型
5. 评估模型并重复步骤 3 至 5,直到找到满意的解决方案
6. 在现场测试模型
......@@ -222,7 +222,7 @@ loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)
* 带动量的梯度下降
* RMSProp
* 亚当
* Adam
TensorFlow 的所有不同优化器都可以在`tf.train`类中找到。 例如,可以通过调用`tf.train.AdamOptimizer()`使用 Adam 优化器。
......@@ -387,7 +387,7 @@ CNN 主要由称为**卷积层**的层组成,这些层对其层输入进行过
在 CNN 中,卷积层使用称为**内核**的小窗口,以类似于瓦片的方式过滤输入张量。 内核精确定义了卷积运算将要过滤的内容,并且在找到所需内容时会产生强烈的响应。
下图显示了将图像与称为 Sobel 滤波器的特定内核进行卷积的结果,该内核非常适合在图像中查找边缘:
下图显示了将图像与称为 Sobel 过滤器的特定内核进行卷积的结果,该内核非常适合在图像中查找边缘:
![](img/263bc17f-fc97-42c2-a99a-8bc089aa9453.png)
......@@ -401,9 +401,9 @@ CNN 主要由称为**卷积层**的层组成,这些层对其层输入进行过
![](img/d2abbff0-7660-4e55-82dc-dac6c50a0c38.png)
现在,也许我们希望卷积层在其输入中查找六种不同的事物,而不仅仅是寻找一种。 在这种情况下,我们将只给卷积层六个相同大小的过滤器(在这种情况下为`5x5x3`),而不是一个。 然后,每个转换滤波器都会在输入中查找特定的模式。
现在,也许我们希望卷积层在其输入中查找六种不同的事物,而不仅仅是寻找一种。 在这种情况下,我们将只给卷积层六个相同大小的过滤器(在这种情况下为`5x5x3`),而不是一个。 然后,每个转换过滤器都会在输入中查找特定的模式。
下图显示了此特定的六个滤波器卷积层的输入和输出:
下图显示了此特定的六个过滤器卷积层的输入和输出:
![](img/8dc41ddc-7a2e-404d-80f6-7833073a6e0f.png)
......@@ -489,12 +489,12 @@ out_height = ceil(float(in_height) / float(strides[1]))
这些是影响 MAC(乘加累加器)/操作数量的因素:
* 卷积核大小(F
* 过滤器数量(M
* 输入要素图的高度和宽度(H,W
* 输入批量(B
* 输入深度大小(通道)(C
* 卷积层步幅(S
* 卷积核大小(`F`
* 过滤器数量(`M`
* 输入要素图的高度和宽度(`H``W`
* 输入批量(`B`
* 输入深度大小(通道)(`C`
* 卷积层步幅(`S`
MAC 的数量可以计算为:
......@@ -542,9 +542,9 @@ MAC 的数量可以计算为:
**池化层**用于减少 CNN 中我们的激活张量的空间尺寸,而不是体积深度。 它们是执行此操作的非参数方式,这意味着池化层中没有权重。 基本上,以下是从使用池中获得的收益:
* 在输入张量中汇总空间相关信息的便宜方法
* 在输入张量中汇总空间相关信息的简单方法
* 通过减少空间信息,您可以获得计算性能
* 您的网络中存在一些翻译不变性
* 您的网络中存在一些平移不变性
但是,池化的最大优点之一是它无需学习任何参数,这也是它的最大缺点,因为池化最终可能会丢掉重要的信息。 结果,现在开始在 CNN 中使用池的频率降低了。
......
......@@ -36,8 +36,8 @@
* Imagenet 和 CIFAR 数据集
* 训练 CNN 对 CIFAR 数据集进行分类
* 数据 API 简介
* 如何初始化
* 如何规范化模型获得更好的结果
* 如何初始化
* 如何规范化模型获得更好的结果
# CNN 模型架构
......@@ -114,7 +114,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`像素。
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 挑战赛之前提供测试数据的注释。
......@@ -140,7 +140,7 @@ 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% 的误差,出现了较小的改进。
......@@ -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
......@@ -580,7 +580,7 @@ bias_initializer=tf.zeros_initializer())
到目前为止,在本章中,我们已经看到了如何使用 TensorFlow 训练卷积神经网络来完成图像分类任务。 训练完模型后,我们将其遍历测试集,并从一开始就将其存储起来,以查看其在从未见过的数据上的性能如何。 在测试集上评估模型的过程向我们表明了在部署模型时模型将泛化的程度。 能够很好地泛化的模型显然是理想的属性,因为它可以在许多情况下使用。
我们使用的 CNN 架构是可以提高模型泛化能力的方法之一。 要记住的一种简单技术是从设计模型开始就尽可能简单地使用很少的层或滤镜。 由于非常小的模型很可能无法适应您的数据,因此您可以慢慢增加复杂性,直到不再发生适应不足的情况为止。 如果您以这种方式设计模型,则将限制过拟合的可能性,因为您不允许自己拥有的模型对于数据集而言过大。
我们使用的 CNN 架构是可以提高模型泛化能力的方法之一。 要记住的一种简单技术是从设计模型开始就尽可能简单地使用很少的层或过滤器。 由于非常小的模型很可能无法适应您的数据,因此您可以慢慢增加复杂性,直到不再发生适应不足的情况为止。 如果您以这种方式设计模型,则将限制过拟合的可能性,因为您不允许自己拥有的模型对于数据集而言过大。
但是,在本节中,我们将探索我们可以做的其他一些事情,以建立更好的机器学习模型,以及如何将它们纳入我们的训练过程中。 以下方法旨在防止过拟合,并通过这样做,有助于创建更强大的模型,并能更好地进行泛化。 防止模型过拟合的过程称为**正则化**
......
......@@ -13,9 +13,9 @@
在本章中,我们将学习以下有趣的主题:
* 图像分类与定位
* 物体检测
* 对象检测
* 语义分割
* 实例细分
* 实例分割
* 如何构建卷积神经网络来执行所有这些任务
# 图像分类与定位
......@@ -41,7 +41,7 @@
1. 我们将输入图像输入到 CNN。
2. CNN 产生一个特征向量,该特征向量被馈送到三个不同的 FC 层。 这些不同的 FC 层(或负责人)中的每一个都将负责预测不同的事物:对象存在,对象位置或对象类。
3. 训练中使用了三种不同的损失:每个头部一个。
4. 计算当前训练批次的比率,以权衡给定物体的存在对分类和位置损失的影响。 例如,如果批次中只有 10% 的物体图像,那么这些损失将乘以 0.1。
4. 计算当前训练批次的比率,以权衡给定对象的存在对分类和位置损失的影响。 例如,如果批次中只有 10% 的对象图像,那么这些损失将乘以 0.1。
提醒一下:输出数字(即 4 个边界框坐标)称为**回归**
......@@ -136,9 +136,9 @@ def build_graph(self):
长期使用的一种非常常见的方法是使用滑动窗口进行对象检测。 想法是在输入图像上滑动固定大小的窗口。 然后,将窗口中每个位置的内容发送到分类器,该分类器将告诉我们该窗口是否包含感兴趣的对象。
为此,人们可以首先训练一个 CNN 分类器,其中包含我们想要检测的物体的小幅裁剪图像-调整大小与窗口大小相同。 汽车。 在测试时,固定大小的窗口会在要检测对象的整个图像中以滑动的方式移动。然后,我们的 CNN 会为每个窗口预测是否是一个对象(在这种情况下是汽车)。
为此,人们可以首先训练一个 CNN 分类器,其中包含我们想要检测的对象的小幅裁剪图像-调整大小与窗口大小相同。 汽车。 在测试时,固定大小的窗口会在要检测对象的整个图像中以滑动的方式移动。然后,我们的 CNN 会为每个窗口预测是否是一个对象(在这种情况下是汽车)。
仅使用一种尺寸的滑动窗口,我们只能检测一种尺寸的对象。 因此,要查找更大或更小的对象,我们还可以在测试时使用更大或更小的窗口,并在将其发送到分类器之前调整内容的大小。 或者,您可以调整整个输入图像的大小,并仅使用一个尺寸的滑动窗口,该窗口也将在这些调整大小的图像上运行。 两种方法都可以使用,但其想法是产生所谓的“比例尺金字塔”,以便我们可以检测图像中不同尺寸的物体
仅使用一种尺寸的滑动窗口,我们只能检测一种尺寸的对象。 因此,要查找更大或更小的对象,我们还可以在测试时使用更大或更小的窗口,并在将其发送到分类器之前调整内容的大小。 或者,您可以调整整个输入图像的大小,并仅使用一个尺寸的滑动窗口,该窗口也将在这些调整大小的图像上运行。 两种方法都可以使用,但其想法是产生所谓的“比例尺金字塔”,以便我们可以检测图像中不同尺寸的对象
这种方法的最大缺点是,各种比例的大量窗口可能会通过 CNN 进行预测。 这使得将 CNN 用作分类器在计算上非常昂贵。 同样对于大多数这些窗口,它们将始终不包含任何对象。
......@@ -284,7 +284,7 @@ YOLO 网络的主要思想是在不使用任何滑动窗口的情况下优化输
# 评估检测(交并比)
在继续进行之前,我们需要知道如何衡量我们的模型是否正确检测到物体。 为此,我们计算会返回一个数字的交并比(IoU),根据某个参考(真实情况)告诉我们检测的效果如何。 IoU 的计算方法是:将检测和地面真理框彼此重叠的区域除以检测和地面真理框所覆盖的总面积:
在继续进行之前,我们需要知道如何衡量我们的模型是否正确检测到对象。 为此,我们计算会返回一个数字的交并比(IoU),根据某个参考(真实情况)告诉我们检测的效果如何。 IoU 的计算方法是:将检测和地面真理框彼此重叠的区域除以检测和地面真理框所覆盖的总面积:
![](img/8a083f5a-2925-4206-abc5-7cdfc4a3ba0b.png)
......@@ -384,8 +384,8 @@ def tf_iou_vectorized(self, box_vec_1, box_vec_2):
实际上,您的模型通常会返回同一对象的多个检测窗口。 为了解决这个问题,我们使用一种称为非最大抑制的算法。 该算法使用“IoU 和对象的存在”作为启发式过滤这些多个框。 运作方式如下:
1. 丢弃所有包含物体的可能性低的框(`pc < 0.6`
2. 选择最有可能出现物体的盒子(标签上的`pc`
1. 丢弃所有包含对象的可能性低的框(`pc < 0.6`
2. 选择最有可能出现对象的盒子(标签上的`pc`
3. 丢弃与所选框高度重叠的所有框(`IoU > 0.5`
4. 重复步骤 2 和 3,直到所有检测都被放弃或选择为止
......@@ -397,7 +397,7 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
# 锚框
锚框预定义的模板框,具有一定的高宽比。 这些在 YOLO 中用于帮助检测单个网格单元中的多个对象。 我们根据可以检测到的物体类型的大致几何形状定义盒子的形状。
锚框预定义的模板框,具有一定的高宽比。 这些在 YOLO 中用于帮助检测单个网格单元中的多个对象。 我们根据可以检测到的对象类型的大致几何形状定义盒子的形状。
目前,正如所解释的,我们的模型将只能在每个网格单元中检测到一个对象,但是在大多数情况下,每个网格中可能有多个对象。 请记住,我们认为最靠近对象的像元是中心:
......@@ -423,7 +423,7 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
成员`1[ij]^obj`成员用于基于特定单元`i, j`上对象的存在来调制损失:
* 如果在网格单元格`i`和第`i`个边界框中具有最高 IoU 的对象存在:1
* 如果在网格单元格`i`和第`j`个边界框中具有最高 IoU 的对象存在:1
* 否则:0
同样,`1[ij]^noobj`正好相反。
......@@ -448,7 +448,7 @@ Tensorflow 已经具有实现非最大值抑制算法的功能,称为`tf.image
![](img/a96483b7-4839-448c-b67c-09b8c05d871c.png)
`C`是置信度分数(受物体的存在调制的项)。`C_hat`是带有真实情况的预测边界框的 IOU。 参数`λ[noobj] = 0.5`用于使无对象时的丢失关注度降低。
`C`是置信度分数(受对象的存在调制的项)。`C_hat`是带有真实情况的预测边界框的 IOU。 参数`λ[noobj] = 0.5`用于使无对象时的丢失关注度降低。
# 损失第 3 部分
......@@ -539,16 +539,16 @@ def loss_layer(self, predicts, labels, scope='loss_layer'):
为了增加空间大小,使用了一些常用的操作,其中包括:
* 最大分
* 卷积/转置卷积
* 扩张/房曲卷积
* 最大分
* 卷积/转置卷积
* 扩张/带孔卷积
我们还将学习语义分割任务中使用的 softmax 的新变体,称为**空间 softmax**
在本节中,我们将学习两个流行的模型,它们在语义分割上表现良好,并且具有非常简单的架构可供理解。 它们如下所示:
* FCN(全卷积网络)
* 保佑
* Segnet
需要解决的其他一些实现细节是:
......@@ -558,7 +558,7 @@ def loss_layer(self, predicts, labels, scope='loss_layer'):
# 最大分割
取消池操作用于恢复最大池操作的效果。 这个想法只是充当上采样器。 此操作已在一些较早的论文上使用,并且不再使用,因为您还需要卷积层来修补(低通滤波器)上采样的结果:
取消池操作用于恢复最大池操作的效果。 这个想法只是充当上采样器。 此操作已在一些较早的论文上使用,并且不再使用,因为您还需要卷积层来修补(低通过滤器)上采样的结果:
![](img/f32f83c1-2c6a-462c-b053-811239923262.png)
......@@ -568,7 +568,7 @@ def loss_layer(self, predicts, labels, scope='loss_layer'):
此层类型为您提供了一种对输入体积进行升采样的学习方法,并且可以在每次需要将输入要素地图智能地投影到更高的空间时使用。 一些用例包括以下内容:
* 上采样(条纹转置卷积)== UNPOOL + CONV
* 上采样(条纹转置卷积)`== UNPOOL + CONV`
* 可视化显着图
* 作为自编码器的一部分
......@@ -632,7 +632,7 @@ with tf.name_scope("SPATIAL_SOFTMAX"):
# Mask R-CNN
Mask R-CNN 是一种最近的网络体系结构,通过提供简单,灵活的模型体系结构可以使此问题更易于解决。 该架构于 2017 年发布,旨在扩展更快的 R-CNN 的功能:
Mask R-CNN 是一种最近的网络架构,通过提供简单,灵活的模型架构可以使此问题更易于解决。 该架构于 2017 年发布,旨在扩展更快的 R-CNN 的功能:
![](img/c3b0ddb7-49dc-4277-beee-9fa64ceb8bbb.png)
......@@ -642,4 +642,4 @@ Mask R-CNN 是一种最近的网络体系结构,通过提供简单,灵活的
在本章中,我们学习了对象定位,检测和分段的基础知识。 我们还讨论了与这些主题相关的最著名的算法。
在下一章中,我们将讨论一些常见的网络体系结构。
\ No newline at end of file
在下一章中,我们将讨论一些常见的网络架构。
\ No newline at end of file
# 五、VGG,Inception,ResNet 和 MobileNets
到目前为止,我们已经讨论了所有必要的构建块,以便能够实现常见问题(例如图像分类和检测)的解决方案。 在本章中,我们将讨论一些通用模型体系结构的实现,这些体系结构在许多常见任务中都表现出了很高的性能。 自从最初创建以来,这些体系结构一直很流行,并且在今天继续被广泛使用。
到目前为止,我们已经讨论了所有必要的构建块,以便能够实现常见问题(例如图像分类和检测)的解决方案。 在本章中,我们将讨论一些通用模型架构的实现,这些架构在许多常见任务中都表现出了很高的性能。 自从最初创建以来,这些架构一直很流行,并且在今天继续被广泛使用。
在本章的最后,您将对现有的不同类型的 CNN 模型及其在各种不同的计算机视觉问题中的用例进行了解。 在实现这些模型时,您将学习如何设计这些模型以及它们各自的优点。 最后,我们将讨论如何修改这些架构,以使训练和性能/效率更好。
......@@ -10,7 +10,7 @@
* 如何在 TensorFlow 中实现 VGG 网络
* 如何在 TensorFlow 中实现 Inception 网络
* 如何在 TensorFlow 中实现残差网络
* 如何实现对移动设备更友好的体系结
* 如何实现对移动设备更友好的
# 替代大卷积
......@@ -32,7 +32,7 @@
在上图中,我们用三个`3x3`卷积替换了一个`7x7`卷积。 让我们自己计算一下,以减少使用的参数。
想象一下,在形状为`WxHxC`的输入体积上使用`C`滤波器进行`7x7`大小的卷积。 我们可以计算过滤器中的权数,如下所示:
想象一下,在形状为`WxHxC`的输入体积上使用`C`过滤器进行`7x7`大小的卷积。 我们可以计算过滤器中的权数,如下所示:
![](img/65e0fde3-6ba1-4588-93b6-a945414cdfef.png)
......@@ -44,17 +44,17 @@
还要注意,在这三个卷积层的每一个之间,我们放置了 ReLu 激活。 与仅使用单个大卷积层相比,这样做会给模型带来更多的非线性。 增加的深度(和非线性)是一件好事,因为这意味着网络可以将更多的概念组合在一起,并提高其学习能力!
大多数新的成功模型的趋势是用许多级联在一起的较小卷积(通常为`3x3`大小)替换所有大型滤波器。 如前所述,这样做有两个巨大的好处。 它不仅减少了参数的数量,而且还增加了网络中非线性的深度和数量,这对于增加其学习能力是一件好事。
大多数新的成功模型的趋势是用许多级联在一起的较小卷积(通常为`3x3`大小)替换所有大型过滤器。 如前所述,这样做有两个巨大的好处。 它不仅减少了参数的数量,而且还增加了网络中非线性的深度和数量,这对于增加其学习能力是一件好事。
# 替代`3x3`卷积
也可以通过称为瓶颈的机制来简化`3x3`卷积。 与早期相似,这将具有正常`3x3`卷积的相同表示,但参数更少,非线性更多。
瓶颈通过使用以下`C`滤镜替换`3x3`卷积层而起作用:
瓶颈通过使用以下`C`过滤器替换`3x3`卷积层而起作用:
* 带有`C / 2`滤波器的`1x1`卷积
* 带有`C / 2`滤波器的`3x3`卷积
* 带有`C`滤镜`1x1`卷积
* 带有`C / 2`过滤器的`1x1`卷积
* 带有`C / 2`过滤器的`3x3`卷积
* 带有`C`过滤器`1x1`卷积
这里给出一个实际的例子:
......@@ -68,21 +68,21 @@
![](img/2b7ce629-e563-477b-9552-cf8a85339dfb.png)
一些网络体系结构,例如残差网络(我们将在后面看到),使用瓶颈技术再次减少了参数数量并增加了非线性。
一些网络构,例如残差网络(我们将在后面看到),使用瓶颈技术再次减少了参数数量并增加了非线性。
# VGGNet
VGGNet 由牛津大学的**视觉几何组****VGG**)创建,是真正引入堆叠更多层的想法的首批架构之一。 虽然 AlexNet 最初以其七层出现时被认为很深,但与 VGG 和其他现代体系结构相比,这现在已经很小了。
VGGNet 由牛津大学的**视觉几何组****VGG**)创建,是真正引入堆叠更多层的想法的首批架构之一。 虽然 AlexNet 最初以其七层出现时被认为很深,但与 VGG 和其他现代构相比,这现在已经很小了。
与只有`11x11`的 AlexNet 相比,VGGNet 仅使用空间大小为`3x3`的非常小的滤镜。 这些`3x3`卷积滤波器经常散布在`2x2`最大池化层中。
与只有`11x11`的 AlexNet 相比,VGGNet 仅使用空间大小为`3x3`的非常小的过滤器。 这些`3x3`卷积过滤器经常散布在`2x2`最大池化层中。
使用如此小的滤波器意味着可见像素的邻域也非常小。 最初,这可能给人的印象是,本地信息是模型所考虑的全部内容。 但是,有趣的是,通过依次堆叠小型滤波器,它提供了与单个大型滤波器相同的“感受域”。 例如,堆叠三批`3x3`滤镜将具有与一个`7x7`滤镜相同的感受域。
使用如此小的过滤器意味着可见像素的邻域也非常小。 最初,这可能给人的印象是,本地信息是模型所考虑的全部内容。 但是,有趣的是,通过依次堆叠小型过滤器,它提供了与单个大型过滤器相同的“感受域”。 例如,堆叠三批`3x3`过滤器将具有与一个`7x7`过滤器相同的感受域。
堆叠过滤器的这种洞察力带来了能够拥有更深的结构(我们通常会看到更好的结构)的优点,该结构保留了相同的感受域大小,同时还减少了参数数量。 本章后面将进一步探讨这个想法。
# 架构
接下来,我们将看到 VGGNet 的体系结构,特别是包含 16 层的 VGG-16 风格。 所有卷积层都有空间大小为`3x3`的滤镜,并且随着我们深入网络,卷积层中滤镜的数量从 64 个增加到 512 个。
接下来,我们将看到 VGGNet 的架构,特别是包含 16 层的 VGG-16 风格。 所有卷积层都有空间大小为`3x3`的过滤器,并且随着我们深入网络,卷积层中过滤器的数量从 64 个增加到 512 个。
堆叠两个或三个卷积层然后合并的简单模块化设计使网络的大小易于增加或减小。 结果,VGG 成功创建并测试了具有 11、13 和 19 层的版本:
......@@ -202,9 +202,9 @@ VGG 最酷的功能之一是,由于其在 conv 层中的内核较小,因此
# VGG 的更多信息
2014 年,VGG 在 Imagenet 分类挑战中获得第二名,在 Imagenet 定位挑战中获得第一名。 正如我们所看到的,VGGNet 的设计选择是堆叠许多小的卷积层,从而可以实现更深的结构,同时具有更少的参数(如果我们删除了不必要的全连接层),则性能更好。 这种设计选择在创建强大而高效的网络方面非常有效,以至于几乎所有现代体系结构都复制了这种想法,并且很少(如果有的话)使用大型过滤器。
2014 年,VGG 在 Imagenet 分类挑战中获得第二名,在 Imagenet 定位挑战中获得第一名。 正如我们所看到的,VGGNet 的设计选择是堆叠许多小的卷积层,从而可以实现更深的结构,同时具有更少的参数(如果我们删除了不必要的全连接层),则性能更好。 这种设计选择在创建强大而高效的网络方面非常有效,以至于几乎所有现代构都复制了这种想法,并且很少(如果有的话)使用大型过滤器。
事实证明,VGG 模型可以在许多任务中很好地工作,并且由于其简单的体系结构,它是开始尝试或适应问题需求的理想模型。 但是,它确实有以下问题需要注意:
事实证明,VGG 模型可以在许多任务中很好地工作,并且由于其简单的构,它是开始尝试或适应问题需求的理想模型。 但是,它确实有以下问题需要注意:
* 通过仅使用`3x3`层,尤其是在第一层,计算量不适用于移动解决方案
* 如前几章所述,由于逐渐消失的梯度问题,甚至更深的 VGG 结构也无法正常工作
......@@ -392,7 +392,7 @@ for group_i, group in enumerate(groups):
这个新的卷积块(`tf.layers.separable_conv2d`)由两个主要部分组成:深度卷积层,然后是`1x1`点式卷积层。 该块与普通卷积有以下几种不同:
* 在正常卷积层中,每个滤波`F`将同时应用于输入通道上的所有通道(`F`应用于每个通道然后求和)
* 在正常卷积层中,每个过滤`F`将同时应用于输入通道上的所有通道(`F`应用于每个通道然后求和)
* 这个新的卷积`F`分别应用于每个通道,并且结果被级联到某个中间张量(多少由深度倍数`DM`参数控制)
相对于标准卷积,深度卷积非常有效。 但是,它仅过滤输入通道,并且不将它们组合以创建新功能。
......@@ -403,7 +403,7 @@ for group_i, group in enumerate(groups):
MobileNets 使用两个超参数来帮助控制精度和速度之间的折衷,从而使网络适合您要定位的任何设备。 这两个超参数如下:
* **宽度倍增器**:通过统一减少整个网络中使用的滤波器数量,控制深度卷积精度
* **宽度倍增器**:通过统一减少整个网络中使用的过滤器数量,控制深度卷积精度
* **分辨率倍增器**:只需将输入图像缩小到不同大小
# MobileNets 的更多信息
......
......@@ -11,7 +11,7 @@
* 自编码器
* 变分自编码器
* 生成对抗网络
* 实现各种生成模型生成手写数字
* 实现各种生成模型生成手写数字
# 为什么是生成模型
......@@ -574,8 +574,8 @@ Wasserstein GAN 是 GAN 的另一种变体,它解决了训练 GAN 时可能发
此外,请按照下列步骤操作:
* 火车判别器比生成器更多
* 减少判别器的重量
* 训练判别器比生成器更多
* 减少判别器的权重
* 使用 RMSProp 代替 Adam
* 使用低学习率(0.0005)
......@@ -599,7 +599,7 @@ BEGAN 的一些优点如下:
* 高分辨率(`128x128`)人脸生成(2017 最新技术)。
* 提供一种衡量收敛的方法。
* 即使没有批量规范和辍学也有良好的结果。
* 即使没有批量规范和丢弃法也有良好的结果。
* 超参数可控制世代多样性与质量。 更高的质量也意味着更多的模式崩溃。
* 不需要两个单独的优化器。
......
......@@ -17,7 +17,7 @@
研究表明,在 ImageNet 上训练的卷积网络权重中的特征提取优于常规特征提取方法,例如 SURF,可变形部分描述符(**DPD**),**直方图定向梯度****HOG**)和**词袋****BoW**)。 这意味着无论常规视觉表示如何工作,卷积特征都可以同样好地使用,唯一的缺点是更深的架构可能需要更长的时间来提取特征。
当在 ImageNet 上训练深层卷积神经网络时,第一层中的卷积滤波器的可视化(请参见下图)显示,他们学习了*低层*特征,类似于边缘检测滤波器,而卷积滤波器在最后一层学习*高级*功能,这些功能捕获特定于类的信息。 因此,如果我们在第一个池化层之后提取 ImageNet 的特征并将其嵌入 2D 空间(例如,使用 t-SNE),则可视化将显示数据中存在一些无中心状态,而如果在全连接层上执行相同操作,我们将注意到具有相同语义信息的数据被组织成簇。 这意味着网络可以在更高层次上很好地概括,并且有可能将这种知识转移到看不见的类别中。
当在 ImageNet 上训练深层卷积神经网络时,第一层中的卷积过滤器的可视化(请参见下图)显示,他们学习了*低层*特征,类似于边缘检测过滤器,而卷积过滤器在最后一层学习*高级*功能,这些功能捕获特定于类的信息。 因此,如果我们在第一个池化层之后提取 ImageNet 的特征并将其嵌入 2D 空间(例如,使用 t-SNE),则可视化将显示数据中存在一些无中心状态,而如果在全连接层上执行相同操作,我们将注意到具有相同语义信息的数据被组织成簇。 这意味着网络可以在更高层次上很好地概括,并且有可能将这种知识转移到看不见的类别中。
![](img/b7b186d6-7803-4517-add9-f559586b2576.png)
......@@ -38,7 +38,7 @@
我们应该如何使用转学? 有两种典型的解决方法。 第一种不太及时的方法是使用所谓的预训练模型,即预先在大型数据集(例如 ImageNet 数据集)上训练过的模型。 这些经过预先训练的模型可以在不同的深度学习框架中轻松获得,并且通常被称为“模型动物园”。 预训练模型的选择在很大程度上取决于当前要解决的任务是什么,以及数据集的大小。 选择模型后,我们可以使用全部或部分模型作为要解决的实际任务的初始化模型。
深度学习的另一种不太常见的方式是自己预先训练模型。 当可用的预训练网络不适合解决特定问题时,通常会发生这种情况,我们必须自己设计网络体系结构。 显然,这需要更多的时间和精力来设计模型和准备数据集。 在某些情况下,用于进行网络预训练的数据集甚至可以是合成的,可以从计算机图形引擎(例如 3D Studio Max 或 Unity)或其他卷积神经网络(例如 GAN)生成。 可以对虚拟数据进行预训练的模型在真实数据上进行微调,并且可以与仅对真实数据进行训练的模型一起很好地工作。
深度学习的另一种不太常见的方式是自己预先训练模型。 当可用的预训练网络不适合解决特定问题时,通常会发生这种情况,我们必须自己设计网络构。 显然,这需要更多的时间和精力来设计模型和准备数据集。 在某些情况下,用于进行网络预训练的数据集甚至可以是合成的,可以从计算机图形引擎(例如 3D Studio Max 或 Unity)或其他卷积神经网络(例如 GAN)生成。 可以对虚拟数据进行预训练的模型在真实数据上进行微调,并且可以与仅对真实数据进行训练的模型一起很好地工作。
例如,如果我们想区分猫和狗,而我们没有足够的数据,则可以从“模型动物园”下载在 ImageNet 上训练的网络,并使用除最后一层以外的所有层的权重。 最后一层必须调整为具有与班级数量相同的大小,在本例中为两个,并且权重需要重新初始化和训练。 这样,通过将这些层的学习率设置为零或非常小的值(请参见下图),我们将冻结那些不需训练的层。 如果有更大的数据集,我们可以训练最后三个全连接层。 有时,预训练网络只能用于初始化权重,然后再进行正常训练。
......
......@@ -6,7 +6,7 @@
* 我应该如何分割数据集?
* 我的数据集足以代表我的问题吗?
* 我的模型要有效且准确应该有多复杂
* 我的模型应该有多复杂才能有效且准确
* 评估模型的最佳方法是什么?
* 我应该如何构造我的代码?
......@@ -26,7 +26,7 @@
# 数据准备
所有机器学习算法的骨干都是数据。 机器学习算法学习的一切都来自数据。 因此,至关重要的是向算法提供代表问题陈述的正确数据。 就像已经看到的那样,深度学习特别需要大量数据用于训练模型。 有时我们可以说一定数量的数据足以解决问题,但是却永远不够! 多多益善。 能够正确训练的模型的复杂度与训练模型上的数据量成正比。 有限的数据将为该问题的模型体系结构选择设定上限。 在考虑可用数据量时,还值得注意的是,其中一部分也需要用于验证和测试目的。
所有机器学习算法的骨干都是数据。 机器学习算法学习的一切都来自数据。 因此,至关重要的是向算法提供代表问题陈述的正确数据。 就像已经看到的那样,深度学习特别需要大量数据用于训练模型。 有时我们可以说一定数量的数据足以解决问题,但是却永远不够! 多多益善。 能够正确训练的模型的复杂度与训练模型上的数据量成正比。 有限的数据将为该问题的模型构选择设定上限。 在考虑可用数据量时,还值得注意的是,其中一部分也需要用于验证和测试目的。
下一节将讨论数据分区及其对任何机器学习任务进度的重要性。
......@@ -35,7 +35,7 @@
在讨论将数据划分到其中之前,让我们定义“训练集”,“开发集”和“测试集”。
* **训练集**:用于训练机器学习算法的数据/示例集。 在机器学习中,此数据用于查找模型/分类器的“最佳”权重。 通常,使用的大多数数据都进入训练集。
* **开发**/**验证集**:用于在训练的中间阶段评估模型/分类器的数据部分。 该集合用于微调超参数和评估具有各种配置的模型体系结构。 它在模型开发期间使用,而不是在最终模型评估中使用。
* **开发**/**验证集**:用于在训练的中间阶段评估模型/分类器的数据部分。 该集合用于微调超参数和评估具有各种配置的模型构。 它在模型开发期间使用,而不是在最终模型评估中使用。
* **测试集**:模型经过微调和充分训练(我们对训练/开发集的损失感到满意),我们认为它已完全训练。 然后评估该模型。 对其进行评估的数据称为测试集。 测试集由数据的看不见部分组成,因此提供了最终模型性能的无偏估计。
为了获得高性能的神经网络,将数据集正确划分为训练集,开发集和测试集非常重要。 它有助于更​​快地迭代。 另外,它允许更有效地测量算法的偏差和方差,以便我们可以选择有效方式进行改进的方法。
......@@ -48,7 +48,7 @@
# 开发和测试集不匹配
除了拆分数据之外,数据的分布还对神经网络的性能产生巨大影响。 应用深度学习中的大多数问题来自开发人员和测试集数据分布的不匹配。 我们需要记住,开发和测试数据应该来自类似的分发。 例如,如果我们以如下方式收集和分割人员检测数据,即从网页上收集人员的训练图像,而使用移动电话收集测试集图像,则会出现分布不匹配的情况。 这里的问题是,在训练模型时,我们会根据其在开发数据上的性能来微调网络的参数和体系结构,如果开发数据与训练数据相似且与测试数据不同,则与训练集相比开发数据中存在很高的偏差。 在开发集上获得良好的评估结果并不一定意味着该模型可以很好地推广。 在这种情况下,对分布完全不同的集合进行测试可能会导致不良结果。 这是浪费时间和精力。 解决方案是首先合并开发集和测试集,随机将它们洗牌,最后将洗过的数据再次拆分为开发集和测试集。 这有助于在将机器学习算法成功训练到最终应用程序方面取得更快的进展。
除了拆分数据之外,数据的分布还对神经网络的性能产生巨大影响。 应用深度学习中的大多数问题来自开发人员和测试集数据分布的不匹配。 我们需要记住,开发和测试数据应该来自类似的分发。 例如,如果我们以如下方式收集和分割人员检测数据,即从网页上收集人员的训练图像,而使用移动电话收集测试集图像,则会出现分布不匹配的情况。 这里的问题是,在训练模型时,我们会根据其在开发数据上的性能来微调网络的参数和构,如果开发数据与训练数据相似且与测试数据不同,则与训练集相比开发数据中存在很高的偏差。 在开发集上获得良好的评估结果并不一定意味着该模型可以很好地推广。 在这种情况下,对分布完全不同的集合进行测试可能会导致不良结果。 这是浪费时间和精力。 解决方案是首先合并开发集和测试集,随机将它们洗牌,最后将洗过的数据再次拆分为开发集和测试集。 这有助于在将机器学习算法成功训练到最终应用程序方面取得更快的进展。
# 何时更改开发/测试集
......@@ -64,7 +64,7 @@
![](img/00d0d711-3009-4542-bb6e-3988f1007b50.png)
最好的方法是根据上图将其拆分。 分布 1 被拆分为训练集,其一部分用作开发集。 在这里,我们称其为“训练开发集”(因为开发集与火车集具有相同的分布)。 分布 1 主要用于训练,因为它是一个大型数据集。 分布 2 分为测试集和开发集,它们与分布 1 中的任一集无关。这里要强调的一点是,测试和开发集应来自同一发行版,并且属于我们实际上关心的应用程序,即目标应用程序。 开发集和测试集通常是小的数据集,因为它们的目的是给出模型/算法的无偏性能估计。
最好的方法是根据上图将其拆分。 分布 1 被拆分为训练集,其一部分用作开发集。 在这里,我们称其为“训练开发集”(因为开发集与训练集具有相同的分布)。 分布 1 主要用于训练,因为它是一个大型数据集。 分布 2 分为测试集和开发集,它们与分布 1 中的任一集无关。这里要强调的一点是,测试和开发集应来自同一发行版,并且属于我们实际上关心的应用程序,即目标应用程序。 开发集和测试集通常是小的数据集,因为它们的目的是给出模型/算法的无偏性能估计。
模型在不同数据集分区上的误差差异,以及查看人为误差可为我们提供诊断偏见和方差问题的见解
......@@ -92,7 +92,7 @@
在这种情况下,该模型在看不见的数据上表现不佳,该数据与训练集属于同一分布,但不是训练的一部分。 这意味着该模型无法概括,因此会过拟合训练数据。
* 高方差和高偏
* 高方差和高偏
| 训练误差 | 20% |
| 训练开发误差 | 40% |
......@@ -103,12 +103,12 @@
| | |
| --- | --- |
| 火车开发错误 | 2% |
| 训练开发错误 | 2% |
| 开发错误 | 15% |
当模型很好地适合来自与训练集相同分布的开发集,并且对来自不同分布的开发集表现不佳时,这会导致数据不匹配问题,如本章前面所述。
*开发集
*拟合开发集
| | |
| --- | --- |
......@@ -119,7 +119,7 @@
![](img/641fa640-9e3d-40c0-b72f-027ecc050fff.png)
ML 基本配方
ML 基本秘籍
有用的图表说明了测试和训练误差如何随模型复杂性而变化,如下所示。 一方面,当模型过于复杂时,往往会过拟合训练数据,因此,训练误差减小而测试误差增大。 另一方面,较简单的模型往往不适合并且无法推广。 模型复杂度的理想范围是在“测试误差”开始增加之前以及“训练误差”接近零时的某个位置。
......@@ -168,7 +168,7 @@ Tensorflow 已经具有其损失函数,并内置了加权选项:
# 评价指标
在为模型选择评估指标时,我们还需要小心。 假设对于狗/非狗分类问题,我们有两种算法的准确度分别为 98% 和 96%。 乍一看,这些算法看起来都具有相似的性能。 让我们记住,分类准确度定义为做出的正确预测数除以做出的预测总数。 换句话说,真阳性(TP)和真阴性(TN)预测数除以预测总数。 但是,可能出现的情况是,随着狗图像的出现,我们还会得到大量被错误分类为狗的背景或类似外观的物体,通常称为假阳性(FP)。 另一个不良行为可能是许多狗图像被错误分类为负面或假阴性(FN)。 显然,根据定义,分类准确性不能捕获误报或误报的概念。 因此,需要更好的评估指标。
在为模型选择评估指标时,我们还需要小心。 假设对于狗/非狗分类问题,我们有两种算法的准确度分别为 98% 和 96%。 乍一看,这些算法看起来都具有相似的性能。 让我们记住,分类准确度定义为做出的正确预测数除以做出的预测总数。 换句话说,真阳性(TP)和真阴性(TN)预测数除以预测总数。 但是,可能出现的情况是,随着狗图像的出现,我们还会得到大量被错误分类为狗的背景或类似外观的对象,通常称为假阳性(FP)。 另一个不良行为可能是许多狗图像被错误分类为负面或假阴性(FN)。 显然,根据定义,分类准确性不能捕获误报或误报的概念。 因此,需要更好的评估指标。
第一步,我们将构建一个混淆矩阵,该矩阵总结最后显示的段落:
......@@ -176,7 +176,7 @@ Tensorflow 已经具有其损失函数,并内置了加权选项:
根据此表,我们可以定义四个其他指标,这些指标可以使我们更好地了解已实现的结果。 这些是:
* **真阳性率(TPR)或灵敏度或召回率**:当物体存在时测试结果为阳性的概率(真实阳性率,以百分比表示),`= TP / (TP + FN)`
* **真阳性率(TPR)或灵敏度或召回率**:当对象存在时测试结果为阳性的概率(真实阳性率,以百分比表示),`= TP / (TP + FN)`
* **假阳性率(FPR)**:是特定测试错误拒绝实际阴性的概率,`= FP / (FP + TN)`
* **阳性预测值(PPV)或精度**:当检测结果为阳性(以百分比表示)时该对象存在的概率,`= TP / (TP + FP)`
* **阴性预测值(NPV)**:测试阴性(表示为百分比)时不存在对象的概率,`= TN / (TN + FN)`
......@@ -343,7 +343,7 @@ class CAE_CNN_Encoder(object):
# CNN 创建秘籍
以下几点基于我们在训练神经网络方面的经验以及该领域研究人员认为的当前最佳实践。 希望如果您需要从头开始设计自己的 CNN 架构,他们将为您提供帮助。 但是,在尝试设计自己的 CNN 之前,您应该查看其他现成的体系结构以从中学习,并检查它们是否已经为您完成了工作。
以下几点基于我们在训练神经网络方面的经验以及该领域研究人员认为的当前最佳实践。 希望如果您需要从头开始设计自己的 CNN 架构,他们将为您提供帮助。 但是,在尝试设计自己的 CNN 之前,您应该查看其他现成的构以从中学习,并检查它们是否已经为您完成了工作。
1. 使用内核大小为`3x3`的卷积层。 就参数和计算而言,较大的内核更昂贵。 最重要的是,如我们在前面的章节中所看到的,您可以堆叠卷积层以产生更大的感受域,并受益于更多的非线性激活。
2. 第一层卷积通常应至少具有 32 个过滤器。 这样,更深的层不受第一层提取的特征数量的限制。
......@@ -353,7 +353,7 @@ class CAE_CNN_Encoder(object):
6. 使用批量规范化。 确实有助于训练您的网络!
7. 随着您对网络的深入了解,逐渐减小要素地图的空间大小。
8. 最小化 FC 层的数量(在最后一层之前使用丢弃)。 仅在最终需要连接某些标量特征时才使用 FC。 (您甚至可以通过在输入通道上进行编码来避免这种情况)
9. 如果您需要较大的感受域(物体大小接近总图像大小的检测或分类),请尝试对每层使用具有指数膨胀因子的膨胀卷积。 这样,您将在保持少量参数的同时非常迅速地扩大接收范围。
9. 如果您需要较大的感受域(对象大小接近总图像大小的检测或分类),请尝试对每层使用具有指数膨胀因子的膨胀卷积。 这样,您将在保持少量参数的同时非常迅速地扩大接收范围。
10. 如果网络变深并且训练损失没有减少,请考虑使用剩余连接。
11. 在使网络精度在期望值之内并且如果计算成本成为问题之后,您可能会根据使用情况,研究深度卷积,瓶颈模块之类的技术,或现场出现的任何技术。
......
......@@ -9,7 +9,7 @@
在本章中,您将学习一些解决以下问题的方法:
* 数据集太大而无法放入内存
* 如何在多台机器上扩展训练范围
* 如何在多台机器上扩展训练
* 数据过于复杂而无法在普通目录文件夹和子文件夹中进行组织
# 在 TFRecords 中存储数据
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册