卷积操作复杂度公式推导
1. 输入特征图
假设输入特征图的形状为:
输入特征图
=
H
in
×
W
in
×
C
in
\text{输入特征图} = H_{\text{in}} \times W_{\text{in}} \times C_{\text{in}}
输入特征图=Hin×Win×Cin
- H in H_{\text{in}} Hin:输入特征图的高度。
- W in W_{\text{in}} Win:输入特征图的宽度。
- C in C_{\text{in}} Cin:输入特征图的通道数。
2. 卷积核
假设卷积核的形状为:
卷积核
=
k
×
k
×
C
in
×
C
out
\text{卷积核} = k \times k \times C_{\text{in}} \times C_{\text{out}}
卷积核=k×k×Cin×Cout
- k × k k \times k k×k:卷积核的空间大小(例如 3 × 3 3 \times 3 3×3)。
- C in C_{\text{in}} Cin:输入通道数(卷积核对每个输入通道单独操作)。
- C out C_{\text{out}} Cout:输出通道数,每个卷积核生成一个输出通道。
3. 输出特征图
假设输出特征图的形状为:
输出特征图
=
H
out
×
W
out
×
C
out
\text{输出特征图} = H_{\text{out}} \times W_{\text{out}} \times C_{\text{out}}
输出特征图=Hout×Wout×Cout
- H out H_{\text{out}} Hout 和 W out W_{\text{out}} Wout:输出特征图的高度和宽度,取决于卷积操作的填充和步幅。
- C out C_{\text{out}} Cout:输出特征图的通道数。
4. 每个输出像素的计算量
对于输出特征图中的 一个像素,卷积操作会在输入特征图的一个局部窗口上执行操作:
- 局部窗口的大小为 k × k k \times k k×k。
- 每个输入通道的局部窗口有 k × k k \times k k×k 个像素。
- 总的输入通道有 C in C_{\text{in}} Cin 个通道。
因此,每个输出像素的计算量为:
计算量
单像素
=
k
×
k
×
C
in
\text{计算量}_{\text{单像素}} = k \times k \times C_{\text{in}}
计算量单像素=k×k×Cin
- k × k k \times k k×k 是窗口大小。
- C in C_{\text{in}} Cin 是输入通道数。
5. 整个输出特征图的计算量
整个输出特征图共有 H out × W out × C out H_{\text{out}} \times W_{\text{out}} \times C_{\text{out}} Hout×Wout×Cout 个像素,每个像素需要进行 k × k × C in k \times k \times C_{\text{in}} k×k×Cin 次乘加运算。
因此,整个卷积操作的计算量为:
复杂度
=
H
out
⋅
W
out
⋅
C
out
⋅
C
in
⋅
k
2
\text{复杂度} = H_{\text{out}} \cdot W_{\text{out}} \cdot C_{\text{out}} \cdot C_{\text{in}} \cdot k^2
复杂度=Hout⋅Wout⋅Cout⋅Cin⋅k2
6. 公式各项的意义
- H out ⋅ W out H_{\text{out}} \cdot W_{\text{out}} Hout⋅Wout:输出特征图的空间尺寸,即需要计算多少个输出像素。
- C out C_{\text{out}} Cout:输出通道数,每个通道对应一个卷积核。
- C in C_{\text{in}} Cin:输入通道数,每个卷积核需要处理所有输入通道的局部特征。
- k 2 k^2 k2:卷积核的空间大小(例如 3 × 3 = 9 3 \times 3 = 9 3×3=9)。
7. 举例说明
假设输入特征图为 32 × 32 × 3 32 \times 32 \times 3 32×32×3,卷积核为 3 × 3 3 \times 3 3×3,输出特征图为 30 × 30 × 64 30 \times 30 \times 64 30×30×64:
-
输出特征图共有:
H out ⋅ W out ⋅ C out = 30 ⋅ 30 ⋅ 64 = 57 , 600 个像素 H_{\text{out}} \cdot W_{\text{out}} \cdot C_{\text{out}} = 30 \cdot 30 \cdot 64 = 57,600 \text{ 个像素} Hout⋅Wout⋅Cout=30⋅30⋅64=57,600 个像素 -
每个输出像素需要的计算量为:
k 2 ⋅ C in = 3 ⋅ 3 ⋅ 3 = 27 k^2 \cdot C_{\text{in}} = 3 \cdot 3 \cdot 3 = 27 k2⋅Cin=3⋅3⋅3=27 -
总计算量为:
复杂度 = H out ⋅ W out ⋅ C out ⋅ C in ⋅ k 2 \text{复杂度} = H_{\text{out}} \cdot W_{\text{out}} \cdot C_{\text{out}} \cdot C_{\text{in}} \cdot k^2 复杂度=Hout⋅Wout⋅Cout⋅Cin⋅k2= 30 ⋅ 30 ⋅ 64 ⋅ 27 = 1 , 555 , 200 = 30 \cdot 30 \cdot 64 \cdot 27 = 1,555,200 =30⋅30⋅64⋅27=1,555,200
8. 总结
卷积操作的计算复杂度公式为:
复杂度
=
H
out
⋅
W
out
⋅
C
out
⋅
C
in
⋅
k
2
\text{复杂度} = H_{\text{out}} \cdot W_{\text{out}} \cdot C_{\text{out}} \cdot C_{\text{in}} \cdot k^2
复杂度=Hout⋅Wout⋅Cout⋅Cin⋅k2
该公式反映了卷积核作用于每个像素时的局部操作和跨通道的计算需求。
卷积计算复杂度与输入尺寸 线性相关,因此在高分辨率图像任务中,CNN 的计算效率较高。