提示:据说是科大讯飞算法面试题
我们在设计一个CNN网络时,通常要考虑两个事情,
一个是这个网络需要的计算量有多大,
一个是这个模型的参数量有多少。
前者决定了网络训练的快慢(硬件设备确定的情况),
后者决定了计算设备需要多大的内存或显存。
不就是算法的时间复杂度和空间复杂度吗???
本文CNN的计算量以计算机做乘加次数为单位,即完成某个操作,需要执行多少次乘法和加法操作。
参数量以参数个数为单位,要计算内存或显存的,用参数量乘以每个参数所占的字节数即可。
对于输入特征图f=(B,H,W,C),
卷积核张量kernel=(K,S,C,O),
其中,B是batch size大小,H,W,C分别是输入特征图的高,宽和通道数,
K,S,C,O分别是卷积操作时,卷积核的大小,移动步长(stride),特征图输入通道及输出通道数。
先分开来看一下一个数据样本每一小步需要的计算次数:
C个输入特征图上进行卷积运算的次数为C
在C个输入特征图上进行卷积之后需要将卷积的结果相加,得到一个输出特征图上卷积结果,C个相加需要C-1次加法,所以输出一个特征图需要的计算量是
上面的式子得到的是卷积神经网路的一层所需要的计算量,
将每层的计算量相加就可以得到整个网络的计算量。
通常包含乘加的操作有Pool,Relu,BN(含有除法),卷积等。
一般都是卷积操作占主要。
o(kN)=o(n),一层就是老大了
需要注意的是,上面计算的仅仅是模型的参数量,
若要计算模型实际需要多少显存,还要考虑特征图的大小,
因为每一层卷积的输出都需要缓存,
还要BN计算出来的均值和偏差也需要缓存,
权重的梯度也需要缓存。
通常模型参数所占用的显存比例很小。
提示:重要经验:
1)卷积神经网络参数量和计算量的计算,需要清楚知道卷积怎么卷,卷积核的KSCO都是啥含义,K是卷积核大小,S是步长,C是通道,O输出通道
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。