模型
使用ResNeXt101-WSL,主要是由于训练数据比较小, 使用预训练模型能够获得更强的泛化能力。
ResNeXt101是ResNet多通路卷积改进版本,WSL表示预训练参数是用Instagram上9.4亿张图片进行弱监督预训练并在Imagenet-1k上fine-tune的模型参数。详细见https://pytorch.org/hub/facebookresearch_WSL-Images_resnext/#model-description。
在本次比赛中我们使用了8d和16d两个模型最后做融合。
Adaptive CBAM
这是我们自研的、对预训练模型友好的注意力模块。
注意力模块或者注意力机制是常用的提升网络性能的方法,比如imagenet17年分类冠军senet,18年分类冠军cbam都是在网络结构上面增加注意力机制。
但是对于预训练网络,直接在每个残差块去加注意力机制,会使得网络的中间层输出改变。中间层输出变化了,网络的前向、反向全乱了,也就是破坏预训练模型参数所蕴含的语义信息。第二点在网络的每个残差块里面都加cbam 并不一定是最优的选择,可能某些残差块不加cbam是一个更好的选择。
针对以上两个弊端,我们改进的了CBAM。
块
Adaptive CBAM在CBAM的激活前增加了BN层,并把BN的参数初始化为0,因此第一次前向通过BN后的值为0,再通过2*sigmoid得到的权值为1,因此第一次前向输出的结果与没有加CBAM的效果一致。但是随着训练又能学习到不同通道、不同空间的权值,达到注意力的效果。第二点,Adaptive CBAM能对网络结构自适应性,如果某个残差块不需要加CBAM,只需要将BN的参数学习为0,就等价于没有加CBAM。
训练
主要分为两个步骤:先做迁移学习,再做微调。
迁移学习:只训练新加入的CBAM层和最后一层fc。详细配置:SGD ,0.1LR,每40个epoch学习率降低为原来的0.1,训练100个epoch。
微调:只微调最后的layer4和fc层,这两部分的梯度全部打开。详细配置:SGD ,0.01LR,每40个epoch学习率降低为原来的0.1,训练100个epoch。
训练时使用常规的数据增强:RandomResizedCrop、RandomHorizontalFlip。同时使用了cutmix。

BN设置
最新的一些论文已经指出来,BN不适合做迁移学习。
因为在迁移学习的时候,BN层的梯度虽然关闭了,但是running_{mean}、running_{var}这些统计量还是在变换,因此我们在迁移学习的时候将这两个统计量也冻结了。
模型增强
模型融合与TTA。
使用以上的步骤训练了两个模型,分别以8d和16d作为基础网络结构,最后将两个模型的输出的平均值作为最终的输出。
在测试时使用了FiveCrop作为测试时增强,将FiveCrop的结果取平均。



厉害了我的哥,向你学习。
不明觉厉