(附代码)深度学习卷积网络浮点计算量和参数量的计算
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
编者荐语
文章作者介绍了深度学习卷积网络的浮点计算量和参数量的计算,还附上了以Pytorch代码框架示例的案例。非常适合大家学习了解,值得一读!
链接丨https://www.zhihu.com/question/65305385
FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
不同的网络算子有不同的计算量,其计算方式也不相同。在卷积神经网络中,主要以卷积层和全连接层为主,其他算子的操作一般比较小,可以忽略不计,算作误差。二者其计算量的计算方式如下:
卷积
情况一:乘法+加法+bias
其中n个数相加需要n-1次加法运算。
参数量:
全连接层
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这一指标只是网络计算复杂度的一个参考,有理论意义。
好消息!
小白学视觉知识星球
开始面向外开放啦👇👇👇
下载1:OpenCV-Contrib扩展模块中文版教程 在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。 下载2:Python视觉实战项目52讲 在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。 下载3:OpenCV实战项目20讲 在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。 交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~