CNN 模型复杂度分析

本文主要介绍 CNN 模型复杂度的分析,通常来说模型复杂度一般我们关注:1)时间复杂度:模型训练和推理速度;2)占用 GPU 大小。


 

 

 

模型训练和推理速度

模型的训练和推理速度由“运算量”决定,即 FLOPs,“运算量”代表模型的时间复杂度。FLOPs 越大,模型训练和推理越慢,对于 CNN,每个卷积层运算量如下:

 FLOPs=[(Ci×k2)+(Ci×k21)+1]×Co×W×H

其中 Ci 代表输入通道数,Co 代表输出通道数,k 代表卷积核大小,W 和 H 代表 Feature Maps 的尺寸,上式中的 (Ci×k2) 部分为乘法运算,(Ci×k21) 部分为加法运算,+1 为 Bias 运算。而 CV 领域论文中常常将 “Multi-Add” 组合视为一次浮点运算:

FLOPs=Ci×k2×C0×W×H

对于 FC 层:

FLOPs=[I+(I1)+1]×O=2×I×O

其中 I 代表 Input Nerons,O 代表 Output Nerons。

对于激活层的参数计算:

1)Sigmoid:FLOPs=3n

2)ReLU:FLOPs=n

其中 n 代表 n 个神经元,但通常激活层的计算量忽略不计。


 

 

 

模型占用 GPU 空间大小

 模型占用 GPU 的访存量大小由两部分组成:1)模型的参数量;2)各层输出 Feature Maps 的大小。

 

其中模型的参数量只和卷积核的尺寸、通道数和层数相关,与输入数据的大小无关。模型参数量大小对模型具体的影响是,由于维度诅咒的限制,模型的参数越多,训练模型所需的数据量就越大,这会导致模型的训练更容易过拟合。通常模型裁剪可以有效减少模型参数,但由于卷积核的空间尺寸通常已经很小(3x3),而网络的深度又与模型的表征能力紧密相关,不宜过多削减,因此模型裁剪通常最先对通道数进行裁剪。

 

Inception 系列就是模型优化的典型例子,当中例如:v1 中 1x1 卷积、GAP 代替 Flatten、v2 中使用两个 3x3 代替 5x5、v3 中用 Nx1 与 1xN 代替 NxN、Xception 中使用 Depth-wise Separable Convolution 等都是优化模型的方法手段,当中一些方法的基本逻辑都是“乘变加”。


 

 

 

模型复杂度分析工具

可以用 torchsummary 包来分析模型复杂度。


 

 

 

 

所以,不一定模型训练或者推理时占用 GPU 越大,模型的训练或推理速度就越慢。

 

posted @   hmlovetech  阅读(1813)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示