【GiantPandaCV導語】
來自商湯和南洋理工的工作,也是使用卷積來增強模型提出low-level特徵的能力,增強模型獲取局部性的能力,核心貢獻是LCA模塊,可以用於捕獲多層特徵表示。相比DeiT,訓練速度更快。
針對先前Transformer架構需要大量額外數據或者額外的監督(Deit),才能獲得與卷積神經網絡結構相當的性能,為了克服這種缺陷,提出結合CNN來彌補Transformer的缺陷,提出了CeiT:
(1)設計Image-to-Tokens模塊來從low-level特徵中得到embedding。
(2)將Transformer中的Feed Forward模塊替換為Locally-enhanced Feed-Forward(LeFF)模塊,增加了相鄰token之間的相關性。
(3)使用Layer-wise Class Token Attention(LCA)捕獲多層的特徵表示。
經過以上修改,可以發現模型效率方面以及泛化能力得到了提升,收斂性也有所改善,如下圖所示:


使用卷積+池化來取代原先ViT中7x7的大型patch。
2. LeFF

將tokens重新拼成feature map,然後使用深度可分離卷積添加局部性的處理,然後再使用一個Linear層映射至tokens。
3. LCA
前兩個都比較常規,最後一個比較有特色,經過所有Transformer層以後使用的Layer-wise Class-token Attention,如下圖所示:

LCA模塊會將所有Transformer Block中得到的class token作為輸入,然後再在其基礎上使用一個MSA+FFN得到最終的logits輸出。作者認為這樣可以獲取多尺度的表徵。
實驗SOTA比較:

I2T消融實驗:

LeFF消融實驗:

LCA有效性比較:

收斂速度比較:

模塊1:I2T Image-to-Token
#IoTself.conv=nn.Sequential(nn.Conv2d(in_channels,out_channels,conv_kernel,stride,4),nn.BatchNorm2d(out_channels),nn.MaxPool2d(pool_kernel,stride))feature_size=image_size//4assertfeature_size%patch_size==0,'Imagedimensionsmustbedivisiblebythepatchsize.'num_patches=(feature_size//patch_size)**2patch_dim=out_channels*patch_size**2self.to_patch_embedding=nn.Sequential(Rearrange('bc(hp1)(wp2)->b(hw)(p1p2c)',p1=patch_size,p2=patch_size),nn.Linear(patch_dim,dim),)模塊2:LeFF
classLeFF(nn.Module):def__init__(self,dim=192,scale=4,depth_kernel=3):super().__init__()scale_dim=dim*scaleself.up_proj=nn.Sequential(nn.Linear(dim,scale_dim),Rearrange('bnc->bcn'),nn.BatchNorm1d(scale_dim),nn.GELU(),Rearrange('bc(hw)->bchw',h=14,w=14))self.depth_conv=nn.Sequential(nn.Conv2d(scale_dim,scale_dim,kernel_size=depth_kernel,padding=1,groups=scale_dim,bias=False),nn.BatchNorm2d(scale_dim),nn.GELU(),Rearrange('bchw->b(hw)c',h=14,w=14))self.down_proj=nn.Sequential(nn.Linear(scale_dim,dim),Rearrange('bnc->bcn'),nn.BatchNorm1d(dim),nn.GELU(),Rearrange('bcn->bnc'))defforward(self,x):x=self.up_proj(x)x=self.depth_conv(x)x=self.down_proj(x)returnxclassTransformerLeFF(nn.Module):def__init__(self,dim,depth,heads,dim_head,scale=4,depth_kernel=3,dropout=0.):super().__init__()self.layers=nn.ModuleList([])for_inrange(depth):self.layers.append(nn.ModuleList([Residual(PreNorm(dim,Attention(dim,heads=heads,dim_head=dim_head,dropout=dropout))),Residual(PreNorm(dim,LeFF(dim,scale,depth_kernel)))]))defforward(self,x):c=list()forattn,leffinself.layers:x=attn(x)cls_tokens=x[:,0]c.append(cls_tokens)x=leff(x[:,1:])x=torch.cat((cls_tokens.unsqueeze(1),x),dim=1)returnx,torch.stack(c).transpose(0,1)模塊3:LCA
classLCAttention(nn.Module):def__init__(self,dim,heads=8,dim_head=64,dropout=0.):super().__init__()inner_dim=dim_head*headsproject_out=not(heads==1anddim_head==dim)self.heads=headsself.scale=dim_head**-0.5self.to_qkv=nn.Linear(dim,inner_dim*3,bias=False)self.to_out=nn.Sequential(nn.Linear(inner_dim,dim),nn.Dropout(dropout))ifproject_outelsenn.Identity()defforward(self,x):b,n,_,h=*x.shape,self.headsqkv=self.to_qkv(x).chunk(3,dim=-1)q,k,v=map(lambdat:rearrange(t,'bn(hd)->bhnd',h=h),qkv)q=q[:,:,-1,:].unsqueeze(2)#OnlyLthelementuseasquerydots=einsum('bhid,bhjd->bhij',q,k)*self.scaleattn=dots.softmax(dim=-1)out=einsum('bhij,bhjd->bhid',attn,v)out=rearrange(out,'bhnd->bn(hd)')out=self.to_out(out)returnoutclassLCA(nn.Module):#IremoveResidualconnectionfromhere,inpaperauthordidn'texplicitlymentionedtouseResidualconnection,#soIremovedit,althougthwithResidualconnectionalsothiscodewillwork.def__init__(self,dim,heads,dim_head,mlp_dim,dropout=0.):super().__init__()self.layers=nn.ModuleList([])self.layers.append(nn.ModuleList([PreNorm(dim,LCAttention(dim,heads=heads,dim_head=dim_head,dropout=dropout)),PreNorm(dim,FeedForward(dim,mlp_dim,dropout=dropout))]))defforward(self,x):forattn,ffinself.layers:x=attn(x)+x[:,-1].unsqueeze(1)x=x[:,-1].unsqueeze(1)+ff(x)returnx參考https://arxiv.org/abs/2103.11816
https://github.com/rishikksh20/CeiT-pytorch/blob/master/ceit.py
為了感謝讀者的長期支持,今天我們將送出三本由機械工業出版社提供的:《從零開始構建深度前饋神經網絡》 。點擊下方抽獎助手參與抽獎。沒抽到並且對本書有興趣的也可以使用下方鏈接進行購買。
《從零開始構建深度前饋神經網絡》抽獎鏈接
本書通過Python+NumPy從零開始構建神經網絡模型,強化讀者對算法思想的理解,並通過TensorFlow構建模型來驗證讀者親手從零構建的版本。前饋神經網絡是深度學習的重要知識,其核心思想是反向傳播與梯度下降。本書從極易理解的示例開始,逐漸深入,幫助讀者充分理解並熟練掌握反向傳播與梯度下降算法,為後續學習打下堅實的基礎。
