优化实践 | 大改ShuffleNetV2网络,注意力机制,csp,卷积裁剪...(附全部开源代码)...
欢迎关注“
计算机视觉研究院
”
计算机视觉研究院专栏
作者:郑老师
源码:关注文末二维码(DL工程实践)公众号,获取免费全部代码
目录结构
1、背景介绍
2、提升精度措施
3、降低计算量
shufflenet_se网络
shufflenet_sk网络
shufflenet_liteconv网络
shufflenet_k5网络
shufflenet_csp网络
4、实验测试
5、总结
1.背景
在移动端场景中,目前有很多不错的轻量级网络可以选择,例如google的mobilenet系列,efficient lite系列,旷世的shufflenet系列,华为的ghostnet等。在这些模型中,我尤其喜欢shufflenetV2,因为它结构清晰,简洁(如下图所示为shufflenetv2 1.0x的结构图:红色标注为各个模块的flops),并且在设计之初就考虑了MAC(访存代价),使得在移动端部署的时候具有很低的延时。在多个数据集上的测试也验证了其较好的泛化性能。不过有时候为了实现在更低计算资源的嵌入式场景中使用shufflenet,或者在轻量级检测框架中使用shufflenet作为bakbone,那么仍然需要对shufflenet做一些优化。
本次实践将围绕对shufflenetV2 1.0X版本进行改进,包括提升精度与降低计算量两个维度。看看能否创造出一个比基线版本更优的shufflenet结构。在不加注释的情况下,下文的shufflenet默认指的是shufflenet v2 1.0x版本。
2、提升精度措施
结合目前比较火的注意力机制,例如senet,sknet等,这里分别设计四个网络:
增加se注意力机制的:shufflenet_se网络
增加sk注意力机制的:shufflenet_sk网络
将3*3的depthwise卷积扩大为5*5:shufflenet_k5网络
3、降低计算量
使用卷积裁剪以及csp技术,分别设计两个网络 :
裁剪block中不重要的1*1卷积,这里设计一个shufflenet_liteconv网络
使用csp对网络进行重组,这里设计一个shufflenet_csp网络
shufflenet_se网络
主要是借鉴senet中的通道注意力机制,将其应用到shufflenet中。下面简单回顾一下senet中的注意力机制:
主要有两个操作:squeeze和excitation。squeeze指的是将特征通过GAP压缩空间信息,将原来的c*h*w维度信息压缩为c*1*1. Excitation使用了两个全连接层,第一个降低维度,将c*1*1降维为c/r *1*1(带有relu激活),第二个fc层将特征重新映射回c*1*1(没有relu激活),然后经过sigmoid之后得到各个通道的权重系数。然后将权重系数与原来的特征相乘,从而得到一个新的特征。下面是seattention的pytroch代码实现,非常的简单,就是按照上面的思路实现一遍。
class SeAttention(nn.Module):def __init__(self, channel_num, r=4):""" Constructor"""super(SeAttention, self).__init__()self.channel_num = channel_numself.r = rself.inter_channel = int( float(self.channel_num) / self.r)self.fc_e1 = torch.nn.Linear(channel_num, self.inter_channel)self.relu_e1 = nn.ReLU(inplace=True)self.fc_e2 = torch.nn.Linear(self.inter_channel, channel_num)def forward(self, x):y = torch.nn.functional.adaptive_avg_pool2d(x, (1, 1)).squeeze()y = self.fc_e1(y)y = self.relu_e1(y)y = self.fc_e2(y)y = torch.sigmoid(y).unsqueeze(-1).unsqueeze(-1)return x*y
shufflenet_sk网络
主要是借鉴了sknet中的注意力机制,用于选择大卷积核的输出还是小卷积核的输出。其原理图如下所示:
将特征X分别经过小卷积核(3*3)得到新的特征U3*3(图中黄色部分);另外一路经过大卷积核(5*5)得到新的特征U5*5(图中绿色部分)。然后加两个新的特征U相加,然后经过SE相同的squeeze和excitation得到权重向量,注意这里的权重向量有两个,一个是针对U3*3的权重向量,另一个是针对U5*5的权重向量。最后用权重向量分别与对应的U相乘,最后相加得到新的特征输出V。主要代码如下:
class SKConv(nn.Module):def __init__(self, in_channels):""" ConstructorArgs:in_channels: input channel dimensionality.M: the number of branchs."""super(SKConv, self).__init__()r = 2.0L = 32d = max(int(in_channels / r), L)self.in_channels = in_channelsself.conv1 = nn.Sequential(self.depthwise_conv(in_channels, in_channels, kernel_size=3, dilation=1, padding=1),nn.BatchNorm2d(in_channels),#nn.ReLU(inplace=False))self.conv2 = nn.Sequential(self.depthwise_conv(in_channels, in_channels, kernel_size=3, dilation=2, padding=2),nn.BatchNorm2d(in_channels),# nn.ReLU(inplace=False))self.fc1 = nn.Linear(in_channels, d)self.fc2 = nn.Linear(d, in_channels*2)self.softmax = nn.Softmax(dim=1)def forward(self, x):U1 = self.conv1(x)U2 = self.conv2(x)U = U1 + U2S = U.mean(-1).mean(-1)Z1 = self.fc1(S)Z2 = self.fc2(Z1)A = self.softmax(Z2)V = U1 * A[:,:self.in_chanels].unsqueeze(-1).unsqueeze(-1) + \U2 * A[:,self.in_channels:].unsqueeze(-1).unsqueeze(-1)return V
shufflenet_liteconv网络
通过观察shufflenet的block,可以分为两种结构,一种是每个stage的第一个block,该block由于需要降采样,升维度,所以对输入直接复制成两份,经过branch1,和branch2之后再concat到一起,通道翻倍,如下图中的降采样block所示。另外一种普通的block将输入split成两部分,一部分经过branch2的卷积提取特征后直接与branch1的部分进行concat。如下图中的普通block所示:
一般在DW卷积(depthwise卷积)的前或后使用1*1的卷积处于两种目的,一种是融合通道间的信息,弥补dw卷积对通道间信息融合功能的缺失。另一种是为了降维升维,例如mobilenet v2中的inverted reddual模块。而shufflenet中的block,在branch2中用了2个1*1卷积,实际上有一些多余,因为此处不需要进行升维降维的需求,那么只是为了融合dw卷积的通道间信息。实际上有一个1*1卷积就够了。为了剪裁的方便,将上图中的红色虚线框中的1*1卷积删除。实现shufflenet_liteconv版本。
shufflenet_k5网络
进一步观察shufflenet的计算量分布,实际上在dw卷积上的计算量占比是很小的,主要的计算量都在1*1的卷积上面。因此对dw卷积进行一个卷积核的扩张,既不会增加太多的计算比重,又能提升效果,何乐而不为呢。Shufflenet_k5将所有的3*3dw卷积替换成5*5的dw卷积,注意在pytroch实现中,需要将padding从1修改为2,这样输出的特征图才能保持与原来一致的分辨率。
shufflenet_csp网络
csp在大型网络上取得了很大的成功。它在每个stage,将输入split成两部分,一部分经过原来的路径,另一部分直接shortcut到stage的尾部,然后concat到一起。这既降低了计算量,又丰富了梯度信息,减少了梯度的重用,是一个非常不错的trip。在yolov4,yolov5的目标检测中,也引入了csp机制,使用了csp_darknet。此处将csp引入到shufflenet中。并且对csp做了一定的精简,最终使用csp stage精简版本作为最终的网络结构。
4、实验测试
对上述:shufflenet_se、shufflenet_sk、shufflenet_liteconv、shufflenet_k5、shufflenet_csp在cifar10数据集上进行训练,统计其最终的精度和flops,并与baseline的shufflenet进行对比,结果如下表所示:
网络结构 |
Top1 |
实测flops (M) |
参数规模 (M) |
模型文件大小 |
shufflenet(baseline) |
0.880 |
147.79 |
1.263 |
5116K |
shufflenet_se |
0.884 |
147.93 |
1.406 |
5676K |
shufflenet_sk |
0.885 |
152.34 |
1.555 |
6872K |
shufflenet_liteconv |
0.879 |
104.77 |
0.923 |
3736K |
shufflenet_k5 |
0.891 |
155.18 |
1.303 |
5268K |
shufflenet_csp |
0.862 |
101.96 |
0.924 |
3776K |
对其中最重要的指标flops与top1精度进行可视化:
5、总结
从提升精度的角度看,shufflenet_k5的效果是最好的,比注意力机制的se和sk都要好。说明在轻量级网络中,注意力机制的收益并没有那么明显,没有直接提升dw卷积的卷积核来的收益高。最降低计算量方面,精简1*1卷积在几乎不降低精度的情况下,大约降低了约30%的计算量。Shufflenet_csp网络虽然能大幅降低计算量,但是精度降低的也很明显。分析原因,主要有两个,一是shufflenetv2本身已经使用了在输入通道split,然后concat的blcok流程,与csp其实是一样的,知识csp是基于一个stage,shufflenetv2是基于一个block,另外csp本来就是在densenet这种密集连接的网络上使用有比较好的效果,在轻量级网络上不见得效果会好。综上所述,如果为了提升精度,将卷积核扩大是最简单也最有效的,并且计算量只提升了5%。如果为了降低计算量,那么通过剪裁1*1卷积效果是最好的。
© THE END
我们开创“计算机视觉协会”知识星球一年有余,也得到很多同学的认可,我们定时会推送实践型内容与大家分享,在星球里的同学可以随时提问,随时提需求,我们都会及时给予回复及给出对应的答复。
如果想加入我们“计算机视觉研究院”,请扫二维码加入我们。我们会按照你的需求将你拉入对应的学习群!
计算机视觉研究院主要涉及深度学习领域,主要致力于人脸检测、人脸识别,多目标检测、目标跟踪、图像分割等研究方向。研究院接下来会不断分享最新的论文算法新框架,我们这次改革不同点就是,我们要着重”研究“。之后我们会针对相应领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!
扫码关注我们
公众号 : 计算机视觉研究院
优化实践 | 大改ShuffleNetV2网络,注意力机制,csp,卷积裁剪...(附全部开源代码)...相关推荐
- 大改ShuffleNetV2网络,注意力机制,csp,卷积裁剪
大改ShuffleNetV2网络,注意力机制,csp,卷积裁剪 1.背景 在移动端场景中,目前有很多不错的轻量级网络可以选择,例如google的mobilenet系列,efficient lite系列 ...
- 图像处理注意力机制Attention汇总(附代码)
原文链接: 图像处理注意力机制Attention汇总(附代码,SE.SK.ECA.CBAM.DA.CA等) 1. 介绍 注意力机制(Attention Mechanism)是机器学习中的一种数据处理方 ...
- 注意力机制取代卷积网络,预测准确性提升超30%
最近,DeepMind开源AlphaFold2,让学术圈再一次沸腾了. 这意味着,对于普通研究人员而言曾需要花几年时间才能破解的蛋白质结构,现在用AlphaFold2几小时就能算出来了! 那么,如此厉 ...
- AlphaFold2成功秘诀:注意力机制取代卷积网络,预测准确性提升超30%
明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 最近,DeepMind开源AlphaFold2,让学术圈再一次沸腾了. 这意味着,对于普通研究人员而言曾需要花几年时间才能破解的蛋白质结构, ...
- attention机制中的注意力图怎么画_注意力机制 | 图卷积多跳注意力机制 | Direct multihop Attention based GNN...
导读:目前GNNs通过利用self-attention机制已经取得较好的效果.但目前的注意力机制都只是考虑到相连的节点,却不能利用到能提供图结构上下文信息的多跳邻居(multi-hop neighbo ...
- NLP | 注意力机制Attention Mechannism图文详解及代码
包含了RNN,LSTM的示例. 1.注意力机制 注意力机制是深度学习的最新进展之一,特别是对于机器翻译.图像字幕.对话生成等自然语言处理任务.它是一种旨在提高编码器解码器(seq2seq)RNN 模型 ...
- 基于注意力机制的机器翻译——经典论文解读与代码实现
Seq2Seq + Decoder Attention的具体实现和论文里的公式解读,请参考:attention_seq2seq 欢迎讨论与start!
- 【注意力机制实例】GeoMAN(二)代码研究
来源: """ Yuxuan Liang, Songyu Ke, Junbo Zhang, Xiuwen Yi, Yu Zheng GeoMAN: Multi-level ...
- 【深度学习】(7) 交叉验证、正则化,自定义网络案例:图片分类,附python完整代码
各位同学好,今天和大家分享一下TensorFlow2.0深度学习中的交叉验证法和正则化方法,最后展示一下自定义网络的小案例. 1. 交叉验证 交叉验证主要防止模型过于复杂而引起的过拟合,找到使模型泛化 ...
最新文章
- 频频曝出程序员被抓,我们该如何避免面向监狱编程?
- URL概念及与URL的区别
- SpringBoot中@PropertySource和@ImportResource以及@Bean
- MTV: Django眼中的MVC
- NET问答: using 和 await using 有什么不同?
- 初学servlet之使用web.xml配置
- 特别好看的一个多接口api的图床源码
- AI又输了!中国传奇Dota2冠军联手,OpenAI快速进化然并卵
- 51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释...
- 通吃AD和宽带 TP-LINK无线路由猫评测
- google扩展工具Octotree使用(2020-09-01)
- python毕业设计作品基于django框架外卖点餐系统毕设成品(7)中期检查报告
- c语言一个数平方表示,C语言 - 利用 汇编思想 写一个数的平方
- nmcli命令详解>>>创建热点,连接wifi,管理连接等
- SPU、SKU、ID,它们都是什么意思,三者又有什么区别和联系呢?
- Linux下安装kettle
- CVS Health验厂须知
- 用java玩的游戏平台_分享4个边玩边学Python的编程游戏网站
- 弹飞绵羊——好惨一只羊
- opencv--直方图
热门文章
- php 汇率接口,利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
- 笔记本如何关闭自带的软键盘
- 测试韩国真假唇釉软件,完美日记丝绒唇釉真假对比
- Java-视频管理系统-毕业设计-SpringBoot-VUE-MyBatis
- python之数学运算
- 大数据可视化陈为智慧树_智慧树知到大数据可视化搜题公众号
- DROO main.py
- Gd类/Mn类顺磁阳性显影剂/氧化铁的超顺磁物质/ct/mri双显影剂
- STM32CubeMX | 40 - 实时时钟RTC的使用(日历和闹钟)
- 批处理set和if,goto共同使用