A ConvNet for the 2020s
https://arxiv.org/abs/2201.03545
https://github.com/facebookresearch/ConvNeXt
讲解https://mp.weixin.qq.com/s/q-s_dV4-TCiVPMOTZKEgPQ
https://www.bilibili.com/video/BV1SS4y157fu
https://www.bilibili.com/video/BV1iP4y1M7nk
以SwinTransformer的思路,在ResNet50和200上进行改造,优化
这篇文章的调参思路值得好好学习
Introduction
VIT在视觉领域比较火热,成为图像分类里的SOTA。缺点有,常规的VIT在解决像素密集的分类任务比如目标检测和语义分割,比较难。swin Transformer重新引入了几种ConvNet先验信息,让transformer性能更好。但这些都归功于transformer的内在优越性,而非卷积固有归纳偏置。
精度87.8%
本文使用现代的训练策略和超参数重新训练了ResNet50,发现提升了两个多点。这说明:Transformer与ConvNet的性能差距很大比例源自训练技术的升级。
微调设置
Method
Macro Design
按照SwinTransformer中block的1131比例,将resnet50中3463调整为3393,准确率从78.8% 到 79.4%
然后把conv1(是将输入图像进行4倍下采样)替换为4*4卷积,stride为4,模仿VIT块化改造。
ResNeXt
引入组卷积和深度可分离卷积,并将channel通道从64提升到96(也就是将network width提升),计算量大幅下降,准确率提升
Inverted Bottleneck
模仿MLP,把中间维度变成384,输入输出变成96
Large Kernel Size
将深度可分离卷积往前移动(Figure3 c),卷积核选择77最合适
Various Layer-wise Micro Design
概述一下结构,先是7x7的深度可分离组卷积(num_groups = in_channels),经过LN归一化层之后是两个1x1卷积来改变通道,在swin中就是两个MLP。11卷积其实就是在通道上的MLP
ReLU可以替换为ViT的GELU
更少的激活函数
移除两个BN层仅保留 1X1卷积之前的一个BN
BN换为LN
使用单独的下采样层
ResNet ConvNeXt Swin-T
代码学习
https://www.bilibili.com/video/BV11Y41137VA/
models/convnext.py
核心代码
class Block(nn.Module):
r""" ConvNeXt Block. There are two equivalent implementations:
(1) DwConv -> LayerNorm (channels_first) -> 1x1 Conv -> GELU -> 1x1 Conv; all in (N, C, H, W)
(2) DwConv -> Permute to (N, H, W, C); LayerNorm (channels_last) -> Linear -> GELU -> Linear; Permute back
We use (2) as we find it slightly faster in PyTorch
Args:
dim (int): Number of input channels.
drop_path (float): Stochastic depth rate. Default: 0.0
layer_scale_init_value (float): Init value for Layer Scale. Default: 1e-6.
"""
def __init__(self, dim, drop_path=0., layer_scale_init_value=1e-6):
super().__init__()
self.dwconv = nn.Conv2d(dim, dim, kernel_size=7, padding=3