整个大活,给大核卷积提提速?
转自AI Studio,原文链接:整个大活,给大核卷积提提速? - 飞桨AI Studio🌈前言不知道做视觉领域的同学上一年是不是痛并快乐着:在去年首先一个重磅炸弹的就是注意力机制引入了视觉领域,从Vit,Diet再到登顶多个下游任务的Swin Transformer,似乎都预示着一件事——CNN的时代已经结束接下来将是attention的天下,但是!ConvNext的提出又给了at
转自AI Studio,原文链接:整个大活,给大核卷积提提速? - 飞桨AI Studio
🌈前言
不知道做视觉领域的同学上一年是不是痛并快乐着:在去年首先一个重磅炸弹的就是注意力机制引入了视觉领域,从Vit,Diet再到登顶多个下游任务的Swin Transformer,似乎都预示着一件事——CNN的时代已经结束接下来将是attention的天下,但是!ConvNext的提出又给了attention当头一棒!ConvNext在参数量相同的情况下,与Swin的成绩不相上下,但是速度整整快了50%以上,ConvNext在论文中含蓄的提到Swin的成功可能并不是注意力机制而是由于时代的进步(比如,更好的优化器,更好的硬件,更好的训练策略等等)当然ConvNext仍然说Swin是一个很好论文,也确实毕竟人家能用注意力机制登顶Imagenet就很牛的,而CVPR2022中一篇论文更是之言,Swin的提升可能就是因为它在进行窗口划分的时候使用的是大卷积核进行的划分(ΩДΩ),这篇论文就一个观点——卷积核越大越有效,那么根据这篇论文我们也可以推论ConvNext的提升也是因为使用了大卷积核,当然肯定不可能只是这个,这只是我们的妄加猜测。但是!无论注意力机制与大核卷积都有一个共同的问题那就是慢!
与传统的CNN网络相比 他俩是在是太慢了。就用ConvNext来说吧,我使用PPYOLOE作为基准,将PPYOLOE原版的CSPResNet替换为ConvNeXt,在eval环节原本PPYOLOE在1080ti上能达到24-26fps,而将Backbone更换为ConvNext,eval环节就掉到了16fps
而在基准测试中
Backbone | paramters | Gflops | infer time |
---|---|---|---|
CSPResNet | 53146950 | 55.5G | 27.7ms |
ConvNext | 59550287 | 26.7G | 49.20ms |
更换backbone为ConvNext的ppyoloE改,在paramters稍微增大,但是Gflops大幅下降的情况下它的infer time几乎快要是原版PPYOLOE的两倍!那么你检测速度降低那么多那你的检测精度一定提升很多吧
Backbone | paramters | Gflops | infer time | Map 50 |
---|---|---|---|---|
CSPResNet | 53146950 | 55.5G | 27.7ms | 49.5 |
ConvNext | 59550287 | 26.7G | 49.20ms | 52.3 |
哈哈,我这是使用的那个侧扫声呐数据集它只有1000张然后特征比较难提取所以我就用VOC评价标准Map50下ConvNext比SCPResNet提高了不到三个点,也还行,
但是!他的速度降低了几乎快1/2,那么如果是为了准求精度那我直接用Cascade RCNN加大核卷积!!
那么下面就是正题了,怎么给这个慢的要死的大核卷积提提速呢?下面就让我们进入正题吧!!!
如何给你的网络提速?
如果是传统的提速方法,一般就是裁切,或者蒸馏,这方面已经有paddleslim了
PaddleSlim效果
- YOLOv3: 在移动端SD855上加速3.55倍。
- PP-OCR: 体积由8.9M减少到2.9M, 在SD855上加速1.27倍。
- BERT: 模型参数由110M减少到80M,精度提升的情况下,Tesla T4 GPU FP16计算加速1.47倍。
但是这都是一些借助外力的手段,他们并不是在网络层进行创新,那么有没有一些比较好的结果能够降低网络计算量,提高网络的可训练程度呢?
那么这又请到了我们的老朋友CSP结果,在PP-YOLOE中作者将CSP与ResNet向结合,并且借鉴了RepVGG网络,但是我确实没有感觉到PPYOLOE的速度比PPYOLOv2快了很多,这个问题有空再聊。
我们这里借鉴了CSPNet的思想同样的把ConvNeXt更换为CSPConvNeXt,相关的代码我已经整合到了PaddleClas中
github convNeXt地址](https://github.com/violetweir/convnext)
代码中有ConvNext与CSPConvNeXt,但是CSPConvNeXt目前有点问题一会再跟大家细说
在102花分类的数据集中,经过对比ConvNeXt与CSPConvNeXt的精度相差无几,所以我就更有信心去做接下来的工作了,毕竟你不能速度上去了但是精度又降下来了呀!
然后在PaddleClas中我们进行了一下flops测试
结果如下
网络 | paramters | flops |
---|---|---|
ConvNeXt-tiny | 27.2M | 4.15G |
CSPConvNeXt-tiny | 8.2M | 1.1G |
对的你没看错 !仅仅是使用了CSP结构ConvNext的parmeters降低了接近70% 而Flops直接几乎相当于原来26%!这是什么网络??!!!!! 而且这还包括了分类头,如果我们将分类头扔掉原版ConvNext的分类头ConvNext的paramters降低到了26.5M而CSPConvNext的paramter更是降低到了7.5M,这一下连Paramters也差不多是原本的百分之20多了!
那么既然模型小了这么些那效果如何呢
网络 | top-1 |
---|---|
ConvNext | 82.04 |
CSPConvNext(257epoch) | 77.58 |
目前CSPConvNext仍在训练目前已经到了77.58的精度,可以看到其与原版ConvNext的差距仍然较大,到了300轮训练完成预计也就差不多79的精度,这是因为什么呢 ?这是因为我一不小心没有设置初始化导致的
在之前的102花分类中我看着精度差不多我就以为不做初始化没啥问题,结果我人麻了呀,这可是我花了600多块钱租的服务器呀
瞬间觉得我就是一个小丑
然后我按照ConvNext的初始化方法把CSPConvNext初始化之后又出现了问题,就是CSPConvNext中原版COnvNext的结构都能初始化结果CSP结构不能初始化,你说这不有病嘛这是!然后我检查发现原来我在设置Conv2D的时候把bias_attr==False了,等我删了,然后一切就好了。等今天晚上CSPCovnNext出结果了,我到时候再初始化一下重新跑一遍。
我也已经把ConvNext和CSPConvNext一起集成到了PaddleDetection中等过段时间整理一下给放出来
Backbone | paramters | Gflops | infer time | Map 50 |
---|---|---|---|---|
CSPResNet | 53146950 | 55.5G | 27.7ms | 49.5 |
ConvNext | 59550287 | 26.7G | 49.20ms | 52.3 |
CSPConvNext | 39621488 | 28.5G | 30.80ms | 52.3 |
首先看到这个MAP请不要着急,这是因为我的CSPConvNext没有ImageNet1k预训练模型,就是裸跑,另外两个裸跑的成绩比这个还惨,之后我会等初始化好了之后再训练一版新的然后再跑一遍。
可以看到CSP结构给ConvNext直接提速了接近百分之40%,让网络回到了与CSPResNet相同的水平线上,同时可以看到CSP对于大卷积核的优化效果甚至是要比3x3卷积的优化还要好,也就是说相比较3x3的卷积网络使用CSP结构,大卷积核无论是从计算量优化,提升预测速度等方面考虑更适合使用CSP结构。
所以我认为以后的大核卷积可能上CSP结构是一个标配了可能,因为无论是从优化计算量,还是提升速度等方面CSP结构都十分契合大核卷积,同时CSP结构在以往的认知中在目标检测领域都是提分的存在,我相信将其应用在大核卷积上肯定也能一定程度提高其准确率。
结束语
这可能是我目前做的最大的一个小项目,这个项目前前后后做了10多天,还没有做完,但是我觉得这次可能真的能比较好的帮助到大家,我想着做出来分享给大家。感谢观看
姓名 | 李慧涛 |
---|---|
昵称 | 老萌新 |
学校 | 北京石油化工学院 |
年级 | 大二 |
木有女朋友 | 是条单身狗 |
更多推荐
所有评论(0)