🍉 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 的计算量和参数数量,需要:

  1. 分析网络架构中的每一层
  2. 根据上述方法计算每层的 FLOPs 和参数数
  3. 将所有层的结果相加

注意事项:

  • 实际运行时的计算量可能与理论估计有差异,因为现代硬件和优化技术可能会影响实际性能。
  • 某些操作(如数据传输)虽然不直接体现在 FLOPs 中,但也会影响实际运行时间。
  • 在设计神经网络时,平衡计算复杂度和模型性能是很重要的。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐