【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
目录
1. 前言
2. AlexNet
3. VGGNet
4. ResNet
5. SqueezeNet
6. 总结
1. 前言
进入这篇文章之前,想必大家已经阅读过前面的系列文章:
【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)-CSDN博客
【通俗易懂说模型】非线性回归和逻辑回归(附神经网络图详细解释)-CSDN博客
【通俗易懂说模型】反向传播(附多元分类与Softmax函数)-CSDN博客
【通俗易懂说模型】卷积神经网络(呕心沥血版)-CSDN博客
通过前面的文章, 猫猫相信友友们对深度学习、机器学习一定有了一个较为全面且细致的理解,接下来的本篇文章,将基于前面提到的回归、反向传播、卷积神经网络等知识,从深度学习在图像识别领域发展的历史脉络出发,带你遨游几大经典模型。从模型学习深度学习中的奇思妙想,感悟前辈伟人的思想精华🥰~~
2. AlexNet
AlexNet是2012年ImageNet竞赛中获得冠军的卷积神经网络模型,其准确率领先第二名ISI模型10%。由于当时GPU计算速度有限,所以采用了两台GPU服务器进行计算。如下图所示,该模型共分为8层,其中有5个卷积层(特征层),3个全连接层。下面我们对每一层卷积层进行分析。

卷积层:也可以认为是特征层,严格意义上包括卷积层和激活层,用于提取特征。
全连接层:对特征(局部特征、全局特征)全连接,从而学习组织方式, 最终用于分类等。
一、第一层卷积和池化过程。如下图所示,在第一层卷积层中,我们采用11×11的过滤器对尺寸为224×224的图片进行卷积,产生96张55×55的特征图(由于是彩色图片,所以第三个维度是3,下面对此不再进行特别说明)。然后使用ReLU函数,使特征图内的数值保持在合理的范围内。接着使用3×3的核进行池化,最终生成96张27×27的特征图。

输出图片大小和卷积的关系:
二、第二层卷积和池化过程。如下图所示,在第二层卷积层中,采用5x5的过滤器进行卷积,产生256张27x27的特征图。再经过ReLU函数后,使用3x3的核进行池化,得到256张13x13的特征图。

三个要点:
- 卷积输出通道数等于卷积核数量。例如上图卷积核数量为256。
- 卷积核通道数等于输入图片通道数。例如上图卷积核通道数为96,卷积核大小为5*5。
- 越上层提取的成分越抽象。每一次卷积会利用到前面所有的底层知识组合成上层知识。
三、第三层卷积过程。如下图所示,在第三层卷积层中没有池化,采用3x3的过滤器进行卷积,产生384张13x13的特征图,然后经过ReLU函数(特征提取层中池化不是必须的)。

四、第四层卷积过程。如下图所示,在第四层卷积层中也没有池化,采用3×3的过滤器进行卷积,产生384张13x13的特征图,然后经过ReLU函数。

五、第五层卷积过程。如下图所示,在第五层卷积层中,采用3×3的过滤器进行卷积,产生256张13x13的特征图,经过ReLU函数,然后使用3x3的核进行池化,产生256张6x6的特征图。

六、三层全连接层。在第六层中,我们将256张6×6的特征图全连接到2048个神经元节点上,经过ReLU激活层,再进行Dropout。Dropout是前向传播过程中随机丢弃的一些神经网络层节点,这种方法可以有效避免模型过拟合。在第七层中,将2048个神经元节点全连接到2048个神经元上,经过ReLU激活层,进行Dropout。在第八层中,将2048个神经元全连接到1000个神经元输出节点,因为我们进行的是1000个分类的任务。

3. VGGNet
VGGNet是牛津大学计算机视觉组和GoogleDeepMind公司研究员一起研发的深度卷积神经网络在2014年的ImageNetILSVRC中取得了亚军。VGGNet探索了卷积神经网络的深度和性能之间的关系,通过多次堆叠3×3的过滤器和2×2的最大池化层,使得网络层数总体变多,达到了16层~19层。与只有8层的AlexNet相比,VGGNet具有参数的神经网络层数翻了一倍多。
VGGNet采用了多个3x3的卷积核来代替AlexNet中11x11和5x5的卷积核,这样做的目的是减少参数的数量。具体是如何做到的呢?如下图所示,两个3×3的卷积核效果相当于一个5x5的卷积
核效果。倘若被卷积的特征图数为N,卷积之后得到的特征图数为M,则使用两次3×3卷积核的总参数为18NM,使用一次5×5卷积核的总参数为25NM。类似地,3个3×3的卷积核相当于1个7x7的卷积核,而1个7×7的卷积核的总参数为49NM,而3个3×3卷积核的总参数量仅为27NM。

相同硬件条件下,训练所能接受的参数总量是有限的:
- VGGNet利用将5*5分解为两个3*3从而减少了参数量,可以增加更多网络结构。
- 同时一层5*5变为两层3*3让整体网络结构变得更深,探索了卷积神经网络的深度和性能之间的关系。
如下图所示,VGGNet有5段卷积,每一段卷积由2~4个3x3的卷积核与1个池化层构成,取
大小为3x3的卷积是因为3x3可以同时获取上下左右像素信息的最小卷积核。所有卷积的步长均为1,padding也为1。这种利用多个小卷积核代替一个大卷积核的方式有两个好处:一是减少了训练的参数量,减少资源占用率;二是增加了非线性变换的次数,提高网络对特征的学习能力。该网络也同时证明:在一定条件下,网络结构越深,网络的学习能力就越好,分类能力就越强。
使用3*3代替5*5卷积核的优点:
- 减少参数,减少运算量达到同样效果。
- 两个3*3代替5*5网络结构更深,增加了非线性变换的次数,更有利于分类。

4. ResNet
我们刚才在VGGNet里受到了启发,觉得网络结构越深越好,但是事实上却不是那么容易。如下图所示,20层的卷积神经网络无论是在训练集还是在测试集,其误差都比56层的要小。也就是说,如果在不进行任何特殊处理的情况下增加层数,较深的网络会有更大的误差。其中的原因之一是网络越深,梯度消失的现象就越来越明显,网络的训练效果也不会很好,我们把该问题称为“退化”。但是现在,浅层的网络又无法明显提升网络的识别效果,所以要解决的问题就是怎样在加深网络的情况下解决“退化”的问题。
问题:
- 网络结构越深整体效果越好。
- 但是网络深到一定程度后因为梯度消失的原因导致训练效果下降,出现“退化”现象。

对梯度消失的理解:
- 假设一个神经网络有多个线性层,每个层的权重都是一个较大的正数。当输入数据经过这些层计算时,每个层的输出都会变得越来越大,导致接下来的层需要处理的数值也越来越大。这时候,在反向传播的时候,计算梯度时,因为涉及到乘积,这些大的数值相乘会导致梯度变得非常小,甚至趋近于零。这就是梯度消失的原因。
🌰举个例子,假设有一个三层神经网络,每层的权重都是2。假设输入是1,那么经过第一层后变成2,经过第二层变成4,经过第三层变成8。在反向传播的时候,梯度会按照链式法则计算,每次乘以权重。所以,梯度会是1乘以2,乘以2,再乘以2,也就是8。如果权重更大,比如3,那么梯度会是1×3×3×3=27,这样梯度会变得越来越大,而不是变小。但是,如果权重都是0.5,那么前向传播时数值变小,反向传播时梯度会是1×0.5×0.5×0.5=0.125,也就是梯度变小,这时候梯度消失。所以,当权重的绝对值小于1时,梯度会逐渐变小,导致梯度消失;而如果权重的绝对值大于1,梯度会逐渐变大,导致梯度爆炸。
梯度消失会导致每次参数更新的很少,结果就是训练始终无法收敛,同时遗忘模型前面的训练块,模型效果很差。
梯度爆炸会导致每次参数更新都很大,结果就是训练结果波动性强,同样无法收敛,模型效果差。
针对这个问题,微软研究团队提出了ResNet模型,成功地解决了上述难题,并获得了2015年的ImageNet比赛的冠军。ResNet模型引入残差网络结构,可以成功地训练层数高达152层的神经网络。该残差网络结构如下图所示,在两层或两层以上的节点两端添加了一条“捷径”,这样一来,原来的输出F(x)就变成了F(x)+x。就是这一点点的小改动,我们就可以直接使用传统的反向传播训练法对非常深的神经网络进行训练,并且收敛速度快,误差小。

下图给我们展示了2015年时赢得ImageNet比赛冠军的ResNet模型,我们可以看到该网络的特别之处在于每隔两层就设置了一个“捷径”。

为何ResNet的这种连接方式可以“解决”之前的“退化”问题呢?我们先来观察一下下图,可以发现,左边我们熟悉的残差网络模块可以看成右边的串联关系。可以把右边的图联想为串联的电路,把数据经过的神经网络层看成是电阻元件。我们知道在串联电路中,电阻越小的支路,电流就越大,对总输出电流的贡献比例就越大。再回到残差网络模块,梯度进行反向传播时,会因为所遇层数的增多而不断变小。如果我们把梯度传播时遇到的神经网络层看成是一种“阻力”的话,那么这些“捷径”就会因为“阻力”小而把梯度顺利地反传回来,不至于“消失”,如此一来,“退化”的问题就被顺利解决了。有了残差网络模块,我们可以疯狂地叠加神经网络层,甚至到达1000层以上。

5. SqueezeNet
在很多实际的运用中,我们希望神经网络模型在尽量小的情况下保持足够的精度。例如,在自动驾驶汽车这一应用中,我们并不希望把入上传到服务器进行识别,如果这么做会产生延迟,很可能发生车祸。这时候,我们希望自动驾驶汽车能够从网络上下载神经网络模型,直接在本地进行实时的识别。除此之外,移动手机上的人工智能产品也同样希望直接在本地进行识别,避免网络传输所带来的长时间等待。我们以前一直在关注如何通过提高模型的复杂度来提高模型识别的正确率。在相同的正确率下更小的神经网络模型有如下3个优势:
- 在分布式的训练中,模型越小,各计算节点的通信需求就越小,从而训练得更快:
- 模型越小,从云端下载的数据量就越小;
- 更小的神经网络模型更适合在内存和硬盘资源有限的设备上部署。
为了解决模型太大的问题,UCBerkeley和Stanford研究人员提出了SqueezeNet模型,其识别精度与AlexNet相同,但模型大小却只有AlexNet的1/50,如果再加上其他的模型压缩技术,可以缩小至0.5MB,即仅为AlexNet模型大小的1/510。SqueezeNet采用以下3种策略来优化模型:
- 使用1×1卷积来代替3x3卷积,减少模型参数(1*1卷积块本质上可以认为仅仅在通道层面卷积了一下,并没有考虑局部特征的联系);
- 减少输入的通道数,减少模型参数;
- 延后池化,保留更多信息,提高准确率。(本身参数量很少就不需要池化来减少特征值了)。
假如一张图片如下:
可以认为其仅仅展示了各自的位置信息。
卷积后如下:
可以认为除了位置信息还包含彼此的联系信息,因此卷积核越少处理后包含的联系信息更少,因此计算量更小。
具体来说,SqueezeNet设计了一个叫Fire Module的模块,其结构如下图所示,该模块分为压缩和扩展两个部分。首先压缩部分是由若干1×1的卷积核构成,图中示例使用了3个卷积核。而扩展部分包含1×1的卷积核和3×3的卷积核,这里使用了4个1×1卷积核及4个3×3卷积核。假设输入的通道数为5,在压缩部分,我们使用3个1×1卷积核,将输入的通道数压缩为3,然后分别经过4个1×1和4个3x3卷积核后,将输出进行合并,最后得到8张特征图。

随着卷积神经网络的发展,我们经常搭配一些固定的卷积核,构造成一个微结构进行使用,从而方便网络设计。SqueezeNet的FireModule也是一个微结构,如下图所示。在Fire Module这个微结构中,分为压缩和扩展两部分卷积核,压缩模块采用了3个1x1卷积核,因此S1x1=3;扩展模块中我们采用了4个1×1卷积核和4个3x3卷积核,因此e1x1=4,e3x3=4。在每个卷积之后,都经过了非线性函数ReLU的处理,我们要求S1x1<e1x1+e3x3以限制输入通道数。

整个SqueezeNet结构如下图所示,左边是原始的SqueezeNet,我们分别在conv1、fire4、fire8、conv10之后加池化层,这样做推迟了池化而保留了更多的信息,提高识别精度。中间和右边借鉴了ResNet的做法,在各层之间加人了许多“捷径”,化解“退化”问题,提高识别正确率。在最后的池化层里,使用全局平均池化(GlobalAveragePooling,GAP)来代替以往的全连接层,节省了大量参数。

全局平均池化是直接利用特征图来计算对应分类的概率相关值。如下图所示,以上面的任务为例,我们需要对1000个类进行分类。那么在最后一层卷积层的输出部分,我们设置输出为1000张特征图,然后对每一张特征图求平均值。接着将1000个平均值输入softmax函数,得到1000个类的概率。

全局平均池化:
- 池化代表减少参数量。从特征图最后降维一个概率自然是池化
- 全局代表直接求1000个类的概率。
- 平均是指这个概率是特征图的概率的平均值。
- 全剧平均池化可用来代替全连接层求解分类问题
怎么理解全局平均池化分类和全连接后分类?
1、全局平均池化就是直接拿特征图去分类,如下图:
将一个狗狗分为好几块,然后得到的就是一个个特征图。全局平均池化就是直接看后面乱序的特征图去判断是不是狗
2、全连接后分类就是得到特征图后,通过全连接拼凑出狗狗的图片,如下图:
然后再用这个完整有序的图片去判断是不是狗
6. 总结
【如果想学习更多深度学习文章,可以订阅一下热门专栏】
深度学习_十二月的猫的博客-CSDN博客
PyTorch实战深度学习80例_十二月的猫的博客-CSDN博客
零基础入门PyTorch框架_十二月的猫的博客-CSDN博客
如果想要学习更多pyTorch/python编程的知识,大家可以点个关注并订阅,持续学习、天天进步
你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~

相关文章:
【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...
deepseek的CoT优势、两阶段训练的有效性学习笔记
文章目录 1 DeepSeek的CoT思维链的优势1.2 open-r1的CoT训练数据1.3 ReAct任务与CoT任务适用场景 2 AI推理方向:deepseek与deepmind的两条路线的差异2.1 PRM与ORM的两大学派分支的差异2.2 DeepSeek-R1的两阶段训练概述 1 DeepSeek的CoT思维链的优势 DeepSeek跟之前…...
MobaXterm的图形化界面支持:原理与分辨率问题解决
1. 概述 MobaXterm 是一款功能强大的远程访问工具,支持SSH、RDP、X11、VNC等多种协议,并内置了强大的图形界面支持,让用户能够在远程操作Linux/Unix系统时,享受到类似本地桌面的流畅体验。 与传统的SSH客户端不同,Mo…...
算法很美笔记(Java)——树
性质 树 上面的性质因为两个结点由一条边连成 结点数目越多,算法复杂度越高 二叉树 结构 层次遍历 利用队列,弹一个,加N个(队列里弹出一个元素,就把这个元素的所有孩子加进去) 具体来说:指…...
百度 API 教程 001:显示地图并添加控件
目录 01、基本使用 前期准备 显示地图 开启鼠标滚轮缩放地图 02、添加地图控件 添加标准地图控件 添加多个控件 网址:地图 JS API | 百度地图API SDK 01、基本使用 前期准备 注册百度账号 申请成为开发者 获取密钥:控制台 | 百度地图开放平台…...
OSCP - Other Machines - Loly
主要知识点 路径枚举内核漏洞提权 具体步骤 继续nmap一下先 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-01 07:12 CST Nmap scan report for loly.lc (172.16.33.25) Host is up (0.022s latency). Not shown: 65534 closed tcp ports (conn-refused) PORT …...
使用瑞芯微RK3588的NPU进行模型转换和推理
使用边缘设备进行算法落地时,通常要考虑模型推理速度,NVIDA系列平台可以使用TensorRT和CUDA加速,瑞芯微RK3588的板子上都是Arm的手机GPU,虽然没有类似CUDA的加速计算方式,但是提供了NPU进行加速推理,本文说…...
我用AI做数据分析之四种堆叠聚合模型的比较
我用AI做数据分析之四种堆叠聚合模型的比较 这里AI数据分析不仅仅是指AI生成代码的能力,我想是测试AI数据分析方面的四个能力,理解人类指令的能力、撰写代码的能力、执行代码的能力和解释结果的能力。如果这四个能力都达到了相当的水准,才可…...
AcWing 5166:对称山脉 ← 动态规划
【题目来源】 https://www.luogu.com.cn/problem/P9325 https://www.acwing.com/problem/content/5169/ 【题目描述】 有 N 座山排成一排,从左到右依次编号为 1∼N。 其中,第 i 座山的高度为 hi。 对于一段连续的山脉,我们使用如下方法定义该…...
DeepSeek 从入门到精通学习指南,2025清华大学《DeepSeek从入门到精通》正式发布104页pdf版超全解析
DeepSeek 是一款强大的 AI 搜索引擎,广泛应用于企业级数据检索和分析。无论您是初学者还是有经验的用户,掌握 DeepSeek 的使用都能为您的工作带来极大的便利。本文将从入门到精通,详细介绍如何学习和使用 DeepSeek。 链接: https://pan.baid…...
KEPServerEX 的接口类型与连接方式的详细说明
目录 一、KEPServerEX 核心架构 二、KEPServerEX 支持的接口类型 三、KEPServerEX 支持的连接类型 1. 通用工业协议 2. 品牌专属协议 3. 行业专用协议 4. 数据库与文件接口 四、配置示例 1. 接口配置(以OPC UA为例) 2. 连接配置(以…...
HTML之JavaScript使用JSON
HTML之JavaScript使用JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON是JavaScript对象的字符串表示法,它使用文本表示一个js对象的信息,可以将json字符串转换…...
云原生AI Agent应用安全防护方案最佳实践(上)
当下,AI Agent代理是一种全新的构建动态和复杂业务场景工作流的方式,利用大语言模型(LLM)作为推理引擎。这些Agent代理应用能够将复杂的自然语言查询任务分解为多个可执行步骤,并结合迭代反馈循环和自省机制࿰…...
物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统
随着物联网技术的飞速发展,物联网软件开发与应用方向成为了众多开发者关注的焦点。那么,如何在这个领域中脱颖而出呢?本文将为你提供一份详细的学习指南,帮助你从零开始,逐步掌握物联网软件开发与应用的核心技能。 一…...
计算机网络-八股-学习摘要
一:HTTP的基本概念 全称: 超文本传输协议 从三个方面介绍HTTP协议 1,超文本:我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等&am…...
【天梯赛】L2-001紧急救援(用迪杰斯特拉找出权重和最小的最短路径)
解题反思 尝试DFS:开始使用DFS来遍历求解,但 DFS 存在大量重复计算,像同一节点会被多次访问并重复计算路径信息,导致时间复杂度高,部分测试点未通过 改用迪杰斯特拉:为了求解,设置了很多的辅助…...
PortSwigger——WebSockets vulnerabilities
文章目录 一、WebSockets二、Lab: Manipulating WebSocket messages to exploit vulnerabilities三、Lab: Manipulating the WebSocket handshake to exploit vulnerabilities四、Using cross-site WebSockets to exploit vulnerabilities4.1 跨站WebSocket劫持(cro…...
八、OSG学习笔记-
前一章节: 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码: OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…...
自己动手实现一个简单的Linux AI Agent
大模型带我们来到了自然语言人机交互的时代 1、安装本地大模型进行推理 下载地址: https://ollama.com/download 部署本地deepseek和嵌入模型 ollama run deepseek-r1:7b2、制定Linux操作接口指令规范 3、编写大模型对话工具 #!/usr/bin/python3 #coding: utf-8…...
常见的数据仓库有哪些?
数据仓库(Data Warehouse,简称数仓)是企业用于存储、管理和分析大量数据的重要工具,其核心目标是通过整合和处理数据,为决策提供高质量、一致性和可信度的数据支持。在构建和使用数仓时,选择合适的工具和技术至关重要。以下是常见的数仓工具及其特点的详细介绍: 1. Hiv…...
LSTM 学习笔记 之pytorch调包每个参数的解释
0、 LSTM 原理 整理优秀的文章 LSTM入门例子:根据前9年的数据预测后3年的客流(PyTorch实现) [干货]深入浅出LSTM及其Python代码实现 整理视频 李毅宏手撕LSTM [双语字幕]吴恩达深度学习deeplearning.ai 1 Pytorch 代码 这里直接调用了nn.l…...
计算机网络,大白话
好嘞,咱就从头到尾,给你好好说道说道计算机网络里这些“门门道道”的概念: 1. 网络(Network) 啥是网络? 你可以把网络想象成一个“大Party”,大家(设备)聚在一起&#…...
自定义sort排序
数组中,根据出现次数以大到小排序,当频率相同时按元素值降序排序 #include <iostream> #include <vector> #include <algorithm> #include <unordered_map>// 全局的 unordered_map 用于存储元素频率 std::unordered_map<in…...
【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA
【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA data source1: BH coordination tabledata source2:BH layer tableprocess 1:Collect BH List To Layer Tableprocess 2:match Reduced Level from "Layer"+"BH"data source1: BH coordination…...
kafka动态监听主题
简单版本 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.ConsumerFactory; import org.springframework.kafka.listener.ConcurrentMessageListenerContainer; import org.springframework.kafka.listener.Containe…...
【PHP的static】
关于静态属性 最简单直接:静态方法也是一样 看了很多关于静态和动态的说法,无非是从 调用方式, 类访问实例变量, 访问静态变量, 需不要实例化这几个方向,太空了。问使用场景,好一点的 能说个…...
国产编辑器EverEdit - 光标位置跳转
1 光标位置跳转 1.1 应用场景 某些场景下,用户从当前编辑位置跳转到别的位置查阅信息,如果要快速跳转回之前编辑位置,则可以使用光标跳转相关功能。 1.2 使用方法 1.2.1 上一个编辑位置 跳转到上一个编辑位置,即文本修改过的位…...
cv2.Sobel
1. Sobel 算子简介 Sobel 算子是一种 边缘检测算子,通过对图像做梯度计算,可以突出边缘。 Sobel X 方向卷积核: 用于计算 水平方向(x 方向) 的梯度。 2. 输入图像示例 假设我们有一个 55 的灰度图像,像素…...
51单片机俄罗斯方块整行消除函数
/************************************************************************************************************** * 名称:flash * 功能:行清除动画 * 参数:NULL * 返回:NULL * 备注: * 采用非阻塞延时࿰…...
鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)
文章目录 一、概述二、原理介绍三、使用规则四、复用类型详解1、标准型2、有限变化型2.1、类型1和类型2布局不同,业务逻辑不同2.2、类型1和类型2布局不同,但是很多业务逻辑公用 3、组合型4、全局型5、嵌套型 一、概述 组件复用是优化用户界面性能&#…...





