参考https://www.cnblogs.com/qinduanyinghua/p/11302618.html
0. 变量定义
假设输入的特征图(feature map)的shape为[Height, Weight, Channel],对应的字母表示为
[
H
i
n
,
W
i
n
,
C
i
n
]
[ H_{in}, W_{in}, C_{in}]
[Hin,Win,Cin]; 卷积核(kernel)的shape为
[
H
k
,
W
k
]
[H_{k}, W_{k}]
[Hk,Wk], 滤波器(filter)的shape为
[
C
o
u
t
,
H
o
u
t
,
W
o
u
t
,
C
i
n
]
[C_{out}, H_{out}, W_{out}, C_{in}]
[Cout,Hout,Wout,Cin]; 输出的feature map的shape为
[
H
o
u
t
,
W
o
u
t
,
C
o
u
t
]
[H_{out}, W_{out}, C_{out}]
[Hout,Wout,Cout];padding=
[
P
1
,
P
2
]
[P_1, P_2]
[P1,P2];stridding=
[
S
1
,
S
2
]
[S_1, S_2]
[S1,S2]
不难推出:
H
o
u
t
=
[
H
i
n
+
2
P
1
−
H
k
S
1
]
+
1
(0-1)
H_{out}=\left[\frac{H_{in}+2P_1-H_k}{S_1}\right]+1\tag{0-1}
Hout=[S1Hin+2P1−Hk]+1(0-1)
W
o
u
t
=
[
W
i
n
+
2
P
2
−
W
k
S
2
]
+
1
(0-2)
W_{out}=\left[\frac{W_{in}+2P_2-W_k}{S_2}\right]+1\tag{0-2}
Wout=[S2Win+2P2−Wk]+1(0-2)
其中
[
]
[\ \ ]
[ ]代表向下取整
1. 卷积层的参数量计算
卷积核(kernel)的参数量:
H
k
×
W
k
H_{k}\times W_{k}
Hk×Wk
滤波器(filter)的参数量:
C
o
u
t
×
H
k
×
W
k
×
C
i
n
C_{out}\times H_{k}\times W_{k}\times C_{in}
Cout×Hk×Wk×Cin
bias参数量:
C
o
u
t
C_{out}
Cout
总的参数量:
C
o
u
t
×
H
k
×
W
k
×
C
i
n
+
C
o
u
t
C_{out}\times H_{k}\times W_{k}\times C_{in}+C_{out}
Cout×Hk×Wk×Cin+Cout
2. 卷积操作的计算量
2.1. 乘法计算量
为了得到输出feature map的一个像素点,需要进行 C i n × H k × W k C_{in}\times H_k\times W_k Cin×Hk×Wk次乘法操作。因此为了得到整个输出feature map,需要进行 C o u t × H o u t × W o u t × C i n × H k × W k C_{out}\times H_{out}\times W_{out}\times C_{in}\times H_k\times W_k Cout×Hout×Wout×Cin×Hk×Wk次乘法。
2.2. 加法计算量
为了得到输出feature map的一个像素点,需要进行
C
i
n
×
(
H
k
×
W
k
−
1
)
+
(
C
i
n
−
1
)
+
1
=
C
i
n
×
H
k
×
W
k
C_{in}\times (H_k\times W_k-1)+(C_{in}-1)+1=C_{in}\times H_k\times W_k
Cin×(Hk×Wk−1)+(Cin−1)+1=Cin×Hk×Wk次加法操作。注意最后一个1是bias。因此为了得到整个输出feature map,需要进行
C
o
u
t
×
H
o
u
t
×
W
o
u
t
×
C
i
n
×
H
k
×
W
k
C_{out}\times H_{out}\times W_{out}\times C_{in}\times H_k\times W_k
Cout×Hout×Wout×Cin×Hk×Wk次加法。
居然和乘法计算量一样!