深度学习模型设计

持续更新

Posted on Jan.16, 2020


卷积神经网络的复杂度分析

    CNN经典模型演进中的很多创新点都与改善模型计算复杂度紧密相关,就让我们对卷积神经网络的复杂度分析简单总结一下下。
  • 时间复杂度
  • 1.1 单个卷积层的时间复杂度
  • $$ Time\sim O(M^{2}\cdot K^{2}\cdot C_{in}\cdot C_{out})$$ \(M\) 每个卷积核输出特征图(Feature Map)的边长
    \(K\) 每个卷积核(Kernel)的边长
    \(C_{in}\) 每个卷积核的通道数,也即输入通道数,也即上一层的输出通道数。
    \(C_{out}\) 本卷积层具有的卷积核个数,也即输出通道数。
    可见,每个卷积层的时间复杂度由输出特征图面积\(M^{2}\) 、卷积核面积\(K^{2}\)、输入\(C_{in}\)和输出通道数\(C_{out}\) 完全决定。 注1:统一假设输入和卷积核都是正方形。
    注2:每层还包含1个\(Bias\)参数,这里为了简洁就省略了。
    注3:$$ M = (X - K + 2*Padding)/ Stride + 1 ,$$\(X\)表示输入矩阵尺寸。
  • 1.2 卷积神经网络整体的时间复杂度
  • $$ Time\sim O(\sum_{l=1}^{D}M^{2}\cdot K^{2}\cdot C_{l-1}\cdot C_{l})$$ 可见,CNN整体的时间复杂度也比较便宜估算,只是所有卷积层的时间复杂度累加而已。 简而言之,层内(参数)连乘,层间累加。

飞线

    多路分支的合并操作,有Concat和Elementise(Add)操作
  • ElementWise-Add: 需要考虑两个分支的输出是合理的,比如Conv+ReLU的两个分支,进行Add操作是不合理的,因为会导致输出值 过大而飞掉。此时Conv+BN+ReLU,因为批归一化的关系,使得值域在小数范围内,Add操作是可以的不会飞。
  • Concat: 该操作下,需要两个分支的结果分布是一致的。如果不一致的分布concat会导致训练不合理而紊乱。
  • 总而言之,两个分支合并做操作,一定要保证值域或者说分布是合理的。