编者荐语

文章作者介绍了深度学习卷积网络的浮点计算量和参数量的计算,还附上了以Pytorch代码框架示例的案例。非常适合大家学习了解,值得一读!

链接丨https://www.zhihu.com/question/65305385

FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。

不同的网络算子有不同的计算量,其计算方式也不相同。在卷积神经网络中,主要以卷积层和全连接层为主,其他算子的操作一般比较小,可以忽略不计,算作误差。二者其计算量的计算方式如下:

卷积

  表示卷积核大小,  和   表示输入和输出通道数,  和  表示输出特征图大小。

情况一:乘法+加法+bias

其中n个数相加需要n-1次加法运算。

() 情况二:乘法+加法,无bias

()() 情况三:乘法,不计入加法

()

参数量:

全连接层

I表示输入维度,O表示输出维度

情况一:乘法+加法+bias

情况二:乘法+加法,无bias

情况三:乘法,不计入加法 

参数量: 

计算代码--以PyTorch框架为例

第一个推荐的计算库是 thop, 简单好用

① 安装:

推荐从作者的github直接安装最新版本。

pip install --upgrade git+https://github.com/Lyken17/pytorch-OpCounter.git

② 使用:

#计算
from torchvision.models import resnet50
from thop import profile
model = resnet50()
dummy_input = torch.randn(1, 3, 224, 224)
macs, params = profile(model, inputs=(dummy_input, ))
#输出
from thop import clever_format
macs, params = clever_format([macs, params], "%.3f")

第二个推荐微软的nni包

nni中有个计算网络模型计算量和参数量的小工具,使用起来也非常简单,并能输出每一层的计算量和参数量。

① 安装:

pip install --upgrade nni

② 使用:

from torchvision.models import resnet18
from nni.compression.pytorch.utils.counter import count_flops_params
model = resnet18()
dummy_input = torch.randn(1, 3, 224, 224)
flops, params, results = count_flops_params(model, dummy_input)

SPP神经网络 神经网络flops计算_SPP神经网络

总结:

浮点计算量在一定程度上能估计模型的计算复杂度,但是却不一定能代表真实的推理时间。

这主要是因为,不同的硬件或框架对不同算子的优化程度不同,即使计算量大但计算速度也可能比较快,所以FLOPs这一指标只是网络计算复杂度的一个参考,有理论意义。