Resnest:注意力+分组卷积的融合
ResNeSt是亚马逊的李沐团队的paper,最近在各个任务上刷榜了,但却被ECCV2020
strong reject了,在知乎上也是引起了热议,据李沐说这个网络花了一百万刀!我看完
以后感觉是ResNeXt + SKNet的组合,训练网络的很多tricks在工程上还是很有意义
的。
讨论:https://www.zhihu.com/question/388637660
ResNeXt
何凯明团队提出,非常的简单:将resnet中3*3的卷积,替换为分组卷积。然后就
没有了。。。。说实话就这个点换我是发不出来paper的,可见讲好故事有多重要。
论文里增加了一个cardinality(就是group),并讨论了相较于增加网络的宽度
和深度,简单的增加group会更好。一句话就是,split-transform-merge。
网络结构如图
实现就更简洁了 https://github.com/weiaicunzai/pytorch-cifar100/blob/master/models/resnext.py
C = CARDINALITY #How many groups a feature map was splitted into
#"""We note that the input/output width of the template is fixed as
#256-d (Fig. 3), We note that the input/output width of the template
#is fixed as 256-d (Fig. 3), and all widths are dou- bled each time
#when the feature map is subsampled (see Table 1)."""
D = int(DEPTH * out_channels / BASEWIDTH) #number of channels per group
self.split_transforms = nn.Sequential(
nn.Conv2d(in_channels, C * D, kernel_size=1, groups=C, bias=False),
nn.BatchNorm2d(C * D),
nn.ReLU(inplace=True),
nn.Conv2d(C * D, C * D, kernel_size=3, stride=stride, groups=C, padding=1, bias=False),
nn.BatchNorm2d(C * D),
nn.ReLU(inplace=True),
nn.Conv2d(C * D, out_channels * 4, kernel_size=1, bias=False),
nn.BatchNorm2d(out_channels * 4),
)
为什么如此简单的改变,效果就会好呢?paper里也论证了,其实就是分组卷积带
来的增益,我的理解是分组卷积,提取出了更好的特征,知乎上也有讨论 https://www.zhihu.com/question/323424817
SKNet
SENet的升级版,连名字都是致敬。话说SENet真是个好东西,用过都说好。
直接上图,可以看出,论文使用了多路分支来做attention。一路为3*3,一路为5*5(其实用的是3*3的空洞卷积来代替),
注意:两路用的都是分组卷积(resnxt的做法)。然后两路直接融合(elementwise),然后一起去做SE,再将attention拆分,
分别去对上面的两路做attention。注意:一起经过softmax后,二者attention相加为1。最后将attention之后的结果再做融合。
caffe的网络结构:https://github.com/implus/SKNet/blob/master/models/sknet50.prototxt
作者在知乎上的文章:https://zhuanlan.zhihu.com/p/59690223
ResNeSt
终于来到了正主。先来一组对比图。可以看出,各组网络的核心区别,还是在split attention上。
split attention模块。首先将各分组做融合,然后是SE: GP+FC1+FC2。注意:和sknet一样,这里都是用conv1*1来代替fc,
但是resnest用的是组卷积,然后对组卷积做rsoftmax(按组来做softmax)得到attention,最后去做融合。看到这里,我觉得
确实和sknet很像,作者本人也承认了这点,可以说sknet是resnest的一个特例。
https://www.zhihu.com/question/388637660
核心代码https://github.com/zhanghang1989/ResNeSt/blob/master/resnest/torch/splat.py
RegNet
最后说一说regnet,也是何凯明团体提出,使用的是搜索的网络,对标的是谷歌家的EfficientNet,
搜索的是ResNeXt(搜索包括了group)。网络搜索没做过,就说下几个有意思的结论吧
1、通过activations(不是激活函数),而不是flops来衡量速度。这也是这篇paper吸引我的地方,
参考https://zhuanlan.zhihu.com/p/122943688。
2、swish在小模型上更好,relu更适合大模型(更多flops)。尤其是使用depthwise conv + swish,
效果比dc+relu更好。
实现可参考https://github.com/signatrix/regnet
原文地址:https://www.cnblogs.com/573177885qq/p/12990968.html
- Selenium2+python自动化52-unittest执行顺序
- 基于TensorFlow实现自编码器(附源码)
- Selenium2+python自动化53-unittest批量执行(discover)
- HTML/CSS/JavaScript学习笔记【持续更新】
- Selenium2+python自动化54-unittest生成测试报告(HTMLTestRunner)
- Selenium2+python自动化55-unittest之装饰器(@classmethod)
- 每天一个Linux命令(4)——mkdir
- 每天一个Linux命令(3)——pwd
- 11-移动端开发教程-zepto.js入门教程
- 【OpenCV学习笔记之一】图像加载,修改及保存
- 【干货】一种直观的方法认识梯度下降
- 漫谈Java IO之普通IO流与BIO服务器
- 浅谈强化学习的方法及学习路线
- 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法