吴恩达深度学习课程之第四门课 卷积神经网络 第二周 深度卷积网络

本文参考黄海广主编针对吴恩达深度学习课程DeepLearning.ai 《深度学习课程 笔记 (V5.1 )》

第二周 深度卷积网络

2.1 为什么要进行实例探究?(Why look at case studies? )

LeNet-5 网络,我记得应该是 1980 年代的,经常被引用的 AlexNet,还有 VGG 网络。这些都是非常有效的神经网络范例,当中的一些思路为现代计算机视觉技术的发展奠定了基础。论文中的这些想法可能对你大有裨益,对你的工作也可能有所帮助。
然后是 ResNet,又称残差网络。神经网络正在不断加深,对此你可能有所了解。ResNet神经网络训练了一个深达 152 层的神经网络,并且在如何有效训练方面,总结出了一些有趣的想法和窍门。课程最后,我们还会讲一个 Inception 神经网络的实例分析。

了解了这些神经网络,我相信你会对如何构建有效的卷积神经网络更有感觉。即使计算机视觉并不是你的主要方向,但我相信你会从 ResNet 和 Inception 网络这样的实例中找到一些不错的想法。这里面有很多思路都是多学科融合的产物。

2.2 经典网络(Classic networks )

学习几个经典的神经网络结构,分别是 LeNet-5、AlexNet 和 VGGNet

看看 LeNet-5 的网络结构,假设你有一张 32×32×1 的图片,LeNet-5 可以识别图中的手写数字,比如像这样手写数字 7。

LeNet-5 是针对灰度图片训练的,所以图片的大小只有 32×32×1,使用 6 个 5×5的过滤器,步幅为 1。由于使用了 6 个过滤器,步幅为 1,padding 为 0,输出结果为 28×28×6,图像尺寸从 32×32 缩小到 28×28。然后进行池化操作,在这篇论文写成的那个年代,人们更喜欢使用平均池化,而现在我们可能用最大池化更多一些。在这个例子中,我们进行平均池,过滤器的宽度为 2,步幅为 2,图像的尺寸,高度和宽度都缩小了 2 倍,输出结果是一个 14×14×6 的图像。我觉得这张图片应该不是完全按照比例绘制的,如果严格按照比例绘制,新图像的尺寸应该刚好是原图像的一半。

接下来是卷积层,我们用一组 16 个 5×5 的过滤器,新的输出结果有 16 个通道。LeNet-5 的论文是在 1998 年撰写的,当时人们并不使用 padding,或者总是使用 valid 卷积,这就是为什么每进行一次卷积,图像的高度和宽度都会缩小,所以这个图像从 14 到 14 缩小到了10×10。然后又是池化层,高度和宽度再缩小一半,输出一个 5×5×16 的图像。将所有数字相乘,乘积是 400。

下一层是全连接层,在全连接层中,有 400 个节点,每个节点有 120 个神经元,这里已经有了一个全连接层。但有时还会从这 400 个节点中抽取一部分节点构建另一个全连接层,就像这样,有 2 个全连接层

最后一步就是利用这 84 个特征得到最后的输出,我们还可以在这里再加一个节点用来预测y 的值,y有 10 个可能的值,对应识别 0-9 这 10 个数字。在现在的版本中则使用 softmax函数输出十种分类结果,而在当时,LeNet-5 网络在输出层使用了另外一种,现在已经很少用到的分类器。

相比现代版本,这里得到的神经网络会小一些,只有约 6 万个参数。而现在,我们经常看到含有一千万到一亿个参数的神经网络,比这大 1000 倍的神经网络也不在少数。不管怎样,如果我们从左往右看,随着网络越来越深,图像的高度和宽度在缩小,从最初的 32×32 缩小到 28×28,再到 14×14、10×10,最后只有 5×5。与此同时,随着网络层次的加深,通道数量一直在增加,从 1 增加到 6 个,再到 16 个。

2.3 残差网络(Residual Networks (ResNets))

非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。这节课我们学习跳跃连接(Skip connection),它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳跃连接构建能够训练深度网络的ResNets,有时深度能够超过 100 层,让我们开始吧。

ResNets 是由残差块(Residual block)构建的,首先我解释一下什么是残差块。

ResNet 网络就是通过将很多这样的残差块堆积在一起,形成一个很深神经网络,我们来看看这个网络。

这并不是一个残差网络,而是一个普通网络(Plain network),这个术语来自 ResNet 论文。

把它变成 ResNet 的方法是加上所有跳跃连接,正如前一张幻灯片中看到的,每两层增加一个捷径,构成一个残差块。如图所示,5 个残差块连接在一起构成一个残差网络。

如果我们使用标准优化算法训练一个普通网络,比如说梯度下降法,或者其它热门的优化算法。如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。也就是说,理论上网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。

2.4 残差网络为什么有用?(Why ResNets work? )

结果表明,残差块学习这个恒等式函数并不难,跳跃连接使我们很容易得出𝑏 [𝑚+2] = 𝑏 [𝑚] 。 这意味着,即使给神经网络增加了这两层,它的效率也并不逊色于更简单的神经网络,因为学习恒等函数对它来说很简单。尽管它多了两层,也只把𝑏 [𝑚] 的值赋值给𝑏 [𝑚+2] 。所以给大型神经网络增加两层,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的表现。

我认为残差网络起作用的主要原因就是这些残差块学习恒等函数非常容易,你能确定网络性能不会受到影响,很多时候甚至可以提高效率,或者说至少不会降低网络的效率,因此创建类似残差网络可以提升网络性能。

最后,我们来看看 ResNets 的图片识别。这些图片是我从何凯明等人论文中截取的,这是一个普通网络,我们给它输入一张图片,它有多个卷积层,最后输出了一个 Softmax。

如何把它转化为 ResNets 呢?只需要添加跳跃连接。这里我们只讨论几个细节,这个网络有很多层 3×3 卷积,而且它们大多都是 same 卷积,这就是添加等维特征向量的原因。所以这些都是卷积层,而不是全连接层,因为它们是 same 卷积,维度得以保留,这也解释了添加项z[𝑚+2] + a [𝑚] (维度相同所以能够相加)

不论这些层是什么类型,正如我们在上一张幻灯片看到的,你都需要调整矩阵Ws 的维度。普通网络和 ResNets 网络常用的结构是:卷积层-卷积层-卷积层-池化层-卷积层-卷积层-卷积层-池化层……依此重复。直到最后,有一个通过 softmax 进行预测的全连接层。以上就是 ResNets 的内容。

2.5 网络中的网络以及 1×1 卷积(Network in Network and 1×1 convolutions)

其中一个比较有帮助的想法是使用 1×1 卷积。过滤器为 1×1,这里是数字 2,输入一张 6×6×1 的图片,然后对它做卷积,起过滤器大小为 1×1×1,结果相当于把这个图片乘以数字 2,所以前三个单元格分别是 2、4、6 等等。用 1×1 的过滤器进行卷积,似乎用处不大,只是对输入矩阵乘以某个数字。但这仅仅是对于6×6×1 的一个通道图片来说,1×1 卷积效果不佳。

如果是一张 6×6×32 的图片,那么使用 1×1 过滤器进行卷积效果更好。具体来说,1×1 卷积所实现的功能是遍历这 36 个单元格,计算左图中 32 个数字和过滤器中 32 个数字的元素积之和,然后应用 ReLU 非线性函数

它是这个输入层上的某个切片,用这 36 个数字乘以这个输入层上 1×1 切片,得到一个实数,像这样把它画在输出中。这个 1×1×32 过滤器中的 32 个数字可以这样理解,一个神经元的输入是 32 个数字(输入图片中左下角位置 32 个通道中的数字),即相同高度和宽度上某一切片上的 32 个数字,这 32 个数字具有不同通道,乘以 32 个权重(将过滤器中的 32 个数理解为权重),然后应用 ReLU 非线性函数,在这里输出相应的结果。

  ​

举个 1×1 卷积的例子,相信对大家有所帮助,这是它的一个应用。

假设这是一个 28×28×192 的输入层,你可以使用池化层压缩它的高度和宽度,这个过程我们很清楚。但如果通道数量很大,该如何把它压缩为 28×28×32 维度的层呢?你可以用 32个大小为 1×1 的过滤器,严格来讲每个过滤器大小都是 1×1×192 维,因为过滤器中通道数量必须与输入层中通道的数量保持一致。但是你使用了 32 个过滤器,输出层为 28×28×32,这就是压缩通道数(𝑜 𝑑 )的方法,对于池化层我只是压缩了这些层的高度和宽度。

 

在之后我们看到在某些网络中 1×1 卷积是如何压缩通道数量并减少计算的。当然如果你想保持通道数 192 不变,这也是可行的,1×1 卷积只是添加了非线性函数,当然也可以让网络学习更复杂的函数,比如,我们再添加一层,其输入为 28×28×192,输出为 28×28×192。

1×1 卷积层就是这样实现了一些重要功能的(doing something pretty non-trivial),它给神经网络添加了一个非线性函数,从而减少或保持输入层中的通道数量不变,当然如果你愿意,也可以增加通道数量。后面你会发现这对构建 Inception 网络很有帮助,我们放在下节课讲。这节课我们演示了如何根据自己的意愿通过 1×1 卷积的简单操作来压缩或保持输入层中的通道数量,甚至是增加通道数量。

2.6 谷歌 Inception 网络简介(Inception network motivation)

构建卷积层时,你要决定过滤器的大小究竟是 1×1(原来是 1×3,猜测为口误),3×3 还是 5×5,或者要不要添加池化层。而 Inception 网络的作用就是代替你来决定,虽然网络架构因此变得更加复杂,但网络表现却非常好,我们来了解一下其中的原理。

例如,这是你 28×28×192 维度的输入层,Inception 网络或 Inception 层的作用就是代替人工来确定卷积层中的过滤器类型,或者确定是否需要创建卷积层或池化层

基本思想是 Inception 网络不需要人为决定使用哪个过滤器或者是否需要池化,而是由网络自行确定这些参数,你可以给网络添加这些参数的所有可能值,然后把这些输出连接起来,让网络自己学习它需要什么样的参数,采用哪些过滤器组合。

Inception 层有一个问题,就是计算成本。

降低计算成本,瓶颈层

 ​

这里还有另外一种架构,其输入为 28×28×192,输出为 28×28×32。其结果是这样的,对于输入层,使用 1×1 卷积把输入值从 192 个通道减少到 16 个通道。然后对这个较小层运行5×5 卷积,得到最终输出。请注意,输入和输出的维度依然相同,输入是 28×28×192,输出是 28×28×32,和上一页的相同。但我们要做的就是把左边这个大的输入层压缩成这个较小的的中间层,它只有 16 个通道,而不是 192 个。

有时候这被称为瓶颈层,瓶颈通常是某个对象最小的部分,假如你有这样一个玻璃瓶,这是瓶塞位置,瓶颈就是这个瓶子最小的部分。

所需要乘法运算的总次数是这两层的计算成本之和。

总结一下,如果你在构建神经网络层的时候,不想决定池化层是使用 1×1,3×3 还是 5×5的过滤器,那么 Inception 模块就是最好的选择。我们可以应用各种类型的过滤器,只需要把输出连接起来。之后我们讲到计算成本问题,我们学习了如何通过使用 1×1 卷积来构建瓶颈层,从而大大降低计算成本。

你可能会问,仅仅大幅缩小表示层规模会不会影响神经网络的性能?事实证明,只要合理构建瓶颈层,你既可以显著缩小表示层规模,又不会降低网络性能,从而节省了计算。这就是 Inception 模块的主要思想。

2.7 Inception 网络(Inception network )

学习如何将这些模块组合起来,构筑你自己的 Inception 网络。Inception 模块会将之前层的激活或者输出作为它的输入,作为前提。

这是一个28×28×192 的输入,和我们之前视频中的一样。我们详细分析过的例子是,先通过一个 1×1层,再通过一个 5×5 的层,1×1 的层可能有 16 个通道,而 5×5 的层输出为 28×28×32,共

32 个通道。

 RGEFORMAT ​

为了在这个 3×3 的卷积层中节省运算量,你也可以做相同的操作,这样的话 3×3 的层将会输出 28×28×128。

 ​

或许你还想将其直接通过一个 1×1 的卷积层,这时就不必在后面再跟一个 1×1 的层了,这样的话过程就只有一步,假设这个层的输出是 28×28×64。

最后是池化层。

这里我们要做些有趣的事情,为了能在最后将这些输出都连接起来,我们会使用 same类型的 padding 来池化,使得输出的高和宽依然是 28×28,这样才能将它与其他输出连接起来。但注意,如果你进行了最大池化,即便用了 same padding,3×3 的过滤器,stride 为 1,其输出将会是 28×28×192,其通道数或者说深度与这里的输入(通道数)相同。所以看起来它会有很多通道,我们实际要做的就是再加上一个 1×1 的卷积层,去进行我们在 1×1 卷积层的视频里所介绍的操作,将通道的数量缩小,缩小到 28×28×32。也就是使用 32 个维度为1×1×192 的过滤器,所以输出的维度其通道数缩小为 32。这样就避免了最后输出时,池化层占据所有的通道。

  ​

最后,将这些方块全都连接起来。在这过程中,把得到的各个层的通道都加起来,最后得到一个 28×28×256 的输出。通道连接实际就是之前视频中看到过的,把所有方块连接在一起的操作。这就是一个 Inception 模块,而 Inception 网络所做的就是将这些模块都组合到一起。

  ​

这是一张取自 Szegety et al 的论文中关于 Inception 网络的图片,你会发现图中有许多重复的模块,可能整张图看上去很复杂,但如果你只截取其中一个环节(编号 1),就会发现这是在前一页 ppt 中所见的 Inception 模块

我们深入看看里边的一些细节,这是另一个 Inception 模块(编号 2),这也是一个nception 模块(编号 3)。这里有一些额外的最大池化层(编号 6)来修改高和宽的维度。这是另外一个 Inception 模块(编号 4),这是另外一个最大池化层(编号 7),它改变了高和宽。而这里又是另一个 Inception 模块(编号 5)。

所以 Inception 网络只是很多这些你学过的模块在不同的位置重复组成的网络,所以如果你理解了之前所学的 Inception 模块,你就也能理解 Inception 网络。

  ​

事实上,如果你读过论文的原文,你就会发现,这里其实还有一些分支,我现在把它们加上去。所以这些分支有什么用呢?在网络的最后几层,通常称为全连接层,在它之后是一个 softmax 层(编号 1)来做出预测,这些分支(编号 2)所做的就是通过隐藏层(编号 3)来做出预测,所以这其实是一个 softmax 输出(编号 2),这(编号 1)也是。这是另一条分支(编号 4),它也包含了一个隐藏层,通过一些全连接层,然后有一个 softmax 来预测,输出结果的标签。

你应该把它看做 Inception 网络的一个细节,它确保了即便是隐藏单元和中间层(编号5)也参与了特征计算,它们也能预测图片的分类。它在 Inception 网络中,起到一种调整的效果,并且能防止网络发生过拟合。

(作者其实是通过它来表明了建立更深的神经网络的决心,他们正是这样构建了 Inception。我想一般研究论文,通常不会引用网络流行模因(梗),但这里显然很合适。)

最后总结一下,如果你理解了 Inception 模块,你就能理解 Inception 网络,无非是很多个 Inception 模块一环接一环,最后组成了网络。自从 Inception 模块诞生以来,经过研究者们的不断发展,衍生了许多新的版本。

2.8  使 用 开 源 的 实 现 方 案 

如果你在开发一个计算机视觉应用,一个常见的工作流程是,先选择一个你喜欢的架构,或许是你在这门课中学习到的,或者是你从朋友那听说的,或者是从文献中看到的,接着寻找一个开源实现,从 GitHub 下载下来,以此基础开始构建。这样做的优点在于,这些网络通常都需要很长的时间来训练,而或许有人已经使用多个 GPU,通过庞大的数据集预先训练了这些网络,这样一来你就可以使用这些网络进行迁移学习

2.9 迁移学习(Transfer Learning)

如果你要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始,如果你下载别人已经训练好网络结构的权重,你通常能够进展的相当快,用这个作为预训练,然后转换到你感兴趣的任务上。

另一个技巧,也许对一些情况有用,由于前面的层都冻结了,相当于一个固定的函数。因为你不需要改变它,也不训练它,取输入图像𝑌,然后把它映射到这层(softmax的前一层)的激活函数。所以这个能加速训练的技巧就是,如果我们先计算这一层(紫色箭头标记),计算特征或者激活值,然后把它们存到硬盘里。你所做的就是用这个固定的函数,在这个神经网络的前半部分(softmax 层之前的所有层视为一个固定映射),取任意输入图像𝑌,然后计算它的某个特征向量,这样你训练的就是一个很浅的 softmax 模型,用这个特征向量来做预测。对你的计算有用的一步就是对你的训练集中所有样本的这一层的激活值进行预计算,然后存储到硬盘里,然后在此之上训练 softmax 分类器。

所以,存储到硬盘或者说预计算方法的优点就是,你不需要每次遍历训练集再重新计算这个激活值了。

可以用下载的权重只作为初始化,用它们来代替随机初始化,接着你可以用梯度下降训练,更新网络所有层的所有权重。

2.10 数据扩充(Data augmentation)

大部分的计算机视觉任务使用很多的数据,所以数据扩充是经常使用的一种技巧来提高计算机视觉系统的表现。我认为计算机视觉是一个相当复杂的工作,你需要输入图像的像素值,然后弄清楚图片中有什么,似乎你需要学习一个复杂方程来做这件事。在实践中,更多的数据对大多数计算机视觉任务都有所帮助,不像其他领域,有时候得到充足的数据,但是效果并不怎么样。但是,当下在计算机视觉方面,计算机视觉的主要问题是没有办法得到充足的数据。对大多数机器学习应用,这不是问题,但是对计算机视觉,数据就远远不够。

所以这就意味着当你训练计算机视觉模型的时候,数据扩充会有所帮助,这是可行的,无论你是使用迁移学习,使用别人的预训练模型开始,或者从源代码开始训练模型。让我们来看一下计算机视觉中常见的数据扩充的方法。

​ ​

或许最简单的数据扩充方法就是垂直镜像对称,假如,训练集中有这张图片,然后将其翻转得到右边的图像。对大多数计算机视觉任务,左边的图片是猫,然后镜像对称仍然是猫,如果镜像操作保留了图像中想识别的物体的前提下,这是个很实用的数据扩充技巧。

​ ​

另一个经常使用的技巧是随机裁剪,给定一个数据集,然后开始随机裁剪,可能修剪这个(编号 1),选择裁剪这个(编号 2),这个(编号 3),可以得到不同的图片放在数据集中,你的训练集中有不同的裁剪。随机裁剪并不是一个完美的数据扩充的方法,如果你随机裁剪的那一部分(红色方框标记部分,编号 4),哪一个看起来更像猫。但在实践中,这个方法还是很实用的,随机裁剪构成了很大一部分的真实图片。

镜像对称和随机裁剪是经常被使用的。当然,理论上,你也可以使用旋转,剪切(shearing:此处并非裁剪的含义,图像仅水平或垂直坐标发生变化)图像,可以对图像进行这样的扭曲变形,引入很多形式的局部弯曲等等。当然使用这些方法并没有坏处,尽管在实践中,因为太复杂了所以使用的很少。

第二种经常使用的方法是彩色转换,有这样一张图片,然后给 R、G 和 B 三个通道上加上不同的失真值。

​ ​

在这个例子中(编号 1),要给红色、蓝色通道加值,给绿色通道减值。红色和蓝色会产生紫色,使整张图片看起来偏紫,这样训练集中就有失真的图片。为了演示效果,我对图片的颜色进行改变比较夸张。在实践中,对 R、G 和 B 的变化是基于某些分布的,这样的改变也可能很小。

这么做的目的就是使用不同的 R、G 和 B 的值,使用这些值来改变颜色。在第二个例子中(编号 2),我们少用了一点红色,更多的绿色和蓝色色调,这就使得图片偏黄一点。在这(编号 3)使用了更多的蓝色,仅仅多了点红色。在实践中,R、G 和 B 的值是根据某种概率分布来决定的。这么做的理由是,可能阳光会有一点偏黄,或者是灯光照明有一点偏黄,这些可以轻易的改变图像的颜色,但是对猫的识别,或者是内容的识别,以及标签𝑧,还是保持不变的。所以介绍这些,颜色失真或者是颜色变换方法,这样会使得你的学习算法对照片的颜色更改更具鲁棒性

​ ​

这是对更高级的学习者的一些注意提醒,你可以不理解我用红色标出来的内容。对 R、G 和 B 有不同的采样方式,其中一种影响颜色失真的算法是 PCA,即 主成分分析。但具体颜色改变的细节在 AlexNet 的论文中有时候被称作 PCA 颜色增强,PCA 颜色增强的大概含义是,比如说,如果你的图片呈现紫色,即主要含有红色和蓝色,绿色很少,然后 PCA 颜色增强算法就会对红色和蓝色增减很多,绿色变化相对少一点,所以使总体的颜色保持一致。

这就是数据扩充,与训练深度神经网络的其他部分类似,在数据扩充过程中也有一些超参数,比如说颜色变化了多少,以及随机裁剪的时候使用的参数。与计算机视觉其他部分类似,一个好的开始可能是使用别人的开源实现,了解他们如何实现数据扩充。当然如果你想获得更多的不变特性,而其他人的开源实现并没有实现这个,你也可以去调整这些参数。因此,我希望你们可以使用数据扩充使你的计算机视觉应用效果更好

2.11 计算机视觉现状(The state of computer vision)

图像识别其实是如何看图片的问题,并且告诉你这张图是不是猫,而对象检测则是看一幅图,你画一个框,告诉你图片里的物体,比如汽车等等。因为获取边框的成本比标记对象的成本更高,所以我们进行对象检测的数据往往比图像识别数据要少。

所以当我看机器学习应用时,我们认为通常我们的学习算法有两种知识来源

一个来源是被标记的数据,就像(𝑦 , 𝑧)应用在监督学习。

第二个知识来源是手工工程,有很多方法去建立一个手工工程系统,它可以是源于精心设计的特征,手工精心设计的网络体系结构或者是系统的其他组件。所以当你没有太多标签数据时,你只需要更多地考虑手工工程。

所以我认为计算机视觉是在试图学习一个非常复杂的功能,我们经常感觉我们没有足够的数据,即使获得了更多数据,我们还是经常觉得还是没有足够的数据来满足需求。这就是为什么计算机视觉,从过去甚至到现在都更多地依赖于手工工程。我认为这也是计算机视觉领域发展相当复杂网络架构地原因,因为在缺乏更多数据的情况下,获得良好表现的方式还是花更多时间进行架构设计,或者说在网络架构设计上浪费(贬义褒用,即需要花费更多时间的意思)更多时间。

下面是一些有助于在基准测试中表现出色的小技巧。

其中一个是集成,这就意味着在你想好了你想要的神经网络之后,可以独立训练几个神经网络,并平均它们的输出。比如说随机初始化三个、五个或者七个神经网络,然后训练所有这些网络,然后平均它们的输出。另外对他们的输出 ŷ 进行平均计算是很重要的,不要平均他们的权重,这是行不通的。看看你的 7 个神经网络,它们有 7 个不同的预测,然后平均他们,这可能会让你在基准上提高 1%,2%或者更好。这会让你做得更好,也许有时会达到1%或 2%,这真的能帮助你赢得比赛。但因为集成意味着要对每张图片进行测试,你可能需要在从 3 到 15 个不同的网络中运行一个图像,这是很典型的,因为这 3 到 15 个网络可能会让你的运行时间变慢,甚至更多时间,所以技巧之一的集成是人们在基准测试中表现出色和赢得比赛的利器,但我认为这几乎不用于生产服务于客户的,我想除非你有一个巨大的计算预算而且不介意在每个用户图像数据上花费大量的计算。

你在论文中可以看到在测试时,对进准测试有帮助的另一个技巧就是 Multi-crop at testtime,我的意思是你已经看到了如何进行数据扩充,Multi-crop 是一种将数据扩充应用到你的测试图像中的一种形式。

​ ​

举个例子,让我们看看猫的图片,然后把它复制四遍,包括它的两个镜像版本。有一种叫作 10-crop 的技术(crop 理解为裁剪的意思),它基本上说,假设你取这个中心区域,裁剪,然后通过你的分类器去运行它,然后取左上角区域,运行你的分类器,右上角用绿色表示,左下方用黄色表示,右下方用橙色表示,通过你的分类器来运行它,然后对镜像图像做同样的事情对吧?所以取中心的 crop,然后取四个角落的 crop。

​ ​

这是这里(编号 1)和这里(编号 3)就是中心 crop,这里(编号 2)和这里(编号 4)是四个角落的 crop。如果把这些加起来,就会有 10 种不同的图像的 crop,因此命名为 10-crop。所以你要做的就是,通过你的分类器来运行这十张图片,然后对结果进行平均。如果你有足够的计算预算,你可以这么做,也许他们需要 10 个 crops,你可以使用更多,这可能会让你在生产系统中获得更好的性能。如果是生产的话,我的意思还是实际部署用户的系统。

但这是另一种技术,它在基准测试上的应用,要比实际生产系统中好得多。

集成的一个大问题是你需要保持所有这些不同的神经网络,这就占用了更多的计算机内存。对于 multi-crop,我想你只保留一个网络,所以它不会占用太多的内存,但它仍然会让你的运行时间变慢。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值