如何计算CNN感受野、计算量和模型大小

下面以最经典的AlexNet模型为例子,计算感受野,模型计算量和大小(内存)。下面这张图是AlexNet的结构图,看起来比较直观。
在这里插入图片描述

感受野

感受野是检测和分割任务中比较重要的指标,它是一个逐层叠加的过程,计算到最后一层的卷积特征图输出上,它的计算公式是:
R F i = R F i − 1 + ( k e r n e l s i z e − 1 ) × s t r i d e , R F 0 = 1 RF_{i}=RF_{i-1}+(kernelsize-1)\times stride,RF_{0}=1 RFi=RFi1+(kernelsize1)×strideRF0=1
其中 R F 0 RF_{0} RF0默认是输入层,感受野为1。所以AlexNet的感受野计算为:

  • 第一层,卷积: R F 1 = 1 + ( 11 − 1 ) × 4 = 41 RF_{1}=1+(11-1)\times 4=41 RF1=1+(111)×4=41
  • 第二层,池化: R F 2 = 41 + ( 3 − 1 ) × 2 = 45 RF_{2}=41+(3-1)\times 2=45 RF2=41+(31)×2=45
  • 第三层,卷积: R F 3 = 45 + ( 5 − 1 ) × 2 = 53 RF_{3}=45+(5-1)\times 2=53 RF3=45+(51)×2=53
  • 第四层,池化: R F 2 = 53 + ( 3 − 1 ) × 2 = 57 RF_{2}=53+(3-1)\times 2=57 RF2=53+(31)×2=57
  • 第五层,卷积: R F 2 = 57 + ( 3 − 1 ) × 1 = 59 RF_{2}=57+(3-1)\times 1=59 RF2=57+(31)×1=59
  • 第六层,卷积: R F 2 = 59 + ( 3 − 1 ) × 1 = 61 RF_{2}=59+(3-1)\times 1=61 RF2=59+(31)×1=61
  • 第七层,卷积: R F 2 = 61 + ( 3 − 1 ) × 1 = 63 RF_{2}=61+(3-1)\times 1=63 RF2=61+(31)×1=63
  • 第八层,池化: R F 2 = 63 + ( 3 − 1 ) × 2 = 67 RF_{2}=63+(3-1)\times 2=67 RF2=63+(31)×2=67

第八层的输出就是 6 × 6 × 256 6\times6\times256 6×6×256,感受野的计算就结束了。

计算量

计算量是评价一个模型重要的标准之一,其实在模型的计算量统计时有两点简化的地方:

  • 模型的不同层中,卷积层和全连接层是占据了绝大多数的计算量,所以下面我们只关注这两个层的计算;
  • 卷积层和全连接层都有对应的“+”操作,而这些“+”操作也被忽略掉了(一般情况下,是忽略“+”操作的,但是也会有例外,比如YOLOv3在计算主干网络算力的时候)。

卷积层

对于一个 w 1 × h 1 × c 1 w_{1}\times h_{1}\times c_{1} w1×h1×c1的输入特征图,经过 3 × 3 3\times3 3×3的卷积核,输出 w 2 × h 2 × c 2 w_{2}\times h_{2}\times c_{2} w2×h2×c2的特征图,那么卷积一次将输出一个值,计算量为:
F o = 3 × 3 × c 1 + 1 F_{o}=3\times3\times c_{1}+1 Fo=3×3×c1+1
其中这个1是每个卷积核对应的偏置,它也要做一次乘运算,然后,卷积完一张特征图 w 2 × h 2 w_{2}\times h_{2} w2×h2计算量为:
F c = F o × w 2 × h 2 F_{c}=F_{o}\times w_{2}\times h_{2} Fc=Fo×w2×h2
最后需要 c 2 c_{2} c2个卷积核才能完成 w 2 × h 2 × c 2 w_{2}\times h_{2}\times c_{2} w2×h2×c2的输出:
F a = F c × c 2 F_{a}=F_{c}\times c_{2} Fa=Fc×c2

全连接层

全连接层的计算量分析就更简单了,因为它没有滑动,就只输入相乘相加为一个输出,假设输出维度为 o 1 o_{1} o1,输出维度为 o 2 o_{2} o2,那么计算量为:
F = ( o 1 + 1 ) × o 2 F=(o_{1}+1)\times o_{2} F=(o1+1)×o2

AlexNet逐层计算计算量的话太多了,下面偷个懒,只算下第一层举个例子吧。
在这里插入图片描述
这是AlexNet的的参数数量和计算量分布图,第一层卷积的计算量是105M FLOPs,FLOPs是“每秒浮点运算次数”,在作为计算量是,就是浮点运算次数,那么105MFLOPs就应该是 105 × 1 0 6 105\times10^6 105×106次浮点运算。
套用上面公式就是:
( 11 × 11 × 3 + 1 ) × 55 × 55 × 96 = 105705600 = 105 M (11\times11\times3+1)\times55\times55\times96= 105705600=105M (11×11×3+1)×55×55×96=105705600=105M

模型大小

模型的大小完全由模型的参数数量和参数的存储形式决定:

卷积层

卷积层的参数数量就是一个卷积核的参数乘上卷积核的个数:
P n = ( w × h × c i + 1 ) × c o P_{n}=(w\times h\times c_{i}+1)\times c_{o} Pn=(w×h×ci+1)×co
w w w h h h和 c_{i}是卷积核的尺寸, c o c_{o} co是卷积核个数,也就是输出通道数,1是偏置。

全连接层

全连接层的参数数量输入输出的神经元连接的那个权重:
P n = ( o 1 + 1 ) × o 2 P_{n}=(o_{1}+1)\times o_{2} Pn=(o1+1)×o2
o 1 o_{1} o1是输入神经元个数,和 o 2 o_{2} o2是输出神经元个数,1是偏置。

AlexNet的参数数量由60M个,也就是六千万个,参数只在卷积层和全连接层出现,下面还是只计算第一层卷积的参数:
96 × 11 × 11 × 3 + 96 = 34944 = 35 K 96\times11\times11\times3+96=34944=35K 96×11×11×3+96=34944=35K
最后还剩下一个转换就是参数的数量,怎么转成存储的大小,一般情况下模型的参数是按照float形式存储的,占4个字节,AlexNet模型大小是238147KB:
60 M × 4 = 240000000 B = 234375 K B 60M\times4=240000000B=234375KB 60M×4=240000000B=234375KB
因为60M这个数是一个约等,所以计算出来是234375KB,而实际上是238147KB。

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CNN(卷积神经网络)在计算机视觉任务中被广泛应用的原因主要有以下几点: 1. 局部感知性:图像是由像素组成的二维结构,其中像素之间存在空间相关性。CNN通过卷积层和池化层的操作,可以捕捉到图像中的局部特征,并且通过层层堆叠,逐渐扩大感受,从而实现对整个图像的全局感知。这种局部感知性使得CNN在处理图像时能够更好地利用图像的结构信息。 2. 参数共享:CNN中的卷积操作使用相同的权重(卷积核)对输入的不同位置进行处理,这种参数共享的机制大大减少了模型的参数。由于图像中的特征在不同位置是具有相似性的,参数共享可以有效地提取图像中的局部模式,减少模型复杂度,并降低过拟合的风险。 3. 平移不变性:CNN通过卷积操作实现了平移不变性。即无论图像中的目标出现在图像的哪个位置,经过卷积层和池化层的处理后,得到的特征图对目标的表示是相同的。这使得CNN在处理物体识别、目标检测等任务时具有不变性,能够更好地应对物体的位置变化和尺度变化。 4. 多层次表示:CNN通过堆叠多层卷积层、池化层和全连接层,可以逐渐提取出图像的多层次特征表示。低层次的特征可以捕捉到图像的边缘、纹理等局部信息,而高层次的特征则可以捕捉到更抽象的语义信息。这种多层次的表示能力使得CNN在图像分类、目标检测、图像分割等任务中表现出色。 综上所述,CNN具有局部感知性、参数共享、平移不变性和多层次表示等特点,使其成为处理计算机视觉任务的有效工具。通过CNN的结构和特性,可以有效地提取图像中的特征并进行高效的图像分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值