一、网络的属性参数
选择网络backbone时除了考虑网络结果精准度外,还需要根据计算平台的性能约束(算力、内存、带宽),以及期望的网络推理帧率,选取合适的网络backbone,这就需要考察网络的属性指标:参数量、计算量、占用Memory。
1. 参数量
主要指网络权重的参数量,对于CNN网络,主要是卷积核、BN层、全连接层的参数量。
- 卷积核:设Nin, Nout, K分别表示in_channels,out_channels,和kernel_size,则参数量为:Nin*K*K*Nout + Nout (权重+bias)
- BN层:2*Nin
- 全连接层:Lin*Lout + Lout(设Lin,Lout分别表示输入和输出向量的长度)
在实操中,pytorch可以统计model.parameters()中参数量获得网络的参数的数量。
2. 计算量
一次卷积操作的计算量为:Nin*(K*K+K*K-1) + Nin-1 , 其中,卷积的乘法为K*K,卷积核的加法K*K-1,Nin-1为跨通道的加法数。
需要进行的卷积次数:Hout*Wout。 设输入分辨率为Hin*Win,经过卷积后输出分辨率为
Hout=[Hin+2*padding[0]-dilation[0]*(kernel_size[0]-1)-1]/stride[0]+1,
Wout=[Win+2*padding[1]-dilation[1]*(kernel_size[1]-1)-1]/stride[1]+1,
再考虑需要的输出通道数Nout和Batch数B,
卷积的计算量为:B*Nout*Hout*Wout*(Nin*2K*K-1+Nin-1)
举例:当输入为224x224时,对于ResNet-50,计算量约4.5GFLOPs;对于ResNet-200, 计算量约15GFLOPs。
核算整个网络的计算量后,可以知道模型对应的计算量是多少floating-point operations (FLOPs)。随后结合计算平台的算力是多少FLOPS(floating-point operations per second)可以大概推算模型的帧率(当然,实际还涉及到模型的优化部署问题以及带宽等瓶颈是的实际帧率会低于该评估值)。
模型计算量评估可参考:神经网络中参数量以及计算量的计算 - 知乎
这里需要注意,评估模型的计算量单位是FLOPs,注意是小s,表示的是模型需要进行多少次浮点运算。评估计算平台的算力单位是FLOPS,表示的是计算平台在单位时间可以进行多少次浮点运算。根据模型推理的帧率需求fps,以及计算平台的物理算力FLOPS,可以计算模型的计算量FLOPs,三者之间关系:FLOPs= FLOPS/fps。
参考:FLOPS、TOPS和FLOPs的区别_BRUCE_WUANG的博客-CSDN博客_tops和flops
3. Memory
占用memory的网络要素包括:
- 各层的feature map(占用主要的memory)
- 网络的权重(根据float32占用4bytes可以折算上面的权重所占用的memory)
- 训练过程需要在考虑梯度占用内存
参考:神经网络参数量、数据量计算 - leizhao - 博客园
二、网络结构
一般而言,一个网络backbone包括多个Stages,每个Stage包含多个Block。
Stage是指卷积提取特征中,feature map的size是逐级降低的,一个feature map分辨率之间的所有网络结构叫做一个Stage;
Block是指用于构建网络的基本单元,每个block包含卷积层、pooling层等基本操作。
论文中网络结构会创造或优化Block,并搭建一个或多个Backbone。
1. 越来越深的网络
以ImageNet 2012~2017年(2017年是最后一届)冠军网络代表了深度神经网络的发展趋势,2012~2014年结果可参见论文(2015,Imagenet large scale visual recognition challenge),2016~2017年结果可参见链接:ImageNet历年冠军和相关CNN模型 - PilgrimHui - 博客园
AlexNet
AlexNet(2012, Imagenet classification with deep convolutional neural networks)是2012年ImageNet的SOTA,通过CNN方法取得的性能远超过传统机器学习手动提取的特征,使得神经网络方法成为主流。其主要贡献是验证了深度神经网络在大规模数据集的性能。对后来网络的主要影响包括:
- 使用ReLU激活函数,相比于sigmoid和tanh而言,训练更快,并防