模型参数量(Params)和模型每秒浮点运算速度(Flops)
对卷积层而言
Params量计算公式:
(
K
h
∗
K
w
∗
C
i
n
)
∗
C
o
u
t
(K_h*K_w*C_in )*C_out
(Kh∗Kw∗Cin)∗Cout
Flops计算公式:
(
K
h
∗
K
w
∗
C
i
n
∗
C
o
u
t
)
∗
(
H
o
u
t
∗
W
o
u
t
)
(K_h*K_w*C_in*C_out )*(H_out*W_out)
(Kh∗Kw∗Cin∗Cout)∗(Hout∗Wout)
其中
K
h
K_h
Kh和
K
w
K_w
Kw代表了kernel的input_size,
C
i
n
C_in
Cin是input feature map的channel数,
C
o
u
t
C_out
Cout是output feature map的channel数,
H
o
u
t
和
W
o
u
t
H_out和W_out
Hout和Wout分别代表了output feature map的size。
对于全连接层而言
Params量计算公式:
C
i
n
∗
C
o
u
t
C_in*C_out
Cin∗Cout
Flops计算公式:
C
i
n
∗
C
o
u
t
C_in*C_out
Cin∗Cout
FLOPS: floating point operations per second.每秒的浮点运算次数。
MADDs: 即MACCs(multiply-accumulate operations):先乘起来再加起来的运算次数。
例如:
y
=
w
[
0
]
∗
x
[
0
]
+
w
[
1
]
∗
x
[
1
]
+
w
[
2
]
∗
x
[
2
]
+
.
.
.
+
w
[
n
−
1
]
∗
x
[
n
−
1
]
y = w[0]*x[0] + w[1]*x[1] + w[2]*x[2] + ...+ w[n-1]*x[n-1]
y=w[0]∗x[0]+w[1]∗x[1]+w[2]∗x[2]+...+w[n−1]∗x[n−1]
w 和 x 都是向量,y 是标量。上式是全连接层或卷积层的典型运算。一次乘-加运算即一次乘法+一次加法运算,所以上式的 MACCs 是n 。
不过可以看到,加法运算的次数并非 n 而是 n-1 。但考虑 MACCs 时可以类比算法复杂度估算的 big-O ,即结果可以是近似的。
而换到 FLOPS 的情况,点积做了 2n-1 FLOPS,即 n-1 次加法和 n 次乘法。可以看到,MACCs 大约是 FLOPS 的一半。
一个MFLOPS(megaFLOPS)等于每秒一百万(=10^6)次的浮点运算
一个GFLOPS(gigaFLOPS)等于每秒十亿(=10^9)次的浮点运算
一个TFLOPS(teraFLOPS)等于每秒一万亿(=10^12)次的浮点运算
深度学习网络模型的运算复杂度、空间占用和内存访问情况计算
衡量模型的快慢不仅仅是参数量、计算量的多少,还有内存访问的次数。