编者荐语
文章作者介绍了深度学习卷积网络的浮点计算量和参数量的计算,还附上了以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)
总结:
浮点计算量在一定程度上能估计模型的计算复杂度,但是却不一定能代表真实的推理时间。
这主要是因为,不同的硬件或框架对不同算子的优化程度不同,即使计算量大但计算速度也可能比较快,所以FLOPs这一指标只是网络计算复杂度的一个参考,有理论意义。