Deep learning_CNN_Review:A Survey of the Recent Architectures of Deep Convolutional Neural Networks—...

本文综述了深度卷积神经网络(CNN)架构的最新进展,探讨了从基本组件到结构创新的各个方面,包括卷积层、池化层、激活函数等,并分析了CNN在自然语言处理、计算机视觉、物体检测等领域的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CNN综述文章 的翻译

[2019 CVPR] A Survey of the Recent Architectures of Deep Convolutional Neural Networks

 

翻译

综述深度卷积神经网络架构:从基本组件到结构创新

 

目录

摘要
    1、引言
    2、CNN基本组件
        2.1 卷积层
        2.2 池化层
        2.3 激活函数
        2.4 批次归一化
        2.5 Dropout
        2.6 全连接层
    3、深度CNN结构演化史
        3.1 1980年代末至1999年:CNN的起源
        3.2 2000年初:CNN停滞不前
        3.3 2006-2011年:CNN的复兴
        3.4 2012-2014年:CNN的崛起
        3.5 2015年至今:CNN的结构创新和应用迅速增长
    4、CNN中的结构创新
        4.1 基于空间利用的CNN
        4.2 基于深度的CNN
        4.3 基于多路径的CNN
        4.4 基于宽度的多连接CNNs
        4.5 基于特征图(Channel FMap)利用的CNN
        4.6 基于通道(输入)利用的CNNs
        4.7 基于注意力的CNNs
    5、CNN应用
        5.1 自然语言处理
        5.2 计算机视觉相关应用
        5.3 物体检测
        5.4 图像分类
        5.5 语音识别
    6、CNN面临的挑战
    7、未来方向
    8、结论
    致谢

摘要

深度卷积神经网络(CNN)是一种特殊类型的神经网络,在各种竞赛基准上表现出了当前最优结果。深度 CNN 的超强学习能力主要是通过使用多个非线性特征提取阶段实现的,这些阶段能够从数据中自动学习分层表征。大量可用的数据和硬件处理单元的改进加速了 CNN 的研究,最近也报道了非常有趣的深度 CNN 架构。近来,深度 CNN 架构研究比赛表明,创新的架构理念以及参数优化可以提高 CNN 在各种视觉相关任务上的性能。鉴于此,关于 CNN 设计的不同想法被提出,如使用不同的激活函数和损失函数、参数优化、正则化以及处理单元的重构。然而,在表征能力方面的主要改进是通过重构处理单元来实现的。尤其是,使用块而不是层作为结构单元的想法获得了极大关注。因此,本综述着重于最近报道的深度CNN架构中存在的内在分类法,将CNN架构中的最新创新分为七个不同类别。这七个类别分别基于空间利用、深度、多路径、宽度、特征图利用、通道提升和注意力。此外,本文还涵盖了对 CNN 组成部分的基本理解,并揭示了 CNN 目前面临的挑战及其应用。

关键词:深度学习,卷积神经网络,结构,表征能力,残差学习,CNN通道提升


1、引言

机器学习(ML)算法属于人工智能(AI)的一个特殊领域,该领域无需明确编程,通过学习数据之间的潜在关系并做出决策,从而将智能赋予计算机。自1990年代末以来,已经开发出了不同的ML算法来模拟人类的感官反应,如言语和视觉等,但是它们通常无法达到人类水准的满意度[1]-[6]。机器视觉(MV)任务具有挑战性促使产生了一类特殊的神经网络(NN),即卷积神经网络(CNN)[7]。
CNN被认为是学习图像内容的最佳技术之一,并且在图像识别、分割、检测和检索相关任务方面显示了最佳的成果[8],[9]。CNN的成功所引起的关注已超出学术界。在行业中,诸如Google,Microsoft,AT&T,NEC和Facebook之类的公司已经建立了活跃的研究小组,以探索CNN的新架构[10]。目前,大多数图像处理竞赛的领跑者都采用基于深度CNN的模型。


CNN拓扑分为多个学习阶段,由卷积层、非线性处理单元和下采样层的组合组成[11]。每层使用一组卷积核(过滤器)[12]执行多次转换。卷积运算通过将图像分成小片(类似于人眼的视网膜)来提取局部相关的特征,从而使其能够学习合适的特征。卷积核的输出被分配给非线性处理单元,这不仅有助于学习抽象表示,而且还将非线性嵌入到特征空间中。这种非线性为不同的响应生成了不同的激活模式,因此有助于学习图像中的语义差异。非线性函数的输出通常经过下采样,这有助于总结结果,并使输入对于几何变形不变[12],[13]。


CNN的结构设计灵感来自Hubel和Wiesel的工作,因此在很大程度上遵循了灵长类动物视觉皮层的基本结构[14],[15]。CNN最早在1989年通过LeCuN的工作而备受关注,该技术用于处理网格状拓扑数据(图像和时间序列数据)[7],[16]。CNN的普及很大程度上是由于其分层特征提取能力。CNN的分层组织模拟人脑中新皮质深层和分层学习过程,该过程会自动从基础数据中提取特征[17]。CNN的学习过程分期与灵长类动物的视觉皮层腹侧通路(V1-V2-V4-IT/VTC)非常相似[18]。灵长类动物的视觉皮层首先从视网膜位区域接收输入,在该区域通过外侧膝状核执行多尺度高通滤波和对比度归一化。此后,通过分类为V1,V2,V3和V4的视觉皮层的不同区域执行检测。实际上,视觉皮层的V1和V2部分类似于卷积层和下采样层,而颞下区类似于CNN的较高层,这可以推断图像[19]。在训练期间,CNN通过反向传播算法根据输入调整权重变化来学习。CNN使用反向传播算法最小化损失函数类似于基于响应的人脑学习。CNN具有提取低、中和高层特征的能力。高级特征(更抽象特征)是低级和中级特征的组合。借助自动特征提取功能,CNN减少了合成单独的特征提取器的需要[20]。因此,CNN可以通过少量处理从原始像素中学习良好的内部表示。


人们发现,通过增加CNN的深度可以增强CNN的表达能力,随后到来的是使用CNN进行图像分类和分割的热潮[21]。当处理复杂的学习问题时,深层架构比浅层架构具有优势。以分层的方式堆叠多个线性和非线性处理单元,可为深度网络提供学习不同抽象级别上复杂表示的能力。此外,硬件的进步及其带来的高计算资源也是深度CNN近期成功的主要原因之一。较深的CNN架构显示出比基于浅层和传统视觉模型性能的显着进步。除了在监督学习中使用外,深层CNN还有从大量未标记的数据中学习有用表示的潜力。CNN使用多个映射功能使它能够改进不变表示的提取,因此使其能够处理数百个类别的识别任务。最近,研究表明,可以利用转移学习(TL)的概念将不同层特征(包括低级和高级)转移到通用识别任务中[22]–[24]。CNN的重要属性是分层学习,自动特征提取,多任务处理和权重共享[25]–[27]。


CNN学习策略和结构经过了多种改进,以使CNN可扩展到大而复杂的问题。这些创新可以归类为参数优化,正则化,结构重构等。但是,据观察,在AlexNet在ImageNet数据集上获得优异性能之后,基于CNN的程序变得更为流行[21]。因此,CNN的重大创新主要在2012年以来提出,主要包括处理单元的重组和新区块的设计。类似地,Zeiler和Fergus[28]引入了特征的逐层可视化的概念,这将趋势转向了在诸如VGG[29]的深层结构中以低空间分辨率提取特征的趋势。如今,大多数新架构都是基于VGG引入的简单同质拓扑原理构建的。另一方面,Google小组提出了一个有趣的想法,即分割、变换和合并,并且相应的块称为inception块。inception块首次给出了在层内进行分支的概念,该概念允许在不同的空间尺度上提取特征[30]。2015年,ResNet[31]引入的用于深层CNN训练的跳跃连接概念广为人知,随后,此概念被大多数后续的Nets使用,例如Inception-ResNet,WideResNet,ResNext等[32]–[34]。


为了提高CNN的学习能力,不同的结构设计,例如WideResNet,Pyramidal Net,Xception等,从附加基数和增加宽度的角度探讨了多尺度转换的效果[32],34],[35]。因此,研究重点从参数优化和连接重新调整转向改进网络的架构设计(层结构)。这种转变带来了许多新的体系结构思想,例如通道提升,空间和通道智能开发以及基于注意力的信息处理等[36]–[38]。


在过去的几年中,研究人员对深层CNN进行了各种有趣的研究,详细阐述了CNN的基本组成部分及其替代方案。[39]的综述回顾了2012-2015年的著名架构及其组成部分。同样,在文献中,有一些著名的综述讨论了CNN的不同算法,并专注于CNN的应用[20],[26],[27],[40],[41]。同样,[42]中的综述讨论了基于加速技术的CNN分类。另一方面,在本综述中,我们讨论了近期和著名的CNN体系结构的内在分类。本综述中讨论的各种CNN架构可以大致分为以下七个主要类别:空间利用,深度,多路径,宽度,特征图利用,通道提升和基于注意的CNN。本文的其余部分按以下顺序组织(如图1所示):第1节总结了CNN的基础知识,其与灵长类动物的视觉皮层的相似性以及对机器视觉的贡献。第2节概述了基本CNN组件,第3节讨论了深度CNN的体系结构演变。第4节讨论了CNN结构的最新创新,并将CNN分为七个大类。第5节和第6节阐明了CNN的应用和当前的挑战,而第7节讨论了未来的工作,最后一节得出了结论。



图1 本综述结构

如今,CNN被认为是使用最广泛的ML技术,尤其是在视觉相关应用中。CNN最近在各种ML应用中显示了最佳的结果。ML系统的典型框图如图2所示。由于CNN既具有良好的特征提取能力,又具有较强的辨别能力,因此在ML系统中,它主要用于特征提取和分类。


2、CNN基本组件

典型的CNN体系结构通常包括卷积和池化层的交替,最后是一个或多个全连接层。在某些情况下,全连接层替换为全局平均池化层。除了学习的各个阶段外,还结合了不同的正则化单元,例如批次归一化和dropout,以优化CNN性能[43]。CNN组件的排列在设计新体系结构和获得增强性能方面起着基本作用。本节简要讨论了这些组件在CNN体系结构中的作用。


2.1 卷积层

卷积层由一组卷积核(每个神经元充当核)组成。这些核与图像的一小部分区域相关,称为感受野。它通过将图像划分成小块(感受野)并将其与一组特定的权重(滤波器的元素与相应的感受野元素相乘)进行卷积来工作[43]。卷积运算可以表示如下:

其中,输入图像用I_(x,y)表示,x,y表示具体位置,K_lk表示第k层的第l个卷积核。将图像分成小块有助于提取局部相关的像素值。这种局部汇总的信息也称为特征图。通过使用相同的权重卷积核在整个图像上滑动来提取图像中的不同特征集。与全连接网络相比,卷积运算的这种权重共享功能使CNN参数更有效。根据滤波器的类型和大小,填充的类型以及卷积的方向,可以进一步将卷积操作分为不同的类型[44]。另外,如果核是对称的,则卷积运算将变为相关运算[16]。


2.2 池化层

作为卷积运算输出而产生的特征图可能出现在图像的不同位置。一旦提取特征后,只要保留相对于其他特征的近似位置,其精确位置就不再重要。像卷积一样进行池化或下采样是一个有趣的局部操作。它汇总了感受野附近的相似信息,并在该局部区域内输出主要响应[45]。

公式(2)表示池化操作,其中Z_l表示第l个输出特征图,F_(x,y)^l表示第l个输入特征图,而f_p (.)定义了池化操作的类型。合并操作的使用有助于提取特征的组合,这些特征对于平移和轻微变形是不变的[13],[46]。将特征图的大小减小到不变的特征集不仅可以调节网络的复杂性,而且可以通过减少过度拟合来帮助提高通用性。CNN中使用了不同类型的池化公式,例如最大值,平均值,L2,重叠,空间金字塔合并等[47]-[49]。


2.3 激活函数

激活功能起决策功能,有助于学习复杂的模式。选择适当的激活功能可以加快学习过程。等式(3)定义了卷积特征图的激活函数。

在上式中,F_l^k是卷积运算的输出,分配给激活函数;f_A (.)会添加非线性并返回第k层的转换输出T_l^k。在文献中,不同的激活函数,例如sigmoid,tanh,maxout,ReLU和ReLU的变体,例如leaky ReLU,ELU和PReLU[39],[48],[50],[51]用于引入特征的非线性组合。然而,ReLU及其变体优于其他激活函数,因为它有助于克服梯度消失问题[52],[53]。

图2:典型的ML系统的基本布局。 在与ML相关的任务中,首先对数据进行预处理,然后将其分配给分类系统。 典型的ML问题包括以下三个步骤:阶段1与数据收集和生成相关,阶段2执行预处理和特征选择,而阶段3基于模型选择,参数调整和分析。 CNN具有良好的特征提取能力和较强的判别能力,因此在ML系统中; 它可以用于特征提取和分类。


2.4 批次归一化

批次归一化用于解决与特征图中内部协方差平移有关的问题。内部协方差偏移量随隐藏单位值分布变化,这会降低收敛速度(通过将学习率强制为小值),并对参数初始化要求高。等式(4)中示出了对变换后的特征图T_l^k的批次归一化。

在等式(4)中,N_lk表示归一化特征图,F_lk是输入特征图,μ_B和σ_B2分别表示小批次特征图的均值和方差。批次归一化通过将特征图值设为零均值和单位方差来统一其分布[54]。此外,它可以平滑梯度流并充当调节因素,从而有助于改善网络的泛化。


2.5 Dropout

Dropout引入了网络内的正则化,最终通过以一定概率随机跳过某些单元或连接来最终提高泛化性。在神经网络中,有时学习某个非线性关系的多个连接会相互适应,这会导致过拟合[55]。某些连接或单元的这种随机丢弃会产生几种稀疏的网络体系结构,最后选择一个权重较小的代表性网络。然后,将这种选择的架构视为所有提议网络的近似[56]。


2.6 全连接层

全连接层通常在网络末端用于分类任务。与池化和卷积不同,它是全局操作。它从前一层获取输入,并全局分析所有前一层的输出[57]。这将选定特征进行非线性组合,用于数据分类 [58]。

图3 深度CNN演化史


3、深度CNN结构演化史

如今,CNN被认为是受到生物学启发的AI技术中使用最广泛的算法。CNN的历史始于Hubel和Wiesel(1959,1962)进行的神经生物学实验[14],[59]。他们的工作为许多认知模型提供了平台,后来几乎所有这些模型都被CNN取代。几十年来,人们为提高CNN的性能做出了不同的努力。图3中用图形表示了这一历史。这些改进可以分为五个不同的时代,下面将进行讨论。


3.1 1980年代末至1999年:CNN的起源

自1980年代后期以来,CNN已应用于视觉任务。1989年,LeCuN等人提出了第一个名为ConvNet的多层CNN,其起源于福岛的Neocognitron[60],[61]。LeCuN提出了ConvNet的监督训练,与它的前身Neocognitron所采用的无监督强化学习方案相比,使用了反向传播算法[7],[62]。因此,LeCuN的工作为现代2D CNN奠定了基础。监督训练 使CNN具有从原始输入中自动学习特征的能力,而无需设计传统ML方法使用的手工特征。这个ConvNet成功解决了手写数字和邮政编码识别相关问题 [63]。1998年, LeCuN改进了ConvNet,并用于文档识别程序中的字符分类[64]。修改后的架构被命名为LeNet-5,它是对最初的CNN的改进,因为它可以从原始像素中以分层的方式提取特征表示[65]。LeNet-5依赖更少参数,同时考虑了图像空间拓扑,使CNN能够识别图像的旋转变体[65]。由于CNN在光学字符识别方面的良好性能,其分别于1993年和1996年开始在ATM和银行中商业化使用。尽管LeNet-5实现了许多里程碑式成功,但是与之相关的主要问题是,其识别能力并未扩展到除手识别之外的其他分类任务。


3.2 2000年初:CNN停滞不前

在1990年代末和2000年代初,人们对NN的兴趣减少,很少探索CNN在不同应用中的作用,例如物体检测,视频监视等。由于在性能上的微不足道的改进(以高计算时间为代价),CNN在ML相关任务中变得沉寂。当时,其他统计方法,尤其是SVM比CNN更为流行[66]-[68] ,由于其相对较高的性能。在2000年初,普遍认为用于CNN训练的反向传播算法无法有效收敛到最佳点,因此与手工制作的特征相比,无法以监督的方式学习有用的特征[69]。同时,任有研究人员继续研究CNN,试图优化其性能。Simard等人在2003年改进了CNN架构,并在手写体基准数据集MNIST[64],[68]上显示了与SVM相比更好的结果 [70]-[72]。通过将其在光学字符识别(OCR)中的应用扩展到其他的字符识别[72]-[74],如部署在视频会议中用于面部检测的图像传感器中以及对街头犯罪的管制等,这种性能的改进加快CNN的研究速度。同样,基于CNN的系统已在超市跟踪客户[75]-[77]方面实现了工业化。此外,研究人员还探索了CNN在医学图像分割、异常检测和机器人视觉等其他应用中的潜力[78]-[80]。


3.3 2006-2011年:CNN的复兴

深度神经网络通常具有复杂的体系结构和时间密集型训练阶段,有时跨越数周甚至数月。在2000年初,只有很少的技术可以训练深度网络。此外,人们认为CNN无法解决复杂的问题。这些挑战使人们停止在ML相关任务中使用CNN。


为了解决这些问题,2006年出现了许多有趣的方法来克服在训练深度CNN和学习不变特征时遇到的困难。Hinton在2006年针对深度架构提出了贪婪逐层预训练方法,从而复兴并恢复了深度学习的重要性[81],[82]。深度学习的复兴 [84]^是使深度CNN成为众人关注的因素之一。黄等(2006)使用最大池化而不是下采样,通过学习不变特征显示出良好的结果[46],[85]。


在2006年末,研究人员开始使用图形处理单元(GPU)[86],[87]来加速深度NN和CNN体系结构的训练[88],[89]。NVIDIA在2007年推出了CUDA编程平台[90],[91],该平台可以更大程度地利用GPU的并行处理功能[92]。从本质上讲,使用GPU进行神经网络训练[88],[93]和其他硬件改进是CNN研究得以复兴的主要因素。2010年,李飞飞在斯坦福大学的小组建立了一个名为ImageNet的大型图像数据库,其中包含数百万个带有标签的图像[94]。基于该数据库举办年度ImageNet大规模视觉识别挑战赛(ILSVRC),对各种模型的性能进行了评估和评分[95]。ILSVRC和NIPS在加强研究和增加CNN的使用方面一直非常活跃,从而使其流行起来。这是改善CNN性能和增加其使用的转折点。


3.4 2012-2014年:CNN的崛起

可获得的大规模训练数据,硬件改进和计算资源有助于CNN算法的改进。在此期间,可以发现CNN在目标检测,图像分类和分割相关任务中的复兴[9],[96]v。然而,CNN在图像分类任务中的成功不仅归因于上述因素的结果,而且很大程度上归功于架构修改、参数优化、管理单元的合并以及网络内连接的重新制定和调整[39],[ 42],[97]^。


CNN性能的主要突破体现在AlexNet[21]。AlexNet赢得了2012-ILSVRC竞赛,这是图像检测和分类中最困难的挑战之一。AlexNet通过利用深度(合并了多个转换层级)提高了性能,并在CNN中引入了正则化。与2012-ILSVRC中传统ML技术相比,AlexNet[21]的表现堪称典范(AlexNet将错误率从25.8降低至16.4),这表明2006年前CNN性能饱和的主要原因是由于没有足够的训练数据和计算资源。综上所述,在2006年之前,这些资源不足使得在不降低性能的情况下很难训练高容量的CNN [98]。


随着CNN在计算机视觉(CV)领域中越来越普遍,人们进行了许多尝试以降低计算成本来提高CNN的性能。因此,每种新架构都试图克服先前提出的架构与新结构重新组合的缺点。在2013年和2014年,研究人员主要集中在参数优化上,以在计算复杂性略有增加的情况下,在各种应用中加速CNN性能。2013年,Zeiler和Fergus[28]定义了一种机制,可以可视化每个CNN层学习的过滤器。可视化方法用于通过减小过滤器的尺寸来改进特征提取阶段。同样,牛津大学小组提出的VGG架构[29]在2014年ILSVRC竞赛中获得亚军,与AlexNet相比,其接感受野要小得多,但体积却增加了。在VGG中,特征图体积在每一层加倍,深度从9层增加到16层。同年,赢得2014-ILSVRC竞赛的GoogleNet[99]不仅致力于通过更改层设计来降低计算成本,而且根据深度扩展了宽度,以改善CNN性能。GoogleNet引入了分割、变换和合并块的概念,其中合并了多尺度和多层转换信息以获取局部和全局信息[33],[99],[100]。使用多层转换信息有助于CNN处理不同层级的图像细节。在2012-14年度,CNN学习能力的提高主要是通过增加CNN的深度和参数优化策略实现。这表明CNN的深度有助于改善分类器的性能。


3.5 2015年至今:CNN的结构创新和应用迅速增长

通常来说,CNN的性能重大改善出现在2015-2019年期间。CNN的研究仍在进行中,并且有很大的改进潜力。CNN的表示能力取决于其深度,从某种意义上说,它可以通过定义从简单到复杂的各种级别特征来帮助学习复杂的问题。通过将复杂的问题分成较小的模块,多层转换使学习变得容易。但是,深度架构所面临的主要挑战是负面学习的问题,这是由于网络较低层的梯度减小而发生的。为了解决这个问题,不同的研究小组致力于层连接的重新调整和新模块的设计。2015年初,Srivastava等人使用跨通道连接和信息门控机制的概念来解决梯度消失问题并提高网络表示能力[101]-[103]。这个想法在2015年末成名,并提出了类似的概念:残差块或跳跃连接[31]。残差块是跨通道连接的一种变体,它通过规范跨块的信息流来平滑学习[104]-[106]。这个想法在ResNet体系结构中用于训练150层深度网络[31]。跨通道连接的思想被Deluge,DenseNet等进一步扩展到了多层连接,以改善表示性[107],[108]。


在2016年,研究人员还结合深度探索了网络的宽度,以改进特征学习[34],[35]。除此之外,没有新的突出的体系结构修改,而是使用已经提出的体系结构的混合来提高深层CNN性能[33],[104]-[106],[109],[110]。这一事实使人感觉到,对有效调节CNN性能,相比适当组装网络单元,可能还有其他更为重要因素。对此,Hu等(2017)确定网络表示在深度CNN的学习中发挥作用[111]。Hu等人介绍了特征图开发的思想,并指出少量信息和领域无关的特征可能会在更大程度上影响网络的性能。他利用了上述想法,并提出了名为“挤压和激发网络(SE-Network)[111]”的新架构。它通过设计专门的SE块来利用特征图(在文献中通常称为通道)信息。该块根据每个特征图在类识别中的作用为每个特征图分配权重。不同的研究人员对该想法进行了进一步的研究,他们通过利用空间和特征图(通道)信息将注意力转移到重要区域[37],[38],[112]。在2018年,Khan等人[36]引入了一种新的通道提升思路。用通道提升表示进行网络训练的动机是使用丰富的表示。通过学习各种特征以及通过TL概念利用已经学习的特征,该想法有效地提高了CNN的性能。


从2012年至今,已经出现许多CNN架构的改进。关于CNN的架构进步,最近的研究重点是设计新的块,这些块可以通过利用特征图和空间信息或通过添加人工通道来增强网络表示。


4、CNN中的结构创新

从1989年至今,CNN架构已进行了不同的改进。这些改进可以归类为参数优化、正则化、结构重构等。但是,可以观察到,CNN性能改进的主要动力来自处理单元的重组和新模块的设计。CNN架构中的大多数创新都与深度和空间利用有关。根据架构修改的类型,CNN可以大致分为以下七个类别:空间利用,深度,多路径,宽度,特征图利用,通道提升和基于注意力的CNN。图4所示的Deep CNN的分类法显示了七个不同的类,而它们的摘要在表1中。


图4 深度CNN结构分类

 

表1 不同类别最新体系结构性能比较,报告所有架构的Top 5个错误率




4.1 基于空间利用的CNN

CNN具有大量参数和超参数,例如权重、偏置、处理单元ÿ

Deep Convolutional Neural Networks (CNNs) are a special type of Neural Networks, which have shown state-of-the-art results on various competitive benchmarks. The powerful learning ability of deep CNN is largely achieved with the use of multiple feature extraction stages that can automatically learn hierarchical representations from the data. Availability of a large amount of data and improvements in the hardware processing units have accelerated the research in CNNs, and recently very interesting deep CNN architectures are reported. The recent race in developing deep CNN architectures has shown that the innovative architectural ideas, as well as parameter optimization, can improve the CNN performance on various vision-related tasks. In this regard, different ideas in the CNN design have been explored such as the use of different activation and loss functions, parameter optimization, regularization, and restructuring of the processing units. However, the major improvement in representational capacity of the deep CNN is achieved by the restructuring of the processing units. Especially, the idea of using a block as a structural unit instead of a layer is receiving substantial attention. This survey thus focuses on the intrinsic taxonomy present in the recently reported deep CNN architectures and consequently, classifies the recent innovations in CNN architectures into seven different categories. These seven categories are based on spatial exploitation, depth, multi-path, width, feature map exploitation, channel boosting, and attention. Additionally, it covers the elementary understanding of the CNN components and sheds light on the current challenges and applications of CNNs.
<think>好的,用户现在遇到了两个问题:一个是torchvision的NameError,提示'torchvision is not defined',另一个是版本显示问题以及CUDA兼容性问题。我需要结合之前的对话和用户提供的引用来找到解决方案。 首先,用户提到在运行代码时出现NameError,说明Python环境中torchvision没有被正确导入。可能的原因有:torchvision未安装,或者安装的版本与PyTorch不兼容,或者安装方式有问题。需要检查是否安装了torchvision,以及是否正确导入。 其次,版本显示问题可能与CUDA兼容性有关,用户之前提到过CUDA版本不一致的问题,比如runtime和driver API版本不同,或者安装的torchvision版本不支持当前CUDA环境。根据引用[3]和[4],用户可能混淆了CUDA的不同版本,需要确保PyTorch、torchvision和CUDA版本一致。 接下来,结合用户提供的引用,引用[2]提到了正确安装顺序,先安装CUDA工具包,再安装PyTorch和torchvision,同时可能需要安装cuda-nvcc。引用[1]提到在编译torchvision时指定正确的架构参数,比如计算能力,以确保兼容性。引用[5]指出可以通过设置CMAKE参数来指定架构和CUDA路径,这可能帮助解决编译问题。 用户之前在解决NMS的CUDA问题时已经涉及版本兼容性,现在的问题可能类似。需要指导用户检查torchvision是否安装,版本是否匹配,以及CUDA环境是否正确配置。同时,NameError可能由于未正确安装或导入导致,需要验证安装步骤。 可能的解决步骤包括:确认torchvision已安装,检查导入语句是否正确,验证PyTorch和torchvision版本是否兼容,确保CUDA环境正确,并重新安装或指定版本。另外,用户可能需要通过conda或pip指定正确的版本,并注意CUDA工具包的版本匹配。 需要提醒用户检查他们的安装命令,是否遗漏了torchvision,或者是否在虚拟环境中未激活。同时,如果用户手动编译torchvision,可能需要设置正确的架构参数,如引用[1]和[5]提到的,避免兼容性问题导致的问题。 最后,用户可能需要重新安装整个PyTorch和torchvision套件,确保版本对应,并且CUDA环境变量正确设置。如果问题依旧,可能需要检查环境变量PATH和LD_LIBRARY_PATH是否包含CUDA的路径,如引用[2]中的安装步骤所示。</think>针对`torchvision`的`NameError`和版本兼容性问题,结合引用内容和CUDA环境配置,以下是系统化解决方案: --- ### 1. **验证torchvision安装状态** - **核心问题**:`NameError: name 'torchvision' is not defined`表明模块未正确安装或导入[^1]。 - **诊断步骤**: ```python # 检查是否安装torchvision import torchvision print("torchvision版本:", torchvision.__version__) ``` - 若出现`ModuleNotFoundError`,说明未安装`torchvision`; - 若成功但版本不匹配,需检查CUDA兼容性。 --- ### 2. **修复安装问题** #### 方案一:通过官方渠道安装匹配版本(推荐) 根据引用[2]的安装顺序优化: ```bash # 创建新环境(避免依赖冲突) conda create -n torch_env python=3.10.13 conda activate torch_env # 安装CUDA Toolkit和nvcc(引用[2][4]) conda install cudatoolkit=11.8 -c nvidia conda install -c "nvidia/label/cuda-11.8.0" cuda-nvcc # 安装PyTorch全家桶(引用[2]) pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu118 ``` #### 方案二:手动编译(适用于特殊架构需求) 若需支持特定GPU架构(如RTX 4060TI的`compute_89`),参考引用[1][5]: ```bash # 下载torchvision源码 git clone https://github.com/pytorch/vision.git cd vision # 指定计算能力(兼容老显卡) export CMAKE_CUDA_ARCHITECTURES="89;90" # 同时支持8.9和9.0架构 export CUDA_TOOLKIT_ROOT_DIR="/usr/local/cuda-11.8" # 引用[5] # 编译安装 python setup.py install ``` --- ### 3. **验证CUDA兼容性** - **检查版本一致性**: ```python import torch, torchvision print("PyTorch版本:", torch.__version__) # 应输出2.1.1+cu118 print("torchvision版本:", torchvision.__version__) # 应输出0.16.1+cu118 print("CUDA是否可用:", torch.cuda.is_available()) # 必须为True ``` - **解决CUDA版本冲突**: - 若`nvidia-smi`显示的驱动版本(如12.2)与`nvcc -V`的运行时版本(如11.8)不一致,属正常现象(引用[3][4]); - 关键确保PyTorch编译版本(`cu118`)与安装的CUDA Toolkit版本(11.8)一致。 --- ### 4. **修复导入错误** - **正确导入方式**: ```python # 避免直接使用未导入的模块 from torchvision import models, ops # 明确导入子模块 # 示例:使用ResNet model = models.resnet50(weights="IMAGENET1K_V2") ``` - **常见错误修正**: - 错误代码:`torchvision.models.resnet50()` - 正确代码:`from torchvision import models; models.resnet50()` --- ### 5. **环境变量修复** 若问题仍未解决,检查CUDA路径配置(引用[2][4]): ```bash # 添加CUDA路径到环境变量(Linux/WSL示例) export PATH="/usr/local/cuda-11.8/bin:$PATH" export LD_LIBRARY_PATH="/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH" # Windows通过系统属性设置 # 添加C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin到PATH ``` --- ### 引用说明 - 版本匹配问题需严格遵循PyTorch官方矩阵(引用[2]); - CUDA架构兼容性需通过编译参数调整(引用[1][5]); - CUDA驱动与运行时版本差异属正常设计(引用[3][4])。 --- ### 相关问题 1. 如何查看已安装PyTorch的CUDA编译版本? 2. 不同版本的CUDA Toolkit能否共存? 3. 如何为多GPU架构编译自定义CUDA算子?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值