本节为ML/DL-复习笔记【九】- 神经网络中各层的计算量与参数量,主要内容包括:标准卷积、空洞卷积、转置卷积、深度可分离卷积以及全连接层的计算量、参数量与输出特征图尺寸计算。
1. 标准卷积
1.1 计算量
计算量以做乘法和加法的次数为单位,对于输入特征图f=(B,H,W,C),卷积核kernel=(K,S,C,O)【(核尺寸,步长,输入通道数,输出通道数)】。
首先看一次卷积的计算量,一个k×kktimes kk×k的卷积,执行一次卷积操作,需要k×kktimes kk×k次乘法操作(卷积核每个参数都要和特征图上的像素相乘一次)和k×k−1ktimes k-1k×k−1次加法操作(k×kktimes kk×k个数加起来),所以一次卷积需要乘加次数为k×k+ktimes k+k×k+k×k−1=2×k×k−1ktimes k-1=2times ktimes k-1k×k−1=2×k×k−1。
接着看在一个特征图上执行卷积需要进行卷积的次数:
(H−K+PhS+1)×(W−K+PwS+1)(frac{H-K+P_h}{S}+1)times(frac{W-K+P_w}{S}+1) (SH−K+Ph+1)×(SW−K+Pw+1)
其中Ph,PwP_h,P_wPh,Pw是高和宽方向填充的像素。
然后看C个特征图上还需要乘上C,并且需要输出O个特征图,再考虑batch_size,最终计算量:
B×O×C×(C−1)×(H−K+PhS+1)Btimes Otimes Ctimes (C-1)times(frac{H-K+P_h}{S}+1) B×O×C×(C−1)×(SH−K+Ph+1)
×(W−K+PwS+1)×(2×k×k−1)times(frac{W-K+P_w}{S}+1) times(2times ktimes k-1 ) ×(SW−K+Pw+1)×(2×k×k−1)
1.2 参数量
卷积层参数量仅仅与卷积核大小、偏置和BN有关,对于卷积核kernel=(K,S,C,O),权重参数量K×K×C×OKtimes Ktimes Ctimes OK×K×C×O,偏置参数量为O,如果使用了BN,那么还有两个可学习参数α,βalpha,betaα,β共2×O2times O2×O,所以该卷积层的参数量为:
K×K×C×O+O+2×OKtimes Ktimes Ctimes O+O+2times O K×K×C×O+O+2×O
1.3 输出特征图尺寸
输入特征图尺寸H×W×CHtimes Wtimes CH×W×C,卷积核kernel=(K,S,C,O,P)【(核尺寸,步长,输入通道数,输出通道数,填充)】,则:
Hout=(H−K+2P)/S+1H_{out}=(H-K+2P)/S+1 Hout=(H−K+2P)/S+1
Wout=(W−K+2P)/S+1W_{out}=(W-K+2P)/S+1 Wout=(W−K+2P)/S+1
1.4 计算方式
本质上就是卷积矩阵的每一行只是一个重新排列的卷积核矩阵,在不同的地方用零填充:
2. 空洞卷积
一个标准卷积的卷积核kernel=(K,S,C,O,P)【(核尺寸,步长,输入通道数,输出通道数,填充)】引入一个超参数d表示扩张率,则核尺寸k变为k+(k-1)*(d-1),相应地,输出特征图尺寸:
Hout=(H−K−(K−1)∗(d−1)+2P)/S+1H_{out}=(H-K-(K-1)*(d-1)+2P)/S+1 Hout=(H−K−(K−1)∗(d−1)+2P)/S+1
Wout=(W−K−(K−1)∗(d−1)+2P)/S+1W_{out}=(W-K-(K-1)*(d-1)+2P)/S+1 Wout=(W−K−(K−1)∗(d−1)+2P)/S+1
空洞卷积并没有引入额外的参数量,但是显然会增加计算量。
3. 转置卷积
3.1 特征图尺寸
转置卷积的输入是标准卷积的输出,二者对调即可:
Hin=(Hout−K+2P)/S+1H_{in}=(H_{out}-K+2P)/S+1 Hin=(Hout−K+2P)/S+1
Win=(Wout−K+2P)/S+1W_{in}=(W_{out}-K+2P)/S+1 Win=(Wout−K+2P)/S+1
⟹Longrightarrow ⟹
Hout=(Hin−1)×S−2P+KH_{out}=(H_{in}-1)times S-2P+K Hout=(Hin−1)×S−2P+K
Wout=(Win−1)×S−2P+KW_{out}=(W_{in}-1)times S-2P+K Wout=(Win−1)×S−2P+K
3.2 计算方式
4. 深度可分离卷积
特征图尺寸计算核标准卷积一样。
4.1 计算量
输入特征图尺寸(Df,Df,M),(D_f,D_f,M),(Df,Df,M),卷积核(Dk,Dk,M,N)[卷积核尺寸,输入和输出通道数](D_k,D_k,M,N)[卷积核尺寸,输入和输出通道数](Dk,Dk,M,N)[卷积核尺寸,输入和输出通道数],输出特征图尺寸(DG,DG,N)(D_G,D_G,N)(DG,DG,N),计算量:
DK∗DK∗M∗N∗DF∗DFD_K*D_K*M*N*D_F*D_FDK∗DK∗M∗N∗DF∗DF
拆分之后,深度卷积负责滤波,尺寸(Dk,Dk,1,M)(D_k,D_k,1,M)(Dk,Dk,1,M),输出特征图(DG,DG,M)(D_G,D_G,M)(DG,DG,M);逐点卷积负责通道转换,尺寸(1,1,M,N)(1,1,M,N)(1,1,M,N),最终输出(DG,DG,N)(D_G,D_G,N)(DG,DG,N),计算量:
DK∗DK∗M∗DF∗DF+M∗N∗DF∗DFD_K*D_K*M*D_F*D_F+M*N*D_F*D_FDK∗DK∗M∗DF∗DF+M∗N∗DF∗DF
4.2 参数量
M∗K∗K+N∗MM*K*K+N*M M∗K∗K+N∗M
5. 全连接层
考虑输入特征图尺寸7×7×5127times 7times 5127×7×512,全连接层将特征图展开为一维向量1×40961times 40961×4096,实际上用了4096个7×7×5127times 7times 5127×7×512的滤波器去做卷积,参数量来到了7×7×512×4096=1027604487times 7times 512times 4096=1027604487×7×512×4096=102760448,这也就是常说的全连接层参数冗余,能够占到整个网络参数的80%以上。
全连接层计算量和参数量的计算方法一样。
参考:
- 卷积神经网络参数量和计算量的计算
(https://blog.csdn.net/liuweiyuxiang/article/details/99637649)- CNN中卷积层参数量与输出特征图(feature map)尺寸的计算公式
(https://blog.csdn.net/gaishi_hero/article/details/81512404)- 卷积,特征图,转置卷积和空洞卷积的计算细节
(https://www.jianshu.com/p/09ea4df7a788)- 看懂转置卷积
(http://www.360doc.com/content/19/0507/12/57110788_834069126.shtml)- CNN卷积层、全连接层的参数量、计算量(https://zhuanlan.zhihu.com/p/77471991)
欢迎扫描二维码关注微信公众号 深度学习与数学 [每天获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]