用于计算机视觉的深度卷积神经网络架构2025年3月17日 | 阅读 10 分钟 优秀的卷积神经网络(ConvNets)是拥有许多隐藏层和数百万参数的庞大机器。“隐藏层越多,网络越好”实际上是一个很糟糕的准则。知名的网络包括ResNet、AlexNet、VGG、Inception等。为什么这些网络如此有效?它们是如何被创造出来的?它们为什么会有那样的结构?人们对此感到好奇。这些问题没有简单的答案,一篇博客文章也不可能全部涵盖。然而,我将尝试在本文中回答其中一些问题。理解如何构建网络架构需要一些时间,而自己探索则需要更多的时间。不过,让我们先把事情放到背景中来看。 为什么卷积网络优于传统计算机视觉?将给定图像归入预先建立的类别之一的过程被称为图像分类。传统的图像分类流程由特征提取和分类模块组成。 特征提取过程需要从原始像素值中提取更高层次的信息,同时考虑不同类别之间的差异。这里使用的是无监督特征提取,意味着从像素中收集的数据与图像的类别无关。一些经久不衰且流行的特征包括GIST、HOG、SIFT、LBP等。一旦提取了特征,就会使用这些图像及其对应的标签来训练一个分类模块。这个模块的例子包括SVM、逻辑回归、随机森林、决策树等。 这种流程的缺点在于,特征提取不能根据类别和图像进行调整。因此,如果所选特征缺乏识别类别所需的表示能力,无论使用何种分类方法,分类模型的准确性都会受到很大影响。在传统的流程之后,最先进技术中反复出现的主题是挑选不同的特征提取器并创造性地将它们组合以获得更好的特征。然而,这需要太多的启发式方法和手动工作来根据领域调整参数并达到可观的准确度。当我说可观时,我指的是接近人类的精度。 正因为如此,开发一个优秀的计算机视觉系统(如OCR、人脸验证、图像分类器、物体检测器等)需要花费数年时间,才能处理实际应用中发现的各种数据。我们曾为一家公司(我初创公司的客户)在六周内使用卷积网络取得了比他们使用传统计算机视觉花费更长时间所取得的更好的结果。 这种方法的另一个问题是,它与人类学习识别物体的方式大相径庭。新生儿出生时无法看清周围的环境,但随着他成长并吸收信息,他学会了识别物体。这是深度学习的基本原则,它没有硬编码的内部特征提取器。它将提取和分类模块集成到一个单一的系统中,在这个系统中,它学会根据判别从图像中分离出表示,并使用监督数据对它们进行分类。 多层感知器,也称为神经网络,就是这样一种系统,由许多层紧密相连的神经元组成。由于深度普通神经网络中有大量的参数,如果没有足够的训练样本,就很难在不过拟合模型的情况下训练一个。然而,使用像ImageNet这样的大型数据集,卷积神经网络(ConvNets)允许从头开始训练整个网络。 这要归功于卷积层中神经元之间的参数共享和稀疏连接。例如,图2展示了这一点。在卷积过程中,2D特征图的参数是共享的,并且一层中的神经元仅与输入神经元局部连接。 a. 准确性: 如果你希望智能机器正常工作,它必须尽可能准确。在这种背景下,一个合理的问题是“准确性不仅取决于网络,还取决于可用于训练的数据量”。为了比较这些网络,我们使用ImageNet标准数据集。 正在进行的ImageNet项目目前拥有超过21841个不同类别的14,197,122张图片。自2010年以来,ImageNet数据集每年举办一次视觉识别竞赛,参赛者可以访问来自1000个不同分类的120万张图片。因此,每个网络架构都使用这1000个类别的120万张图片来报告其准确性。 b. 计算量: 大多数卷积网络需要大量的内存和处理能力,尤其是在训练时。因此,这成了一个重要问题。同样,如果你想部署一个模型在移动设备上本地运行,你必须考虑最终训练模型的大小。正如你所预料的,使用更多计算资源的网络能够提供更准确的结果。因此,精度和计算量之间总是在进行权衡。 除此之外,还有其他几个变量,比如训练网络的难易程度以及它的泛化效果。下面列出的网络是最知名的网络;它们按发布顺序排列,并且随着时间的推移,它们的准确性也在提高。 AlexNet这个架构是最早显著提高ImageNet分类准确率,远超传统方法的深度网络之一。它在五个卷积层之后有三个全连接层。 ![]() 由Alex Krizhevsky开发的AlexNet的非线性部分采用了修正线性单元(ReLU),而不是传统神经网络中常用的Tanh或Sigmoid函数。ReLU由下式给出: f(x) = max(0, x) ReLU相对于Sigmoid的优点在于,它的训练速度要快得多,因为在饱和区域,Sigmoid的导数变得很小,导致权重更新几乎停止。这就是所谓的梯度消失问题。 在每个全连接(FC)层和卷积层之后都添加了ReLU层。 ![]() 通过在每个FC层后添加一个Dropout层,该架构还减少了过拟合问题。Dropout层独立应用于响应图中的每个神经元,并附带一个概率(p)。它以概率p随机地禁用激活。 ![]() ![]() Dropout是如何工作的?Dropout和集成模型的原理结构相似。由于Dropout层的作用,被关闭的神经元的不同组合代表了不同的设计,这些不同的模型被同时训练,每个子集都分配了权重,且权重之和为一。对于连接到Dropout的n个神经元,创建的子集结构数量为2^n。基本上,这意味着预测是多个模型组合的平均值。这提供了一种系统化的模型正则化方法,有助于防止过拟合。从另一个角度看Dropout的价值是,由于神经元是随机选择的,它们倾向于避免相互协同适应,从而使它们能够学习到彼此独立的重要特征。 VGG16![]() 这个架构源于牛津大学的VGG研究组。它通过在第一和第二卷积层中,用多个3x3核大小的滤波器 последовательно替换AlexNet中的11x11和5x5的大核滤波器,从而超越了AlexNet。多个非线性层增加了网络的深度,使其能够以更低的成本学习更复杂的特征。这使得对于给定的感受野(输出所依赖的输入图像的有效区域大小),多个堆叠的较小尺寸的核优于一个较大尺寸的核。 你可以看到,在VGG-D中,包含了多次应用相同滤波器大小的块,以提取更复杂和更具代表性的特征。在VGG之后,块和模块的概念在整个网络中传播开来。 VGG的卷积层之后是三个全连接层。在每个子采样/池化层之后,网络的宽度以2的倍数增加,从64的低值开始。它在ImageNet上获得了92.3%的top-5准确率。 GoogLeNet/Inception尽管VGG在ImageNet数据集上取得了出色的准确性,但由于其巨大的计算需求(包括内存和时间),即使在最小的GPU上实现也存在问题。由于卷积层的宽度很大,它变得效率低下。 例如,对于一个3x3核大小的卷积层,它接受512个输入通道并输出512个通道,其计算量级为9x512x512。 在单个位置的卷积操作期间,每个输出通道(上例中为512个)都连接到每个输入通道;因此,该架构被称为具有密集连接。GoogLeNet基于这样一个假设:深度网络中的大多数激活要么是冗余的,要么是不必要的(值为零),这是由于相关性造成的。 因此,深度网络最有效的设计将具有激活之间的稀疏连接,这意味着并非所有512个输出通道都将连接到所有512个输入通道。有方法可以移除这些连接,从而留下稀疏的连接或权重。然而,BLAS或CuBLAS(用于GPU的CUDA)包并未对稀疏矩阵的核进行优化,使其比其密集等价物慢得多。 为了用典型的密集架构模拟稀疏CNN,GoogleLeNet开发了一个名为Inception模块的模块。 对于给定的核大小,卷积滤波器的宽度和数量保持在最低限度,因为如前所述,只有有限数量的神经元是有用的。此外,它采用不同大小的卷积(5x5、3x3、1x1)来捕获不同尺度的信息。 该模块的另一个值得注意的方面是包含了“瓶颈层”(图中的1x1卷积)。如下所述,它有助于显著减少计算需求。 以GoogleLeNet的初始Inception模块为例,它有192个输入通道。其中只有128个3x3核大小的滤波器和32个5x5大小的滤波器。 对于5x5滤波器,计算量级为25x32x192,随着我们深入网络以及网络宽度和5x5滤波器数量的增加,这个数字可能会爆炸式增长。为了防止这种情况,Inception模块在应用较大尺寸的核并将其输入这些卷积之前,采用1x1卷积来降低输入通道的维度。因此,在第一个Inception模块中,输入先通过只有16个滤波器的1x1卷积,然后再输入到5x5卷积中。现在的计算量是16x192 + 25x32x16。所有这些改进使得网络能够具有广泛而深入的传播。 谷歌神经网络所做的另一项调整是取消了末端的全连接层,取而代之的是一个简单的全局平均池化,它只对2D特征图上的通道值进行平均。因此,总参数数量大大减少。从AlexNet中可以理解这一点,其中FC层约占参数的90%。GoogleLeNet通过使用一个宽而深的网络,能够在不牺牲准确性的情况下消除FC层。它比VGG快得多,在ImageNet上达到了93.3%的top-5准确率。 ![]() 残差网络假设过拟合问题得到控制,我们迄今为止的观察表明,增加深度应该有助于提高网络的准确性。然而,更大深度的问题在于,它会导致调整权重所需的信号(该信号来自网络末端,通过比较真实值和预测值得出)在早期层变得非常小。这基本上表明,通过前几层进行的学习是微不足道的。这被称为梯度消失。训练更深网络的第二个问题是,这样做会盲目地增加层数,试图优化一个巨大的参数空间。这会增加训练误差。残差网络允许通过构建名为残差模块的模块来训练如此深的网络,如图所示。这被称为退化问题。关于它为何有效的直觉可以看作如下: ![]() 将网络A看作一个训练误差为x的网络。通过在网络A之上堆叠额外的层来创建网络B,然后设置这些层中的参数值,以使网络A的输出不受影响。让我们将附加层称为C层。这意味着新网络将具有相同的x%训练误差。为避免过度训练网络B,其训练误差不应大于网络A的误差。 此外,由于这种情况确实发生,唯一的解释是求解器未能通过额外的C层学习恒等映射(即对输入不做任何处理,只是原样复制),这并非一个简单的问题。为了解决这个问题,上面描述的模块在输入和输出之间建立了一个直接连接,假设为恒等映射,而额外的C层只需要学习在已经可用的输入之上的特征。整个模块被称为残差模块,因为C只学习残差部分。 它也像GoogleNet一样,在分类层之前使用了全局平均池化。通过上述改进,ResNets可以学习到深达152层的网络。它在计算上比VGGNet更高效,同时比VGGNet和GoogLeNet取得了更高的准确率。ResNet-152获得了95.51的top-5准确率。 其中一个实验可以用来评估残差网络的有效性。与18层的普通网络相比,34层的普通网络显示出更高的验证误差。我们现在认识到这个问题是退化。此外,当相同的34层网络转换为残差网络时,它的训练误差比18层的残差网络要低得多。 ![]() |
简介:在本文中,我们将讨论 Python 脚本中的暂停。Python 3 中使用 input() 方法从用户收集数据。出于编程目的,可能需要等待或暂停输入任务一段时间。例如,如果脚本包含...
阅读 3 分钟
Blender是一款功能强大的开源3D创作软件,允许用户创建各种3D模型、动画和视觉效果。它包含一个Python API,使开发人员能够自动化和扩展Blender的功能。Blender的Python API是一个全面的模块库...
7 分钟阅读
scipy.stats.moyal描述了Moyal连续随机变量。它是从通用方法继承的rv_continuous类的一个实例。它通过添加特定于此分布的细节来完善这些技术。给出Moyal分布的概率密度函数由下式给出:对于任何实数...
阅读 3 分钟
Python 是一种高级通用编码语言。其语法使开发者能够用最少的代码行(称为脚本)来表达他们的概念。它的构建重点是脚本的可读性。这些脚本中包含了字符集和标记。我们将发现...
阅读 6 分钟
简介 在本教程中,我们将讨论采购管理。采购管理是一种战略技术,用于在您确定的预算内,在截止日期或之前从所需的公司获取物品或服务。您的目标是平衡供需以确保最小库存水平...
阅读 3 分钟
零假设和备择假设是假设检验的两种不同方法。零假设的前提是一个事件(也称为基本事实)。备择假设是与主要假设相悖的推定。想象一个七十多岁的女性,她有...
14 分钟阅读
Bokeh是Python的一个交互式数据可视化库。它使用HTML和JavaScript语言创建其绘图。其基本目标是现代网站浏览器,用于呈现所提供的优雅、简洁地构建具有高性能交互性的新颖图形。bokeh库用于在...上绘制字形。
阅读 4 分钟
在本Python教程中,我们将探讨如何解决错误、Python中的“syntaxerror return outside function”以及“can't assign to function call”。在Python中使用函数时,会发生函数外返回的错误。在编程方面,函数是非常...
阅读 6 分钟
Sklearn 的 model_selection 模块提供了各种函数来交叉验证我们的模型,调整估计器的超参数,或生成验证和学习曲线。以下是此模块中提供的函数列表。稍后我们将通过代码示例理解这些函数的理论和用法。Splitter Classes model_selection.GroupKFold([...
阅读 13 分钟
Tkinter是Python中用于GUI应用的标准库。Tkinter与Python提供了一种直接快速地创建GUI应用程序的方法。Tk GUI采用面向对象的方法,这使其成为一个强大的库。Tkinter广泛适用于所有操作系统。它...
阅读1分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India