paper: ResNeSt: Split-Attention Networks
code: ResNeSt Mxnet&PyTorch版本
Abstract
- ResNeSt是對ResNext的又一個魔改的變種,亞馬遜李沐團隊的作品,其中S代表split,可以理解為按channel切分的feature map。ResNeSt是在ResNeXt的cardinality基礎上又引入一個radix(R),來表示每個cardinality group中的split的個數
- 簡單理解,ResNeXt的cardinality將一組channel分成不同的組(這里稱為cardinality group),ResNeSt是將一組cardinality group中的channel分成不同的split
- 從實驗結果上開,效果還是很amazing的
- ResNeSt-50在ImageNet上的top-1 error為81.13%,超過ResNet-50大概1%
- ResNeSt-50替換Faster rcnn中的backbone,coco的mAP從39.25%提升到42.33%
- ResNeSt-50替換DeepLabV3中的backbone,ADE20K上的分割mIoU從42.1%提升到45.1%
Details
Split-Attention
- 按照個人的理解,將每個cardinality group中的split-attention拆解為四個關鍵步驟,如下圖中的4個紅框
- 其實,最主要的就是名字所述的一個是split的過程(第一個紅框)、一個是attention的過程(剩下3個紅框)
- 注:准確的說split應該對應論文中的圖一右圖,而這里第一個紅框部分是每個split經過一些transfromation(\(1\times1\) conv + \(3\times3\) conv)后的輸出
- step1,將該cardinality group的輸入分成r個split,每個split經過一些變換后,進入到split-attention中,先用element-wise sum的方式將特征圖融合到一起(輸出維度:\( H \times W\ times C\))
- step2,將融合后的feature map指向global average pooling,即將圖像空間維度壓縮(輸出維度:\( C \) )
- step3,結合softmax計算出每個split的權重
- 圖中的dense c實現方式是用兩個全連接層
- step4,將每個split-attention模塊輸入的每個split的feature map和計算出來的每個split的權重相乘,得到一個cardinality group的weighted fusion(輸出維度:\( H \times W\ times C\))
- 其實,最主要的就是名字所述的一個是split的過程(第一個紅框)、一個是attention的過程(剩下3個紅框)
- 可見,split-attention其實就是給每一組split的feature map計算其對應的權重,然后再融合。
ResNeSt Block
- ResNeSt block的流程如下
- 將輸入的所有feature map分成不同的cardinality group,
- 然后,每個cardinality group再分成不同的split,
- 然后,再用split-attention計算每個split的權重,再融合后作為每個cardinality group的輸出,
- 然后,將所有的cardinality group的feature map在channel維度concate到一起,
- 然后,再執行一次conv(改變channel個數)用skip connection將ResNeSt Block的原始輸入特征融合進來(融合方式為element-wise sum)。具體實現如下圖:
實現細節及技巧
- 使用的resnet結構是ResNet-D,結構如下
- 訓練策略
- large mini-batch distributed training
- label smoothing
- auto augmentation
- mixup training
- large crop size: 224(ResNet變種對比),256(和其他模型對比)
- Regularization: Dropout、DropBlock、weight decay
- cosine schedule
- 實際實現時用的是radix-major的方式,這種方式的話,計算起來更方便一些(這樣布局,相同radix-index的group在內存中布局一樣),從布局上看相對於把前面圖中的cardinality和split兩個轉換一下,如下圖
寫在后面
- 看ResNeSt,以及其他一些最新的文章,都能夠看到attention的身影,給每個feature map分配一個權重,想到以前用傳統方法做多模態目標跟蹤的權重融合方式,何其相似。。。