=============================================================
图像分类技术一直都是计算机视觉领域的研究热点。近几年来,深度学习算法在图像分类方面取得了突破性进展,通过建立层级特征自动提取模型,得到更准确且接近图像高级语义的特征。卷积神经网络(CNN)是一种识别率很高的深度学习模型,能够提取具有平移、缩放、旋转等不变性的结构特征。这一篇文章是对常用的图像分类模型做总结,包括LeNet-5、AlexNet、VGGNet、GoogLeNet、Resent、ResNeXt、Densenet、SeNet、EfficientNet、EfficientNetV2以及最新的Transformer 模型ConViT 。
如果大家认可,请多转发收藏,有不对的地方也请大家指正。
====================================================================
LeNet-5是由LeCun在1994年提出的一种用于识别手写数字和机器印刷字符的卷积神经网络(Convolutional Neural Network,CNN),是卷积神经网络的开山之作,其命名来源于作者LeCun的名字,5则是其研究成果的代号,是LeNet的第五个版本。LeNet-5阐述了图像中像素特征之间的相关性能够由参数共享的卷积操作所提取,同时使用卷积、下采样(池化)和非线性映射这样的组合结构,是当前流行的大多数深度图像识别网络的基础。
如上图所示,LeNet-5一共包含7层(输入层不作为网络结构),分别由2个卷积层、2个下采样层和3个连接层组成。
1、输入层-INPUT
首先是数据 INPUT 层,输入图像的尺寸统一ReSize为 32 ∗ 32 32*32 32∗32。
注意:本层不算LeNet-5的网络结构,传统上,不将输入层视为网络层次结构之一。
2、 C 1 C1 C1层-卷积层
卷积层的计算公式参考这篇文章:CNN基础——卷积神经网络的组成_AI浩-CSDN博客
输入图片: 32 × 32 32×32 32×32
卷积核大小: 5 × 5 5×5 5×5
卷积核种类: 6 6 6
输出featuremap大小: 28 × 28 ( 32 − 5 + 1 ) = 28 28×28 (32-5+1)=28 28×28(32−5+1)=28
神经元数量: 28 × 28 × 6 28×28×6 28×28×6
可训练参数: ( 5 × 5 + 1 ) × 6 (5×5+1) × 6 (5×5+1)×6(每个滤波器 5 × 5 = 25 5×5=25 5×5=25个unit参数和一个bias参数,一共6个滤波器)
连接数: ( 5 × 5 + 1 ) × 6 × 28 × 28 = 122304 (5×5+1)×6×28×28=122304 (5×5+1)×6×28×28=122304
详细说明:对输入图像进行第一次卷积运算(使用 6 个大小为 5 × 5 5×5 5×5 的卷积核),得到6个 C 1 C1 C1特征图(6个大小为28×28的 feature maps, 32 − 5 + 1 = 28 32-5+1=28 32−5+1=28)。我们再来看看需要多少个参数,卷积核的大小为 5 × 5 5×5 5×5,总共就有 6 × ( 5 × 5 + 1 ) = 156 6×(5×5+1)=156 6×(5×5+1)=156个参数,其中+1是表示一个核有一个bias。对于卷积层C1,C1内的每个像素都与输入图像中的5×5个像素和1个bias有连接,所以总共有 156 × 28 × 28 = 122304 156×28×28=122304 156×28×28=122304个连接(connection)。有 122304 122304 122304个连接,但是我们只需要学习156个参数,主要是通过权值共享实现的。3、 S 2 S2 S2层-池化层(下采样层)
输入: 28 × 28 28×28 28×28
采样区域: 2 × 2 2×2 2×2
采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid
采样种类: 6 6 6
输出featureMap大小: 14 × 14 ( 28 / 2 ) 14×14(28/2) 14×14(28/2)
神经元数量: 14 × 14 × 6 14×14×6 14×14×6
连接数: ( 2 × 2 + 1 ) × 6 × 14 × 14 (2×2+1)×6×14×14 (2×2+1)×6×14×14
S2中每个特征图的大小是C1中特征图大小的1/4。
详细说明:第一次卷积之后紧接着就是池化运算,使用 2×2核 进行池化,于是得到了S2,6个 14 × 14 14×14 14×14的 特征图 ( 28 / 2 = 14 ) (28/2=14) (28/2=14)。S2这个pooling层是对C1中的2×2区域内的像素求和乘以一个权值系数再加上一个偏置,然后将这个结果再做一次映射。同时有 5 × 14 × 14 × 6 = 5880 5×14×14×6=5880 5×14×14×6=5880个连接。
4、C3层-卷积层
输入:S2中所有6个或者几个特征map组合
卷积核大小: 5 × 5 5×5 5×5
卷积核种类:16
输出featureMap大小: 10 × 10 ( 14 − 5 + 1 ) = 10 10×10 (14-5+1)=10 10×10(14−5+1)=10
C3中的每个特征map是连接到S2中的所有6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不同组合
存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。然后的3个以不相邻的4个特征图子集为输入。最后一个将S2中所有特征图为输入。
则:可训练参数: 6 × ( 3 × 5 × 5 + 1 ) + 6 × ( 4 × 5 × 5 + 1 ) + 3 × ( 4 × 5 × 5 + 1 ) + 1 × ( 6 × 5 × 5 + 1 ) = 1516 6×(3×5×5+1)+6×(4×5×5+1)+3×(4×5×5+1)+1×(6×5×5+1)=1516 6×(3×5×5+1)+6×(4×5×5+1)+3×(4×5×5+1)+1×(6×5×5+1)=1516
连接数: 10 × 10 × 1516 = 151600 10×10×1516=151600 10×10×1516=151600
详细说明:第一次池化之后是第二次卷积,第二次卷积的输出是C3,16个 10 ∗ 10 10*10 10∗10的特征图,卷积核大小是 5 × 5 5×5 5×5. 我们知道S2 有6个 14×14 的特征图,怎么从6 个特征图得到 16个特征图了? 这里是通过对S2 的特征图特殊组合计算得到的16个特征图。具体如下:
C3的前6个feature map(对应上图第一个红框的6列)与S2层相连的3个feature map相连接(上图第一个红框),后面6个feature map与S2层相连的4个feature map相连接(上图第二个红框),后面3个feature map与S2层部分不相连的4个feature map相连接,最后一个与S2层的所有feature map相连。卷积核大小依然为 5 × 5 5×5 5×5,所以总共有 6 × ( 3 × 5 × 5 + 1 ) + 6 × ( 4 × 5 × 5 + 1 ) + 3 × ( 4 × 5 × 5 + 1 ) + 1 × ( 6 × 5 × 5 + 1 ) = 1516 6×(3×5×5+1)+6×(4×5×5+1)+3×(4×5×5+1)+1×(6×5×5+1)=1516 6×(3×5×5+1)+6×(4×5×5+1)+3×(4×5×5+1)+1×(6×5×5+1)=1516个参数。而图像大小为10×10,所以共有151600个连接。
C3与S2中前3个图相连的卷积结构如下图所示:
上图对应的参数为 3 × 5 × 5 + 1 3×5×5+1 3×5×5+1,一共进行6次卷积得到6个特征图,所以有 6 × ( 3 × 5 × 5 + 1 ) 6×(3×5×5+1) 6×(3×5×5+1)参数。 为什么采用上述这样的组合了?论文中说有两个原因:1)减少参数,2)这种不对称的组合连接的方式有利于提取多种组合特征。
5、S4层-池化层(下采样层)
输入: 10 × 10 10×10 10×10
采样区域: 2 × 2 2×2 2×2
采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid
采样种类:16
输出featureMap大小: 5 × 5 ( 10 / 2 ) 5×5(10/2) 5×5(10/2)
神经元数量: 5 × 5 × 16 = 400 5×5×16=400 5×5×16=400
连接数: 16 × ( 2 × 2 + 1 ) × 5 × 5 = 2000 16×(2×2+1)×5×5=2000 16×(2×2+1)×5×5=2000
S4中每个特征图的大小是C3中特征图大小的1/4
详细说明:S4是pooling层,窗口大小仍然是2×2,共计16个feature map,C3层的16个10x10的图分别进行以2x2为单位的池化得到16个5x5的特征图。有 5 × 5 × 5 × 16 = 2000 5×5×5×16=2000 5×5×5×16=2000个连接。连接的方式与S2层类似。
6、C5层-卷积层
输入:S4层的全部16个单元特征map(与s4全相连)
卷积核大小: 5 × 5 5×5 5×5
卷积核种类: 120 120 120
输出featureMap大小: 1 × 1 ( 5 − 5 + 1 ) 1×1(5-5+1) 1×1(5−5+1)
可训练参数/连接: 120 × ( 16 × 5 × 5 + 1 ) = 48120 120×(16×5×5+1)=48120 120×(16×5×5+1)=48120
详细说明:C5层是一个卷积层。由于S4层的16个图的大小为5x5,与卷积核的大小相同,所以卷积后形成的图的大小为1x1。这里形成120个卷积结果。每个都与上一层的16个图相连。所以共有 ( 5 × 5 × 16 + 1 ) × 120 = 48120 (5×5×16+1)×120 = 48120 (5×5×16+1)×120=48120个参数,同样有48120个连接。C5层的网络结构如下:
7、F6层-全连接层
输入:c5 120维向量
计算方式:计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过sigmoid函数输出。
可训练参数: 84 × ( 120 + 1 ) = 10164 84×(120+1)=10164 84×(120+1)=10164
详细说明:6层是全连接层。F6层有84个节点,对应于一个7x12的比特图,-1表示白色,1表示黑色,这样每个符号的比特图的黑白色就对应于一个编码。该层的训练参数和连接数是 ( 120 + 1 ) ∗ 84 = 10164 (120 + 1)*84=10164 (120+1)∗84=10164。F6层的连接方式如下:
8、Output层-全连接层
Output层也是全连接层,共有10个节点,分别代表数字0到9,且如果节点i的值为0,则网络识别的结果是数字i。采用的是径向基函数(RBF)的网络连接方式。假设x是上一层的输入,y是RBF的输出,则RBF输出的计算方式是:
上式 w i j w_ij wij 的值由i的比特图编码确定,i从0到9,j取值从0到 7 ∗ 12 − 1 7*12-1 7∗12−1。RBF输出的值越接近于0,则越接近于i,即越接近于i的ASCII编码图,表示当前网络输入的识别结果是字符i。该层有 84 × 10 = 840 84×10=840 84×10=840个参数和连接。
上图是LeNet-5识别数字3的过程。
各层参数总结
| 网络层 | 输入尺寸 | 核尺寸 | 输出尺寸 | 可训练参数量 |
| :-: | :-: | :-: | :-: | :-: |
| 卷积层 C 1 C_1 C1 | 32 × 32 × 1 32\times32\times1 32×32×1 | 5 × 5 × 1 / 1 , 6 5\times5\times1/1,6 5×5×1/1,6 | 28 × 28 × 6 28\times28\times6 28×28×6 | ( 5 × 5 × 1 + 1 ) × 6 (5\times5\times1+1)\times6 (5×5×1+1)×6 |
| 下采样层 S 2 S_2 S2 | 28 × 28 × 6 28\times28\times6 28×28×6 | 2 × 2 / 2 2\times2/2 2×2/2 | 14 × 14 × 6 14\times14\times6 14×14×6 | ( 1 + 1 ) × 6 (1+1)\times6 (1+1)×6 $ _{注1}$ |
| 卷积层 C 3 C_3 C3 | 14 × 14 × 6 14\times14\times6 14×14×6 | 5 × 5 × 6 / 1 , 16 5\times5\times6/1,16 5×5×6/1,16 | 10 × 10 × 16 10\times10\times16 10×10×16 | 151 6 注 2 1516_{注2} 1516注2 |
| 下采样层 S 4 S_4 S4 | 10 × 10 × 16 10\times10\times16 10×10×16 | 2 × 2 / 2 2\times2/2 2×2/2 | 5 × 5 × 16 5\times5\times16 5×5×16 | ( 1 + 1 ) × 16 (1+1)\times16 (1+1)×16 |
| 卷积层 C 5 C_5 C5 ∗ ^* ∗ | 5 × 5 × 16 5\times5\times16 5×5×16 | 5 × 5 × 16 / 1 , 120 5\times5\times16/1,120 5×5×16/1,120 | 1 × 1 × 120 1\times1\times120 1×1×120 | ( 5 × 5 × 16 + 1 ) × 120 (5\times5\times16+1)\times120 (5×5×16+1)×120 |
| 全连接层 F 6 F_6 F6 | 1 × 1 × 120 1\times1\times120 1×1×120 | 120 × 84 120\times84 120×84 | 1 × 1 × 84 1\times1\times84 1×1×84 | ( 120 + 1 ) × 84 (120+1)\times84 (120+1)×84 |
| 输出层 | 1 × 1 × 84 1\times1\times84 1×1×84 | 84 × 10 84\times10 84×10 | 1 × 1 × 10 1\times1\times10 1×1×10 | ( 84 + 1 ) × 10 (84+1)\times10 (84+1)×10 |
注1 在LeNet中,下采样操作和池化操作类似,但是在得到采样结果后会乘以一个系数和加上一个偏置项,所以下采样的参数个数是 ( 1 + 1 ) × 6 (1+1)\times6 (1+1)×6而不是零。
注2 C 3 C_3 C3卷积层可训练参数并未直接连接 S 2 S_2 S2中所有的特征图(Feature Map),而是采用如图4.2所示的采样特征方式进行连接(稀疏连接),生成的16个通道特征图中分别按照相邻3个特征图、相邻4个特征图、非相邻4个特征图和全部6个特征图进行映射,得到的参数个数计算公式为 6 × ( 25 × 3 + 1 ) + 6 × ( 25 × 4 + 1 ) + 3 × ( 25 × 4 + 1 ) + 1 × ( 25 × 6 + 1 ) = 1516 6\times(25\times3+1)+6\times(25\times4+1)+3\times(25\times4+1)+1\times(25\times6+1)=1516 6×(25×3+1)+6×(25×4+1)+3×(25×4+1)+1×(25×6+1)=1516,在原论文中解释了使用这种采样方式原因包含两点:限制了连接数不至于过大(当年的计算能力比较弱);强制限定不同特征图的组合可以使映射得到的特征图学习到不同的特征模式。
-
卷积网络使用一个3层的序列组合:卷积、下采样(池化)、非线性映射(LeNet-5最重要的特性,奠定了目前深层卷积网络的基础)
-
使用卷积提取空间特征
-
使用映射的空间均值进行下采样
-
使用 t a n h tanh tanh或 s i g m o i d sigmoid sigmoid进行非线性映射
-
多层神经网络(MLP)作为最终的分类器
-
层间的稀疏连接矩阵以避免巨大的计算开销
====================================================================
AlexNet是由Alex Krizhevsky 提出的首个应用于图像分类的深层卷积神经网络,该网络在2012年ILSVRC(ImageNet Large Scale Visual Recognition Competition)图像分类竞赛中以15.3%的top-5测试错误率赢得第一名。也是在那年之后,更多的更深的神经网络被提出,比如优秀的vgg,GoogLeNet。 这对于传统的机器学习分类算法而言,已经相当的出色。
AlexNet中包含了几个比较新的技术点,也首次在CNN中成功应用了ReLU、Dropout和LRN等Trick。同时AlexNet也使用了GPU进行运算加速。
AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中。AlexNet主要使用到的新技术点如下:
(1)成功使用ReLU作为CNN的激活函数,并验证其效果在较深的网络超过了Sigmoid,成功解决了Sigmoid在网络较深时的梯度弥散问题。虽然ReLU激活函数在很久之前就被提出了,但是直到AlexNet的出现才将其发扬光大。
(2)训练时使用Dropout随机忽略一部分神经元,以避免模型过拟合。Dropout虽有单独的论文论述,但是AlexNet将其实用化,通过实践证实了它的效果。在AlexNet中主要是最后几个全连接层使用了Dropout。
(3)在CNN中使用重叠的最大池化。此前CNN中普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊化效果。并且AlexNet中提出让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性。
(4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
(5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
(6)数据增强,随机地从256_256的原始图像中截取224_224大小的区域(以及水平翻转的镜像),相当于增加了2*(256-224)^2=2048倍的数据量。如果没有数据增强,仅靠原始的数据量,参数众多的CNN会陷入过拟合中,使用了数据增强后可以大大减轻过拟合,提升泛化能力。进行预测时,则是取图片的四个角加中间共5个位置,并进行左右翻转,一共获得10张图片,对他们进行预测并对10次结果求均值。同时,AlexNet论文中提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声,这个Trick可以让错误率再下降1%。
首先这幅图分为上下两个部分的网络,论文中提到这两部分网络是分别对应两个GPU,只有到了特定的网络层后才需要两块GPU进行交互,这种设置完全是利用两块GPU来提高运算的效率,其实在网络结构上差异不是很大。为了更方便的理解,我们假设现在只有一块GPU或者我们用CPU进行运算,我们从这个稍微简化点的方向区分析这个网络结构。网络总共的层数为8层,5层卷积,3层全连接层。
第一层:卷积层1,输入为 224 × 224 × 3 的图像,卷积核的数量为96,论文中两片GPU分别计算48个核; 卷积核的大小为 11 × 11 × 3 11 × 11 × 3 11×11×3,stride = 4,stride表示的是步长,padding = 2。
卷积后的图形大小是怎样的呢?
wide = (224 + 2 * padding - kernel_size) / stride + 1 = 55
height = (224 + 2 * padding - kernel_size) / stride + 1 = 55
dimention = 96
然后进行 (Local Response Normalized), 后面跟着池化pool_size = (3, 3), stride = 2, pad = 0 最终获得第一层卷积的feature map
最终第一层卷积的输出为 96 × 55 × 55 96×55×55 96×55×55
第二层:卷积层2, 输入为上一层卷积的feature map, 卷积的个数为256个,论文中的两个GPU分别有128个卷积核。卷积核的大小为: 5 × 5 × 48 5 × 5 × 48 5×5×48, padding = 2, stride = 1; 然后做 LRN, 最后 max_pooling, pool_size = (3, 3), stride = 2;
第三层:卷积3, 输入为第二层的输出,卷积核个数为384, kernel_size = (3 × 3 × 256 ), padding = 1, 第三层没有做LRN和Pool
第四层:卷积4, 输入为第三层的输出,卷积核个数为384, kernel_size = (3 × 3 ), padding = 1, 和第三层一样,没有LRN和Pool
第五层:卷积5, 输入为第四层的输出,卷积核个数为256, kernel_size = (3 × 3 ), padding = 1。然后直接进行max_pooling, pool_size = (3, 3), stride = 2;
第6,7,8层是全连接层,每一层的神经元的个数为4096,最终输出softmax为1000,因为上面介绍过,ImageNet这个比赛的分类个数为1000。全连接层中使用了RELU和Dropout。
下图是对上面参数的总结。
- 所有卷积层都使用ReLU作为非线性映射函数,使模型收敛速度更快
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
最后
🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-R8dOh3tx-1712790284097)]
最后
🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-F3huMiFg-1712790284097)]