将输入图像数据在Patch Partitation 模块中进行分块,每4×4相邻的像素为一个Patch,然后在通道方向展平,每个Patch有16个像素,展平后16×3=48.假设输入尺寸[H,W,3].经过Patch Partition变成[H/4,W/4,48],在通过Linear Embeding层对每个像素的channel做线性变换,48变成C,即[H/4,W/4,C]。
Stage1-4构建不同大小的特征图,Swin Transformer Block由两种结构,如上图右侧,区别在于一个使用了W-MSA结构,一个使用了SW-MSA结构,两个结构是成对使用的,先使用一个W-MSA结构再使用一个SW-MSA结构。堆叠Block的次数都是偶数。
最后的分类网络后还加了一个Layer Norm层、全局池化以及全连接得到最终输出,在源码中有体现。
Stage2-4要先通过一个Patch Merging下采样,假设输入一个4x4大小的单通道特征图),Patch Merging会将每个2x2的相邻像素划分为一个patch,然后将每个patch中相同位置像素(图中用相同颜色表示)拼在一起就得到了4个feature map。接着将这四个feature map在深度方向进行拼接,然后在通过一个LayerNorm层。最后通过一个全连接层在feature map的深度方向做线性变化,将feature map的深度由C变成C/2。通过Patch Merging层后,feature map的高和宽会减半,深度会翻倍。
Windows Multi-head Self-Attention(W-MSA)减少了计算量,对于普通的Multi-head Self-Attention(MSA)模块,每个像素要与所有的像素计算;在Windows Multi-head Self-Attention(W-MSA)模块时,将特征图划分为一个个Windows,单独对每个Windows内部进行Self-Attention。
W-MSA的缺点是窗口之间无法信息交互,作者引入了Shifted Windows Multi-Head Self-Attention(SW-MSA)模块,即进行偏移的W-MSA。由于W-MSA和SW-MSA是成对使用的,若第L层使用W-MSA,则第L+1层使用SW-MSA,SW-MSA的窗口发生了偏移,L+1层中第一行第2列的2x4的窗口,它能够使第L层的第一排的两个窗口信息进行交流。第二行第二列的4x4的窗口,他能够使第L层的四个窗口信息进行交流。
这样做增加了窗口的数量,作者提出Efficient batch computation for shifted configuration,思路是通过移动窗口将特征图规整为一个个4×4窗口,这样与L层的计算量相同。但移动后对不同区域进行MSA又会导致信息混乱,这里使用masked MSA,如下图,区域3和区域5分别对应上图右侧第二行第一列,和第二行第三列的窗口,对于窗口内的每个像素计算时,都要先生成q,k,v,q与每一个k进行匹配,当区域5里的q与区域3中的k匹配时,将匹配结果减100,这样再通过softmax得到对应的权重就为0.
首先计算相对位置索引,假设输入特征图2×2,每个像素的绝对位置在下图左侧,用蓝色像素的绝对位置索引与其他位置索引进行相减,就得到其他位置相对蓝色像素的相对位置索引,其他同理,按行展平就得到了下面的4×4矩阵。
然后将二维索引转化为一维索引,方法是先在原始相对位置索引加上M-1,然后所有行标×2M-1,最后再将行标列标相加。
相对位置偏置参数是可训练的,保存在一个relative position bias table里,长度 (2M-1)×(2M-1),通过查表可得到对应的参数,在匹配时加上该参数再进行softmax。
Vision Transformer在CV领域的成功让越来越多的研究人员拥入Transformer的怀抱,卷积神经网络慢慢褪去色彩,2022年一月份,ConvNeXt的提出再次让人们眼前一亮。
作者从五个方面训练原始的ResNet50模型,这五个方面都借鉴了Transformer的模型,每一步之后的准确率如下图:
接下来作者详细介绍了五个方面的改进。
在这一部分作者改变了ResNet中Block的堆叠次数,如ResNet50网络中Block堆叠次数为3,4,6,3;在Swin-T中比例则为1:1:3:1,作者就将堆叠次数调整为(3,3,9,3)。准确率由78.8%提升到了79.4%。
作者将ResNet中的下采样模块换成与Swin Transformer中一样的Patchify,即通过一个非常大的卷积核且步距=kernel_size的卷积层实现。提升准确率的同时降低了FLOPs
使用DW卷积(借鉴组卷积的思想且将组数设置为与通道数一致。),并将通道数由64调整为96,与Swin-Transformer保持一致。
作者认为Transformer Block中的MLP模块非常像MobileNetV2中的Inverted Bottleneck,下图是三种Block的结构。在较小模型准确率由80.5%提升到80.6%,在较大的模型上准确率由81.9%提升到82.6%。
Moving up Depthwise conv layer 作者将组卷积模块上移,原来是1x1 conv -> depthwise conv -> 1x1 conv,现在变成了depthwise conv -> 1x1 conv -> 1x1 conv。这么做是因为在Transformer中,MSA模块是放在MLP模块之前的,所以这里进行效仿,将depthwise conv上移。这样改动后,准确率下降到了79.9%,同时FLOPs也减小了。
Increasing the Kernel size 组卷积卷积核大小由3×3变成7×7,与Swin-Transformer一致,准确率从79.9%增长到80.6%。
Replacing ReLU with GELU 使用GELU激活函数替换掉RELU激活函数
Fewer activation functions 减少了激活函数的使用,不再是每个卷积层或全连接后都加一个激活函数,下图展示了改进的ConvNeXt Block
Fewer normalization layers 使用更少的normalization,只保留了DW卷积后的Normalization,准确率达到了81.4%
Substituting BN with LN将Batch Normalization(BN)替换成Layer Normalization(LN),准确率提升到81.5%。
Separate downsampling layers 使用单独的下采样层,通过一个Laryer Normalization加上一个卷积核大小为2步距为2的卷积层构成。更改后准确率就提升到了82.0%