本节为ML/DL-复习笔记【九】- 神经网络中各层的计算量与参数量,主要内容包括:标准卷积、空洞卷积、转置卷积、深度可分离卷积以及全连接层的计算量、参数量与输出特征图尺寸计算。
1. 标准卷积
1.1 计算量
计算量以做乘法和加法的次数为单位,对于输入特征图f=(B,H,W,C),卷积核kernel=(K,S,C,O)【(核尺寸,步长,输入通道数,输出通道数)】。
首先看一次卷积的计算量,一个 k × k k\times k k×k的卷积,执行一次卷积操作,需要 k × k k\times k k×k次乘法操作(卷积核每个参数都要和特征图上的像素相乘一次)和 k × k − 1 k\times k-1 k×k−1次加法操作( k × k k\times k k×k个数加起来),所以一次卷积需要乘加次数为 k × k + k\times k+ k×k+ k × k − 1 = 2 × k × k − 1 k\times k-1=2\times k\times k-1 k×k−1=2×k×k−1。
接着看在一个特征图上执行卷积需要进行卷积的次数:
(
H
−
K
+
P
h
S
+
1
)
×
(
W
−
K
+
P
w
S
+
1
)
(\frac{H-K+P_h}{S}+1)\times(\frac{W-K+P_w}{S}+1)
(SH−K+Ph+1)×(SW−K+Pw+1)
其中 P h , P w P_h,P_w Ph,Pw是高和宽方向填充的像素。
然后看C个特征图上还需要乘上C,并且需要输出O个特征图,再考虑batch_size,最终计算量:
B
×
O
×
C
×
(
C
−
1
)
×
(
H
−
K
+
P
h
S
+
1
)
B\times O\times C\times (C-1)\times(\frac{H-K+P_h}{S}+1)
B×O×C×(C−1)×(SH−K+Ph+1)
×
(
W
−
K
+
P
w
S
+
1
)
×
(
2
×
k
×
k
−
1
)
\times(\frac{W-K+P_w}{S}+1) \times(2\times k\times k-1 )
×(SW−K+Pw+1)×(2×k×k−1)
1.2 参数量
卷积层参数量仅仅与卷积核大小、偏置和BN有关,对于卷积核kernel=(K,S,C,O),权重参数量
K
×
K
×
C
×
O
K\times K\times C\times O
K×K×C×O,偏置参数量为O,如果使用了BN,那么还有两个可学习参数
α
,
β
\alpha,\beta
α,β共
2
×
O
2\times O
2×O,所以该卷积层的参数量为:
K
×
K
×
C
×
O
+
O
+
2
×
O
K\times K\times C\times O+O+2\times O
K×K×C×O+O+2×O
1.3 输出特征图尺寸
输入特征图尺寸
H
×
W
×
C
H\times W\times C
H×W×C,卷积核kernel=(K,S,C,O,P)【(核尺寸,步长,输入通道数,输出通道数,填充)】,则:
H
o
u
t
=
(
H
−
K
+
2
P
)
/
S
+
1
H_{out}=(H-K+2P)/S+1
Hout=(H−K+2P)/S+1
W
o
u
t
=
(
W
−
K
+
2
P
)
/
S
+
1
W_{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),相应地,输出特征图尺寸:
H
o
u
t
=
(
H
−
K
−
(
K
−
1
)
∗
(
d
−
1
)
+
2
P
)
/
S
+
1
H_{out}=(H-K-(K-1)*(d-1)+2P)/S+1
Hout=(H−K−(K−1)∗(d−1)+2P)/S+1
W
o
u
t
=
(
W
−
K
−
(
K
−
1
)
∗
(
d
−
1
)
+
2
P
)
/
S
+
1
W_{out}=(W-K-(K-1)*(d-1)+2P)/S+1
Wout=(W−K−(K−1)∗(d−1)+2P)/S+1
空洞卷积并没有引入额外的参数量,但是显然会增加计算量。
3. 转置卷积
3.1 特征图尺寸
转置卷积的输入是标准卷积的输出,二者对调即可:
H
i
n
=
(
H
o
u
t
−
K
+
2
P
)
/
S
+
1
H_{in}=(H_{out}-K+2P)/S+1
Hin=(Hout−K+2P)/S+1
W
i
n
=
(
W
o
u
t
−
K
+
2
P
)
/
S
+
1
W_{in}=(W_{out}-K+2P)/S+1
Win=(Wout−K+2P)/S+1
⟹
\Longrightarrow
⟹
H
o
u
t
=
(
H
i
n
−
1
)
×
S
−
2
P
+
K
H_{out}=(H_{in}-1)\times S-2P+K
Hout=(Hin−1)×S−2P+K
W
o
u
t
=
(
W
i
n
−
1
)
×
S
−
2
P
+
K
W_{out}=(W_{in}-1)\times S-2P+K
Wout=(Win−1)×S−2P+K
3.2 计算方式
对于转置卷积:
4. 深度可分离卷积
特征图尺寸计算核标准卷积一样。
4.1 计算量
输入特征图尺寸
(
D
f
,
D
f
,
M
)
,
(D_f,D_f,M),
(Df,Df,M),卷积核
(
D
k
,
D
k
,
M
,
N
)
[
卷
积
核
尺
寸
,
输
入
和
输
出
通
道
数
]
(D_k,D_k,M,N)[卷积核尺寸,输入和输出通道数]
(Dk,Dk,M,N)[卷积核尺寸,输入和输出通道数],输出特征图尺寸
(
D
G
,
D
G
,
N
)
(D_G,D_G,N)
(DG,DG,N),计算量:
D
K
∗
D
K
∗
M
∗
N
∗
D
F
∗
D
F
D_K*D_K*M*N*D_F*D_F
DK∗DK∗M∗N∗DF∗DF
拆分之后,深度卷积负责滤波,尺寸
(
D
k
,
D
k
,
1
,
M
)
(D_k,D_k,1,M)
(Dk,Dk,1,M),输出特征图
(
D
G
,
D
G
,
M
)
(D_G,D_G,M)
(DG,DG,M);逐点卷积负责通道转换,尺寸
(
1
,
1
,
M
,
N
)
(1,1,M,N)
(1,1,M,N),最终输出
(
D
G
,
D
G
,
N
)
(D_G,D_G,N)
(DG,DG,N),计算量:
D
K
∗
D
K
∗
M
∗
D
F
∗
D
F
+
M
∗
N
∗
D
F
∗
D
F
D_K*D_K*M*D_F*D_F+M*N*D_F*D_F
DK∗DK∗M∗DF∗DF+M∗N∗DF∗DF
4.2 参数量
M ∗ K ∗ K + N ∗ M M*K*K+N*M M∗K∗K+N∗M
5. 全连接层
考虑输入特征图尺寸 7 × 7 × 512 7\times 7\times 512 7×7×512,全连接层将特征图展开为一维向量 1 × 4096 1\times 4096 1×4096,实际上用了4096个 7 × 7 × 512 7\times 7\times 512 7×7×512的滤波器去做卷积,参数量来到了 7 × 7 × 512 × 4096 = 102760448 7\times 7\times 512\times 4096=102760448 7×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等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]