问题简述:
- 数据集为几百类、平均每类几百张,图像分辨率小于100x100,长尾分布
- 有参数量和运算量限制
- 手工设计模型。
一、轻量级模块
0、basicblock,bottleneck(作为参考)
- 结构如下,如果输入输出尺度或通道数不一致,支路使用Conv2d(kernel_size=1,stride=stride)下采样并改正通道数。
- 每个BottleNeck卷积设计为:1x1 >> 3x3,stride >> 1x1(最后先SE后PW)
- 每个BottleNeck通道数设计为:inplanes >> planes >> planes >>outplanes >>outplanes
1、mobilenet v2 (逆残差模块)
参考:https://blog.csdn.net/u011974639/article/details/79199588
参考:https://blog.csdn.net/weixin_44474718/article/details/91045521
- 因为通道数先变大后变小,所以称为逆残差。(残差:沙漏形,逆残差:纺锤形)
- 通道数可以为:inplanes >> inplanes6 >> inplanes6 >>outplanes
- 当 i n p l a n e s = = o u t p l a n e s inplanes==outplanes inplanes==outplanes 且 s t r i d e = 1 stride=1 stride=1 时,使用残差连接。
2、mobilenet v3(逆残差模块+SE)
参考:https://arxiv.org/pdf/1905.02244.pdf- 卷积为:1x1 >> kxk,stride,DW >> se >> 1x1(最后先SE后PW)
- 通道数可以为:inplanes >> inplanesn >> inplanesn >>outplanes >>outplanes
参考:https://github.com/xiaolai-sqlai/mobilenetv3/blob/master/mobilenetv3.py(star 1k+ 的简单实现代码)
- 使用SE的逆残差模块
- SE模块的位置与论文不同,不同的原因参考https://github.com/xiaolai-sqlai/mobilenetv3/issues/8,因为该代码早于Google公开最终论文。
- 卷积为:1x1 >> kxk,stride,DW >>1x1 >> se (最后先PW后SE,方案与论文中不同)
- 通道数可以为:inplanes >> inplanesn >> inplanesn >> inplanes*n >>outplanes (最后先PW后SE,方案与论文中不同)
- 其中激活函数的选择方式、通道数设计、是否使用SE模块如下
参考:https://github.com/leaderj1001/MobileNetV3-Pytorch/blob/master/model.py(由Google Research发布的mobilenetv3的pytorch版本)
- 前向传播
- 前向传播
- 卷积为:1x1 >> kxk,stride,DW >> se >> 1x1(最后先SE后PW)
- 通道数可以为:inplanes >> exp_size >> exp_size >>outplanes >>outplanes
3、ghostnet(可直接替换resnet的basicblock)
参考:https://zhuanlan.zhihu.com/p/109325275
- ghost模块
- ghost BottleNeck
二、手工网络结构设计思路
1、RegNet(动机:找到每次最佳参数相对于层数的线性函数)
- 参考:https://zhuanlan.zhihu.com/p/139599240
AnyNet
- AnyNet = stem + body + head
- body = stage1 + stage2 + stage3 + stage4
- stage = block的组合
AnyNetX
- AnyNet的stages都使用bottleneck
AnyNetXA,B,C,D,E
- A:初始的AnyNetX
- B:在A的基础上,找到最佳的bottleneck的比率,且小于2
- C:在B的基础上,找到最佳的组宽度,且大于1
- D:在C的基础上,修改网络宽度
- E:在D的基础上,修改网络深度
RegNet设计空间:
- 根据AnyNetXE的结果,用线性函数拟合block的宽度随层数j的变化规律(函数超参为: w 0 , w a , w m w_0,w_a,w_m w0,wa,wm),并获得最佳的block的数量、、bottleneck的比率、组宽度。(所以只需6个参数就能确定一个网络)
- block宽度计算方法:
u j = w 0 + w a ∗ j u_j=w_0+w_a*j uj=w0+wa∗j - 量化的block宽度计算方法(宽度相同的block划分为同一个stage):
u j = w 0 + w m s j u_j=w_0+w_m^{s_j} uj=w0+wmsj w j = w 0 + w m r o u n d [ s j ] w_j=w_0+w_m^{round[s_j]} wj=w0+wmround[sj]
RegNetX设计空间的讨论:
- 最好模型的参数:
block的数量:20
bottleneck的比率:1
组宽度:随复杂度增加而增加
w m w_m wm :2.5
w 0 w_0 w0: 随着复杂度增加而增加
w a w_a wa: 随着复杂度增加而增加
RegNetY设计空间的讨论:
- 精炼RegNetX设计空间,再做出限制:
block的数量:[12,28]
bottleneck的比率:1
组宽度:无限制
w m w_m wm :[2, + ∞ +\infty +∞)
w 0 w_0 w0: 无限制
w a w_a wa: 无限制
限制参数量和激活函数
- 于是RegNetY = SE+RegNetX+以上限制
2、dropout
三、数据增广策略
1、数据增广实现:
- PIL.ImageEnhance
参考:https://blog.csdn.net/cgy233/article/details/110161411 - torch自带:
参考:https://zhuanlan.zhihu.com/p/53367135
2、mixup
- 参考:https://blog.csdn.net/sinat_36618660/article/details/101633504
- 原理:将图片1和图片2加权平均,得到一个数据增广。
b a t c h = λ × b a t c h 1 + ( 1 − λ ) × b a t c h 2 batch = \lambda \times batch_1 + (1-\lambda)\times batch_2 batch=λ×batch1+(1−λ)×batch2 l o s s i = C E ( o u t p u t , l a b e l i ) , i = 1 , 2 loss_i=CE(output,label_i) , \ i=1,2 lossi=CE(output,labeli), i=1,2 l o s s = λ × l o s s 1 + ( 1 − λ ) × l o s s 2 loss= \lambda \times loss_1+ (1-\lambda)\times loss_2 loss=λ×loss1+(1−λ)×loss2其中, λ \lambda λ 是 B e t a Beta Beta分布计算出来的系数 λ = B e t a ( α , β ) \lambda=Beta(\alpha,\beta) λ=Beta(α,β) - 实现:给定 b a t c h 1 batch_1 batch1,打乱顺序得到 b a t c h 2 batch_2 batch2,将二者加权平均。
- 经验参数: α , β = 0.5 , 0.5 \alpha,\beta=0.5,0.5 α,β=0.5,0.5
3、cutout
参考:https://blog.csdn.net/weixin_35627928/article/details/111932093
- Mixup:两个图片加权平均,loss也加权平均(抑制过拟合)
- Cutout:随机将图片一部分区域覆盖掉,用黑色覆盖。
- CutMix:随机将图片一部分区域覆盖掉,用训练集中的其他数据的区域像素值覆盖,loss也加权平均
四、长尾分布
1、数据重采样
2、损失函数 Focal Loss
五、图像分类网络比赛思路
1、图像分类比赛tricks:“观云识天”人机对抗大赛:机器图像算法赛道-天气识别—百万奖金
- https://zhuanlan.zhihu.com/p/95881337
- https://zhuanlan.zhihu.com/p/98750452
2、 ImageNet 2017冠军方案:超参设置
- https://arxiv.org/pdf/1709.01507.pdf
- random croping (短边resize256再crop224,或resize299再crop256)
- random horizontal flipping
- norm RGB
- lr:0.6(0-30) => 0.06(30-60) => 0.006(60-90) => 0.0006(90-100)
- 凯明初始化
3、Imagenet 2014冠军方案:超参设置
- https://arxiv.org/pdf/1409.4842.pdf
- lr:每8epoch乘0.96
- 变尺度crop,面积8%-100%,长宽比0.75到1.33
- 用了一大堆,不能明确说明哪些是有效方案
4、分类首次超越人类水平
- https://arxiv.org/abs/1502.01852
- resize为(256,512)再随机crop 224,相当于面积从0.19到0.76
- random horizontal flipping
- Random color altering
- dropout
- lr:0.01 => 0.001 => 0.0001,error不变时修改学习率,80epoch