卷积神经网络的参数量和计算量
《卷积神经网络的参数量和计算量》
对于在端部署的模型来说,模型的参数量以及计算量是锱铢必较的,使用什么样的激活函数,会有多大的计算成本。对于模型的压缩量化等都是模型的参数量和计算量的准确计量为基础的,所以本文简单记录一下常见神经网络的参数量和计算量。
Key Words:Parameters count、FLOPS、FLOPs
Beijing, 2020
作者:RaySue
Agile Pioneer
文章目录
- 模型的参数量
- 全连接参数量
- 池化层
- Vanilla Conv Parameters
- Group Convolution
- Depthwise Separable Convolution
- 模型的计算量
- 卷积运算量(FLOPs)
- Vanilla Conv
- 全连接层
- 池化层
- 最大池化
- 平均池化
- 激活层
- ReLU/PReLU/ELU
- Sigmoid
- 设备FLOPS参考
- 以ResNet18为例计算FLOPs
- 参考
FLOPS (Floating point of per Second) 的缩写,意指每秒浮点运算次数。用来衡量硬件的性能。
FLOPs (Floating point of operations) 的缩写,是浮点运算次数,可以用来衡量算法/模型复杂度。
模型的参数量
- KhK_hKh 卷积核的高度
- KwK_wKw 卷积核的宽度
- CinC_{in}Cin 输入featureMap的channel数
- CoutC_{out}Cout 输出featureMap的channel数
全连接参数量
全连接层的参数量是很大的,和输入的隐藏层的数据大小相关,如VGG-16最后一次卷积得到的feature map的维度为:7x7x512,将feature map展开后输出为4096个隐藏层单元,那么相当于用4096个1x1的卷积对7x7x512展平的结果去做卷积。
参数量:
7×7×512×4096=1027604487 \times 7 \times 512 \times 4096 = 1027604487×7×512×4096=102760448
一个亿的参数量,所以全连接层参数是冗余的。
池化层
对于池化层而言,常用的Max-pooling,Avg-pooling等是不存在参数量的。
Vanilla Conv Parameters
对于某一个卷积层,它的parameters个数为:
(Kh∗Kw∗Cin)∗Cout+Cout(K_h * K_w * C_{in}) * C_{out} + C_{out}(Kh∗Kw∗Cin)∗Cout+Cout
Group Convolution
分组卷积的输出特征图的每个通道,只和输入特征图的一部分通道有关,而这部分通道,就是一个分组(Group)。依旧假设输入特征图的尺寸为Cin∗H∗WC_{in} * H * WCin∗H∗W,分为 ggg 组进行分组卷积,那么,对于每一组,输出特征图的通道数都是 Coutg\frac{C_{out}}{g}gCout ,每组的卷积核参数变为:
Cing∗Kh∗Kw∗Coutg\frac{C_{in}}{g} * K_h * K_w * \frac{C_{out}}{g}gCin∗Kh∗Kw∗gCout
最后只需要将各个分组的计算结果按照通道进行连接(Cat)即可,每组的参数量和普通卷积一样,一共g组则总体的参数量为:
Cing∗Kh∗Kw∗Coutg∗g\frac{C_{in}}{g} * K_h * K_w * \frac{C_{out}}{g} * ggCin∗Kh∗Kw∗gCout∗g
参数量减少为普通卷积的1/g1 / g1/g
Depthwise Separable Convolution
对于深度可分离卷积,包含两个部分,Depthwise和Point_wise。
Depthwise:
Kh∗Kw∗CinK_h * K_w * C_{in}Kh∗Kw∗Cin
Pointwise:
1∗1∗Cin∗Cout1 * 1 * C_{in} * C_{out}1∗1∗Cin∗Cout
final:
Kh∗Kw∗Cin+1∗1∗Cin∗CoutK_h * K_w * C_{in} + 1 * 1 * C_{in} * C_{out}Kh∗Kw∗Cin+1∗1∗Cin∗Cout
深度可分离卷积比普通卷积:
Kh∗Kw∗Cin+Cin∗Cout(Kh∗Kw∗Cin)∗Cout+Cout=1Cout+1Kh∗Kw\frac{K_h * K_w * C_{in} + C_{in} * C_{out}}{(K_h * K_w * C_{in}) * C_{out} + C_{out}} = \frac{1}{C_{out}} +\frac{1}{K_h * K_w}(Kh∗Kw∗Cin)∗Cout+CoutKh∗Kw∗Cin+Cin∗Cout=Cout1+Kh∗Kw1
为了便于理解、便于和分组卷积类比,假设Cin=CoutC_{in} = C_{out}Cin=Cout。深度卷积其实就是$g = C_{in} = C_{out} $的分组卷积,只不过没有直接将 ggg 组结果拼接,所以Depthwise卷积参数量是标准卷积的1Cout\frac{1}{C_{out}}Cout1,而Pointwise卷积的参数量是标注卷积的 1Kh∗Kw\frac{1}{K_h * K_w}Kh∗Kw1。
模型的计算量
- FLOPS 注意全部大写 是floating point of per Second 的缩写,意指每秒浮点运算次数。用来衡量硬件的性能。
- FLOPs 是floating point of operations的缩写,是浮点运算次数,可以用来衡量算法/模型复杂度。
- MAC或MACC或MADD(Multiply And Accumulate)乘累加单元
- 1 MAC = 2 FLOPs 2 * (卷积乘法 + 卷积乘法自后所有数相加 - 1)(n个数相加只需要n-1次相加,所以无bias -1,有bias +1抵消)细节
- 运算量乘以的图像feature map的维度是 Output feature map的维度
- 加、减、乘、除、指数运算、平方根、最大值…都是一个FLOP
卷积运算量(FLOPs)
Vanilla Conv
不考虑bias:
FLOPs=[(Kh∗Kw∗Cin)+(Kh∗Kw∗Cin−1)]∗Hout∗Wout∗CoutFLOPs =[(K_h * K_w * C_{in}) + (K_h * K_w * C_{in} - 1)]* H_{out} * W_{out} * C_{out}FLOPs=[(Kh∗Kw∗Cin)+(Kh∗Kw∗Cin−1)]∗Hout∗Wout∗Cout
上式中,把卷积计算分为两个部分,一部分表示乘法,一部分表示加法,加法只需n-1次
考虑bias:
FLOPs=(2∗Kh∗Kw∗Cin)∗Hout∗Wout∗CoutFLOPs =(2 * K_h * K_w * C_{in})* H_{out} * W_{out} * C_{out}FLOPs=(2∗Kh∗Kw∗Cin)∗Hout∗Wout∗Cout
公式:
- 参数量 x 输出的特征映射图的 H,W,其他卷积一样可以这样运算
全连接层
不考虑bias:
FLOPs=(2×I−1)×OFLOPs = (2 \times I - 1) \times OFLOPs=(2×I−1)×O
- which III = input neuron numbers, OOO = output neuron numbers
- 同样的 III 表示乘法 I−1I - 1I−1表示加法
池化层
ps: 自己的理解
最大池化
最大池化,只有一个单个操作,取最大值,所以FLOPs如下:
Hout∗WoutH_{out} * W_{out}Hout∗Wout
平均池化
平均池化,对池化步长 SSS 区域内的所有隐藏节点进行相加,再做一次除法,FLOPs如下:
(Sh∗Sw−1+1)∗Hout∗Wout(S_h * S_w - 1 + 1) * H_{out} * W_{out}(Sh∗Sw−1+1)∗Hout∗Wout
激活层
神经网络中是一定存在非线性的激活函数的,比如ReLU或Sigmoid等,当然这些激活函数也是需要时间来计算的,但是由于激活函数一般没有乘法,所以不计算MAC只计算FLOPs
ReLU/PReLU/ELU
只有一个单个操作,取最大值,所以FLOPs如下:
FLOPs=Hout×Wout×CoutFLOPs = H_{out} \times W_{out} \times C_{out}FLOPs=Hout×Wout×Cout
Sigmoid
在计算FLOPS的时候,我们通常计算加、减、乘、除、指数、平方根等等,作为一个单个的FLOP。因此在Sigmoid中有4个明显的操作,0-x, exp(x), 1 + x, 1 / x
y=11+exp(−x)y = \frac{1}{1 + exp(-x)}y=1+exp(−x)1
FLOPs:
FLOPs=Hout×Wout×Cout×4FLOPs = H_{out} \times W_{out} \times C_{out} \times 4FLOPs=Hout×Wout×Cout×4
实际上不会计算激活函数的计算量的,因为和神经网络的大量乘加运算相比,它占的比例微不足道。所以 we’ll simply assume that the activation function is free.
设备FLOPS参考
以ResNet18为例计算FLOPs
公式:Hout∗Wout∗Kw∗Kh∗Cin∗CoutH_{out} * W_{out} * K_w * K_h * C_{in} * C_{out}Hout∗Wout∗Kw∗Kh∗Cin∗Cout (注意:不要忘了resnet的shortcut的add操作)
conv1:112∗112∗7∗7∗3∗64conv1:112*112*7*7*3*64conv1:112∗112∗7∗7∗3∗64
conv2x:56∗56∗64∗64∗9+56∗56∗64∗64∗9+56∗56∗64∗64conv2x:56*56*64*64*9+56*56*64*64*9+56*56*64*64conv2x:56∗56∗64∗64∗9+56∗56∗64∗64∗9+56∗56∗64∗64
conv3x:28∗28∗64∗128∗9+28∗28∗128∗128∗9+28∗28∗64∗128conv3x:28*28*64*128*9+28*28*128*128*9+28*28*64*128conv3x:28∗28∗64∗128∗9+28∗28∗128∗128∗9+28∗28∗64∗128
conv4x:14∗14∗128∗256∗9+14∗14∗256∗256∗9+14∗14∗128∗256conv4x:14*14*128*256*9+14*14*256*256*9+14*14*128*256conv4x:14∗14∗128∗256∗9+14∗14∗256∗256∗9+14∗14∗128∗256
conv5x:7∗7∗256∗512∗9+7∗7∗512∗512∗9+7∗7∗256∗512conv5x:7*7*256*512*9+7*7*512*512*9+7*7*256*512conv5x:7∗7∗256∗512∗9+7∗7∗512∗512∗9+7∗7∗256∗512
fc:512∗1000fc:512*1000fc:512∗1000
总共加起来乘以2,为1.8G flops
参考
https://www.pianshen.com/article/5383315087/
https://zhuanlan.zhihu.com/p/65377955
https://zhuanlan.zhihu.com/p/77471991?utm_source=wechat_timeline
https://www.zhihu.com/question/65305385
https://blog.csdn.net/zjucor/article/details/85239860
https://www.zhihu.com/question/65305385
卷积神经网络的参数量和计算量相关推荐
- vgg16卷积层的计算量_卷积神经网络VGG16参数数量的计算和理解
先说一下我对神经网络的理解:神经网络就是用巨量的简单的非线性函数组合起来拟合复杂的未知函数.比如,人类识别不同的物体.识别不同动物.不同植物是个复杂的未知函数.虽然未知,但没事,我们的神经网络可以用巨 ...
- 卷积神经网络参数量和计算量内存计算
卷积神经网络参数量和计算量内存计算 参数量 计算量 内存 参数量 每一次卷积的参数量和特征图的大小无关,仅和卷积核的大小,偏置及BN有关. 1.每个卷积层的参数量,+1表示偏置: Co x (Kw x ...
- 卷积层和全连接层的区别_CNN卷积层、全连接层的参数量、计算量
我们以VGG-16为例,来探讨一下如何计算卷积层.全连接层的参数量.计算量.为了简单.直观地理解,以下讨论中我们都会忽略偏置项,实践中必须考虑偏置项. [卷积层的参数量] 什么是卷积层的参数? 卷积层 ...
- 卷积神经网络的参数计算
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/qian99/article/deta ...
- 深度学习中参数量与计算量的理解
接下来要分别概述以下内容: 1 首先什么是参数量,什么是计算量 2 如何计算 参数量,如何统计 计算量 3 换算参数量,把他换算成我们常用的单位,比如:mb 4 对于各个经典网络,论述他们是计算量大还 ...
- 卷积核的参数量和计算量
卷积核的参数量和计算量 1. 参数量计算 1.1 普通卷积 输入特征图尺寸 CxHxW 输出特征图尺寸 OxHxW 卷积核尺寸 kxkxC(O个kxkxC的卷积) 权重 kxkxCxO 偏置 O BN ...
- Pytorch 计算参数量与计算量Flops
获取网络模型的每一层参数量与计算量(Flops)---Pytorch 分析网络的参数量与计算量: 1.ptflops 安装: pip install --upgrade git ...
- 深度神经网络TensorFlow基础学习(3)——卷积神经网络的参数个数和张量大小
今天,我们来分享一篇博文,关于如何计算图像张量的大小以及确定卷积神经网络各层参数个数的公式.假设我们已经熟悉了卷积神经网络相关概念.在这里,我们把张量定义为有任意通道数的图像. 张量是在深度学习中表示 ...
- 卷积神经网络的参数设置,卷积神经网络基本结构
卷积神经网络算法是什么? 一维构筑.二维构筑.全卷积构筑. 卷积神经网络(ConvolutionalNeuralNetworks,CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedfor ...
最新文章
- 查看linux机器是32位还是64位的方法
- Maven工程构建时报编码警告的解决办法
- 设计模式之【外观模式-Facade】
- centos7.5 下LNMP搭建
- 翻译qmake文档(二) Getting Started
- PHP数组的使用方法小结
- Microsoft Visual Studio Team Foundation Server Express 2013 (一) 服务器端安装和配置
- 关于开学,我的心路历程~我已不想开学了
- FindTask练习
- 【转】常见面试题思想方法整理--- 原来果然有双指针遍历
- flex和blazeds_Java程序员学习Flex和BlazeDS的13个理由
- 苹果大中华区营收同比增48% iPhone销量翻番
- 毛咕咕 百度有啊现在每天的成交量:
- [转]织梦标签全攻略
- 生信分析过程中这些常见文件(fastq/bed/gtf/sam/bam/wig)的格式以及查看方式你都知道吗?
- Spring Cloud 配置中心乱码解决
- 智能秤方案设计——蓝牙体脂秤PCBA软硬件端功能说明
- 单片机c语言篮球比分_单片机和C语言的篮球计时计分器设计
- ios备忘录下载安卓版_安利3款手机实用软件,安卓和ios都有份
- PCL安装教程 1.8.0+VS2013+cmake+QT5.5.1
热门文章
- python生成器_Python生成器
- struts2 log4j_Struts2和Log4j集成示例项目
- Android Studio 编译失败 Could not read entry ':app:processDebugManifest' from cache taskArtifacts.bin
- Web前端开发如何提高技术水平!
- vscode中vue-cli项目es-lint的配置
- WEB前端性能优化基本套路
- SQL中inner join、outer join和cross join的区别
- ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案
- 高效的设计可视化UI
- Varnish 503错误