🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/
1. 卷积层(Convolutional Layer)
a) 计算量估计:
卷积层的 FLOPs = 2 * H_out * W_out * C_in * C_out * K_h * K_w
详细解释:
- H_out, W_out:输出特征图的高度和宽度
- C_in:输入通道数
- C_out:输出通道数(卷积核数量)
- K_h, K_w:卷积核的高度和宽度
- 乘以 2 是因为每次卷积操作包含一次乘法和一次加法
注意:输出特征图的尺寸可以通过以下公式计算:
H_out = (H_in - K_h + 2P) / S + 1
W_out = (W_in - K_w + 2P) / S + 1
其中,H_in 和 W_in 是输入特征图的高度和宽度,P 是填充(padding),S 是步长(stride)。
b) 参数数量估计:
卷积层的参数数 = (K_h * K_w * C_in + 1) * C_out
解释:
- K_h * K_w * C_in 是每个卷积核的权重数量
- 加 1 是因为每个卷积核还有一个偏置项(bias)
- 乘以 C_out 是因为有 C_out 个卷积核
2. 全连接层(Fully Connected Layer)
a) 计算量估计:
全连接层的 FLOPs = 2 * N_in * N_out
解释:
- N_in:输入神经元数量
- N_out:输出神经元数量
- 乘以 2 同样是因为每个连接包含一次乘法和一次加法
b) 参数数量估计:
全连接层的参数数 = (N_in + 1) * N_out
解释:
- N_in * N_out 是权重的数量
- 加 1 再乘以 N_out 是因为每个输出神经元有一个偏置项
3. 池化层(Pooling Layer)
a) 计算量估计:
对于最大池化(Max Pooling):FLOPs ≈ H_out * W_out * C * K_h * K_w
对于平均池化(Average Pooling):FLOPs ≈ 2 * H_out * W_out * C * K_h * K_w
解释:
- H_out, W_out:输出特征图的尺寸
- C:通道数(与输入相同)
- K_h, K_w:池化窗口的高度和宽度
b) 参数数量:池化层通常没有可学习的参数
4. 激活函数(Activation Functions)
激活函数的计算量通常较小,但在精确计算时可以考虑:
ReLU 的 FLOPs ≈ H * W * C (仅需要比较操作)
Sigmoid
/
{/}
/Tanh 的 FLOPs 会更多,因为涉及指数计算
5. 批归一化层(Batch Normalization)
a) 计算量估计:
BN 层的 FLOPs ≈ 4 * H * W * C
解释:需要计算均值、方差、归一化和缩放 / {/} / 平移
b) 参数数量:
BN 层的参数数 = 2 * C (每个通道有一个缩放因子和一个平移因子)
6. 总体估算
要估算整个 CNN 的计算量和参数数量,需要:
- 分析网络架构中的每一层
- 根据上述方法计算每层的 FLOPs 和参数数
- 将所有层的结果相加
注意事项:
- 实际运行时的计算量可能与理论估计有差异,因为现代硬件和优化技术可能会影响实际性能。
- 某些操作(如数据传输)虽然不直接体现在 FLOPs 中,但也会影响实际运行时间。
- 在设计神经网络时,平衡计算复杂度和模型性能是很重要的。