
    ^j]              	          d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
 ddlZddlmZ ddlmc mZ ddlmZmZ ddlmZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
l m!Z!m"Z" dgZ# G d dejH                        Z% G d dejH                        Z& G d dejH                        Z' G d dejH                        Z( G d dejH                        Z) G d dejH                        Z* G d dejH                        Z+ G d dejH                        Z, G d dejH                        Z-dee.ej^                  f   dejH                  dee.ej^                  f   fd Z0d.d!e.d"edee.ef   fd#Z1 e! e1d$%       e1d$%       e1d$%       e1d$%      d&      Z2d/d'e.d(e3d"ede-fd)Z4e"d/d(e3d"ede-fd*       Z5e"d/d(e3d"ede-fd+       Z6e"d/d(e3d"ede-fd,       Z7e"d/d(e3d"ede-fd-       Z8y)0aj  SwiftFormer
SwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applications
Code: https://github.com/Amshaker/SwiftFormer
Paper: https://arxiv.org/pdf/2303.15446

@InProceedings{Shaker_2023_ICCV,
    author    = {Shaker, Abdelrahman and Maaz, Muhammad and Rasheed, Hanoona and Khan, Salman and Yang, Ming-Hsuan and Khan, Fahad Shahbaz},
    title     = {SwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applications},
    booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)},
    year      = {2023},
}
    N)AnyDictListOptionalSetTupleTypeUnionIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathLinear	LayerType	to_2tupletrunc_normal_   )build_model_with_cfg)feature_take_indices)checkpoint_seq)generate_default_cfgsregister_modelSwiftFormerc                   f     e Zd Zddededef fdZdej                  dej                  fdZ	 xZ
S )	LayerScale2ddiminit_valuesinplacec                     ||d}t         |           || _        t        j                  |t        j                  |ddfi |z  d      | _        y )Ndevicedtyper   T)requires_grad)super__init__r   nn	Parametertorchonesgamma)selfr   r   r   r!   r"   dd	__class__s          b/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/swiftformer.pyr%   zLayerScale2d.__init__   sL    /\\%**S!Q5"55TK
    xreturnc                 n    | j                   r|j                  | j                        S || j                  z  S N)r   mul_r*   r+   r0   s     r.   forwardzLayerScale2d.forward&   s(    %)\\qvvdjj!Eq4::~Er/   )h㈵>FNN)__name__
__module____qualname__intfloatboolr%   r(   Tensorr6   __classcell__r-   s   @r.   r   r      s?    KC Ke KT KF F%,, Fr/   r   c                        e Zd ZdZdddddej
                  ddfdeded	ed
ededeej                     f fdZ	de
j                  de
j                  fdZ xZS )	Embeddingz
    Patch Embedding that is implemented by a layer of conv.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H/stride, W/stride]
       i      r   Nin_chans	embed_dim
patch_sizestridepadding
norm_layerc	                     ||d}	t         
|           t        |      }t        |      }t        |      }t        j                  |||||fi |	| _        |r ||fi |	| _        y t        j                         | _        y )Nr    )r$   r%   r   r&   Conv2dprojIdentitynorm)r+   rE   rF   rG   rH   rI   rJ   r!   r"   r,   r-   s             r.   r%   zEmbedding.__init__0   su     /z*
6"G$IIh	:vwURTU	3=Jy/B/	2;;=	r/   r0   r1   c                 J    | j                  |      }| j                  |      }|S r3   )rM   rO   r5   s     r.   r6   zEmbedding.forwardC   s!    IIaLIIaLr/   )r8   r9   r:   __doc__r&   BatchNorm2dr;   r	   Moduler%   r(   r>   r6   r?   r@   s   @r.   rB   rB   *   s       *,..QQ Q 	Q
 Q Q RYYQ& %,, r/   rB   c                        e Zd ZdZdddej
                  ej                  dddfdeded	ed
ede	ej                     de	ej                     def fdZdej                  dej                  fdZ xZS )ConvEncoderz
    Implementation of ConvEncoder with 3*3 and 1*1 convolutions.
    Input: tensor with shape [B, C, H, W]
    Output: tensor with shape [B, C, H, W]
    @   rC           TNr   
hidden_dimkernel_size	drop_path	act_layerrJ   use_layer_scalec
                    ||	d}
t         |           t        j                  |||f|dz  |d|
| _         ||fi |
| _        t        j                  ||dfi |
| _         |       | _        t        j                  ||dfi |
| _        |dkD  rt        |      nt        j                         | _        |rt        |dfi |
| _        y t        j                         | _        y )Nr       rI   groupsr   rW   r$   r%   r&   rL   dwconvrO   pwconv1actpwconv2r   rN   rZ   r   layer_scale)r+   r   rX   rY   rZ   r[   rJ   r\   r!   r"   r,   r-   s              r.   r%   zConvEncoder.__init__O   s     /iiS+b{a?OX[b_abs)b)	yyj!:r:;yyS!:r:09B),BKKM9H<Q5"5bkkmr/   r0   r1   c                     |}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|| j                  |      z   }|S r3   rb   rO   rc   rd   re   rf   rZ   )r+   r0   inputs      r.   r6   zConvEncoder.forwarde   sp    KKNIIaLLLOHHQKLLOQDNN1%%r/   r8   r9   r:   rQ   r&   GELUrR   r;   r<   r	   rS   r=   r%   r(   r>   r6   r?   r@   s   @r.   rU   rU   I   s     ! !)+*,..$(\\ \ 	\
 \ BII\ RYY\ "\,	 	%,, 	r/   rU   c                        e Zd ZdZddej
                  ej                  dddfdedee   dee   de	ej                     de	ej                     d	ef fd
Zdej                  dej                  fdZ xZS )Mlpz
    Implementation of MLP layer with 1*1 convolutions.
    Input: tensor with shape [B, C, H, W]
    Output: tensor with shape [B, C, H, W]
    NrW   in_featureshidden_featuresout_featuresr[   rJ   dropc	                     ||d}	t         
|           |xs |}|xs |} ||fi |	| _        t        j                  ||dfi |	| _         |       | _        t        j                  ||dfi |	| _        t        j                  |      | _	        y )Nr    r   )
r$   r%   norm1r&   rL   fc1rd   fc2Dropoutrq   )r+   rn   ro   rp   r[   rJ   rq   r!   r"   r,   r-   s             r.   r%   zMlp.__init__w   s     /#2{)8[2r2
99[/1CC;99_lADDJJt$	r/   r0   r1   c                     | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|S r3   )rs   rt   rd   rq   ru   r5   s     r.   r6   zMlp.forward   sU    JJqMHHQKHHQKIIaLHHQKIIaLr/   )r8   r9   r:   rQ   r&   rk   rR   r;   r   r	   rS   r<   r%   r(   r>   r6   r?   r@   s   @r.   rm   rm   q   s     .2*.)+*,..%% &c]% #3-	%
 BII% RYY% %* %,, r/   rm   c                   t     e Zd ZdZ	 	 	 	 	 d	dededef fdZdej                  dej                  fdZ xZ	S )
EfficientAdditiveAttentionz
    Efficient Additive Attention module for SwiftFormer.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H, W]
    in_dims	token_dim	num_headsc                    ||d}t         |           |dz  | _        t        j                  |||z  fi || _        t        j                  |||z  fi || _        t        j                  t        j                  ||z  dfi |      | _
        t        j                  ||z  ||z  fi || _        t        j                  ||z  |fi || _        y )Nr    g      r   )r$   r%   scale_factorr&   r   to_queryto_keyr'   r(   randnw_grM   final)r+   rz   r{   r|   r!   r"   r,   r-   s          r.   r%   z#EfficientAdditiveAttention.__init__   s     /%-		'9y+@GBGiiY)>E"E<<I	,A1 K KLIIi)3Y5JQbQ	YYy94iF2F
r/   r0   r1   c                 2   |j                   \  }}}}|j                  d      j                  ddd      }t        j                  | j                  |      d      }t        j                  | j                  |      d      }t        j                  || j                  z  | j                  z  d      }t        j                  ||z  dd      }| j                  ||z        |z   }	| j                  |	      j                  ddd      j                  |d||      }	|	S )Nr^   r   r   r   T)r   keepdim)shapeflattenpermuteF	normalizer   r   r   r~   r(   sumrM   r   reshape)
r+   r0   B_HWquerykeyattnouts
             r.   r6   z"EfficientAdditiveAttention.forward   s    WW
1aIIaL  Aq)DMM!,"5kk$++a.b1{{5488+d.?.??QGyy1d;iis
#e+jjo%%aA.66q"aC
r/   )      r   NN)
r8   r9   r:   rQ   r;   r%   r(   r>   r6   r?   r@   s   @r.   ry   ry      sY      GG G 	G& %,, r/   ry   c                        e Zd ZdZdddej
                  ej                  ddfdededed	e	d
e
ej                     de
ej                     f fdZdej                  dej                  fdZ xZS )LocalRepresentationz
    Local Representation module for SwiftFormer that is implemented by 3*3 depth-wise and point-wise convolutions.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H, W]
    rC   rW   TNr   rY   rZ   r\   r[   rJ   c	                    ||d}	t         
|           t        j                  |||f|dz  |d|	| _         ||fi |	| _        t        j                  ||fddi|	| _         |       | _        t        j                  ||fddi|	| _        |dkD  rt        |      nt        j                         | _        |rt        |dfi |	| _        y t        j                         | _        y )Nr    r^   r_   rY   r   rW   ra   )r+   r   rY   rZ   r\   r[   rJ   r!   r"   r,   r-   s             r.   r%   zLocalRepresentation.__init__   s     /iiS+b{a?OX[b_abs)b)	yyc?q?B?;yyc?q?B?09B),BKKM9H<Q5"5bkkmr/   r0   r1   c                     |}| j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }|| j                  |      z   }|S r3   rh   )r+   r0   skips      r.   r6   zLocalRepresentation.forward   sp    KKNIIaLLLOHHQKLLOQ4>>!$$r/   )r8   r9   r:   rQ   r&   rk   rR   r;   r<   r=   r	   rS   r%   r(   r>   r6   r?   r@   s   @r.   r   r      s      !!$()+*,..\\ \ 	\
 "\ BII\ RYY\*	 	%,, 	r/   r   c                        e Zd ZdZdddej
                  ej                  ddddf	deded	ed
ede	ej                     de	ej                     dedef fdZdej                  dej                  fdZ xZS )Blockz
    SwiftFormer Encoder Block for SwiftFormer. It consists of :
    (1) Local representation module, (2) EfficientAdditiveAttention, and (3) MLP block.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H, W]
          @rW   Tr7   Nr   	mlp_ratio	drop_raterZ   r[   rJ   r\   layer_scale_init_valuec           	         |	|
d}t         |           t        d||||d|| _        t	        d||d|| _        t        d|t        ||z        |||d|| _        |dkD  rt        |      nt        j                         | _        |rt        ||fi |nt        j                         | _        |rt        ||fi || _        y t        j                         | _        y )Nr    )r   r\   r[   rJ   )rz   r{   )rn   ro   r[   rJ   rq   rW    )r$   r%   r   local_representationry   r   rm   r;   linearr   r&   rN   rZ   r   layer_scale_1layer_scale_2)r+   r   r   r   rZ   r[   rJ   r\   r   r!   r"   r,   r-   s               r.   r%   zBlock.__init__   s     /$7 %
+!	%

 %
! /PscPRP	 
i0!
 
 1:B),BKKM *#/ELL$&KKM 	  *#/ELL$&KKM 	r/   r0   r1   c                     | j                  |      }|| j                  | j                  | j                  |                  z   }|| j                  | j	                  | j                  |                  z   }|S r3   )r   rZ   r   r   r   r   r5   s     r.   r6   zBlock.forward  sc    %%a(t11$))A,?@@t11$++a.ABBr/   rj   r@   s   @r.   r   r      s      "!!)+*,..$(,0#2#2 #2 	#2
 #2 BII#2 RYY#2 "#2 %*#2J %,, r/   r   c                        e Zd ZdZdej
                  ej                  dddddddf
deded	ee   d
e	de
ej                     de
ej                     de	de	dede	dee
ej                        f fdZdej                   dej                   fdZ xZS )Stagez
    Implementation of each SwiftFormer stages. Here, SwiftFormerEncoder used as the last block in all stages, while ConvEncoder used in the rest of the blocks.
    Input: tensor in shape [B, C, H, W]
    Output: tensor in shape [B, C, H, W]
    r   rW   Tr7   Nr   indexlayersr   r[   rJ   r   drop_path_rater\   r   
downsamplec                    ||d}t         |           d| _        ||nt        j                         | _        g }t        ||         D ]  }||t        |d |       z   z  t        |      dz
  z  }||   |z
  dk  r$|j                  t        |f||||||	|
d|       U|j                  t        d|t        ||z        d||||	d|        t        j                  | | _        y )Nr    Fr   )r   r   rZ   r[   rJ   r\   r   rC   )r   rX   rY   rZ   r[   rJ   r\   r   )r$   r%   grad_checkpointingr&   rN   r   ranger   appendr   rU   r;   
Sequentialblocks)r+   r   r   r   r   r[   rJ   r   r   r\   r   r   r!   r"   r,   r   	block_idx	block_dprr-   s                     r.   r%   zStage.__init__  s     /"'(2(>*BKKMve}- 	I&)c&%.6I*IJcRXk\]o^Ie}y(A-e
'''')$3+A
 
 
 k 	"9s?3 !'')$3	 	 		2 mmV,r/   r0   r1   c                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S r3   )r   r   r(   jitis_scriptingr   r   r5   s     r.   r6   zStage.forwardO  sS    OOA""599+A+A+Ct{{A.A  AAr/   )r8   r9   r:   rQ   r&   rk   rR   r;   r   r<   r	   rS   r=   r   r%   r(   r>   r6   r?   r@   s   @r.   r   r     s      ")+*,..!$&$(,048/-/- /- I	/-
 /- BII/- RYY/- /- "/- "/- %*/- !bii1/-b %,, r/   r   c            !           e Zd Zg dg ddg dej                  ddddd	d	d
ddddddfdee   dee   dedee   deej                     dedededede
de
dede
dededef  fdZd  Zej                  j                   d!efd"       Zej                  j                   d8d#ed!eeef   fd$       Zej                  j                   d9d%efd&       Zej                  j                   d!eej                  ej                  f   fd'       Zd:dedee   fd(Zej                  j                   d9d%efd)       Z	 	 	 	 	 d;d*ej8                  d+eeeee   f      d,ed-ed.ed/ed!eeej8                     eej8                  eej8                     f   f   fd0Z	 	 	 d<d+eeee   f   d1ed2efd3Zd*ej8                  d!ej8                  fd4Z d8d*ej8                  d5efd6Z!d*ej8                  fd7Z" xZ#S )=r   rC   rC         0   8   p      r   )FTTTrC   r^   r     rW   Tr7   avg    Nr   
embed_dims
mlp_ratiosdownsamplesr[   down_patch_sizedown_stridedown_padnum_classesr   r   r\   r   global_pooloutput_striderE   c                    t         |           ||d}|dk(  sJ |	| _        || _        || _        g | _        t        j                  t        j                  ||d   dz  dddfi |t        j                  |d   dz  fi |t        j                         t        j                  |d   dz  |d   dddfi |t        j                  |d   fi |t        j                               | _        |d   }g }t        t        |            D ]  }||   rt        d|||   |||d|nt        j                         }t!        d||   |||||
||||d
|}||   }|j#                  |       | xj
                  t%        ||   d|dz   z  d	| 
      gz  c_         t        j                  | | _        |d   x| _        x| _        }t        j                  |fi || _        t        j.                  |
      | _        |	dkD  rt3        ||	fi |nt        j                         | _        |	dkD  rt3        ||	fi |nt        j                         | _        d| _        | j;                          y )Nr    r   r   r^   rC   r   )rE   rF   rG   rH   rI   )
r   r   r   r   r[   r   r   r\   r   r   stages.)num_chs	reductionmoduler   Fr   )r$   r%   r   rE   r   feature_infor&   r   rL   rR   ReLUstemr   lenrB   rN   r   r   dictstagesnum_featureshead_hidden_sizerO   rv   	head_dropr   head	head_distdistilled_training_initialize_weights)r+   r   r   r   r   r[   r   r   r   r   r   r   r\   r   r   r   rE   r!   r"   kwargsr,   prev_dimr   ir   stageout_chsr-   s                              r.   r%   zSwiftFormer.__init__Y  s   , 	/"""& &MMIIh
1 2Aq!BrBNN:a=A-44GGIIIjmq(*Q-AqGBGNN:a=/B/GGI
	 a=s6{# 	iA Q # !$Q-*"   &([[]   qM$##- /'=% E "!}HMM% $z!}AaC[bcdbeYf"g!hh1	i2 mmV, @J"~MMT2WNN71b1	I.:E/F7K626r{{}	?JQ;;TVT_T_Ta"'  "r/   c                    | j                         D ]  \  }}t        |t        j                        rOt	        |j
                  d       |j                  Dt        j                  j                  |j                  d       ot        |t        j                        st	        |j
                  d       |j                  t        j                  j                  |j                  d        y )Ng{Gz?)stdr   )
named_modules
isinstancer&   r   r   weightbiasinit	constant_rL   )r+   namems      r.   r   zSwiftFormer._initialize_weights  s    ))+ 	1GD!!RYY'ahhC066%GG%%affa0Aryy)ahhC066%GG%%affa0	1r/   r1   c                     t               S r3   )setr+   s    r.   no_weight_decayzSwiftFormer.no_weight_decay  s	    ur/   coarsec                 ,    t        d|rdng d      }|S )Nz^stemz^stages\.(\d+)))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)z^norm)i )r   r   )r   )r+   r   matchers      r.   group_matcherzSwiftFormer.group_matcher  s!    (.$ 5
 r/   enablec                 4    | j                   D ]	  }||_         y r3   )r   r   )r+   r   ss      r.   set_grad_checkpointingz"SwiftFormer.set_grad_checkpointing  s     	*A#)A 	*r/   c                 2    | j                   | j                  fS r3   r   r   r   s    r.   get_classifierzSwiftFormer.get_classifier  s    yy$..((r/   c                    || _         ||| _        | j                  j                  j                  t        | j                  d      r | j                  j                  j                  nd}}|dkD  rt        | j                  |||      nt        j                         | _        |dkD  rt        | j                  |||      | _        y t        j                         | _        y )Nr   )NNr   r    )r   r   r   r   r!   hasattrr"   r   r   r&   rN   r   )r+   r   r   r!   r"   s        r.   reset_classifierzSwiftFormer.reset_classifier  s    &"*D		((//7SWS\S\^fKg1A1A1G1GmyZehiZiF4,,k&PUVoqozozo|	_jmn_n 1 1;vUZ[tvtt  uBr/   c                     || _         y r3   )r   )r+   r   s     r.   set_distilled_trainingz"SwiftFormer.set_distilled_training  s
    "(r/   r0   indicesrO   
stop_early
output_fmtintermediates_onlyc                    |dv sJ d       g }t        t        | j                        |      \  }}	t        | j                        dz
  }
| j                  |      }t        j
                  j                         s|s| j                  }n| j                  d|	dz    }t        |      D ]>  \  }} ||      }||v s|r||
k(  r| j                  |      }n|}|j                  |       @ |r|S |
k(  r| j                  |      }||fS )a   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )NCHWzOutput shape must be NCHW.r   N)
r   r   r   r   r(   r   r   	enumeraterO   r   )r+   r0   r  rO   r  r  r	  intermediatestake_indices	max_indexlast_idxr   feat_idxr   x_inters                  r.   forward_intermediatesz!SwiftFormer.forward_intermediates  s   * Y&D(DD&"6s4;;7G"Qit{{#a' IIaL99!!#:[[F[[)a-0F(0 	.OHeaA<'H0"iilGG$$W-	.   x		!A-r/   
prune_norm
prune_headc                     t        t        | j                        |      \  }}| j                  d|dz    | _        |rt        j                         | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        Nr   r    )r   r   r   r&   rN   rO   r  )r+   r  r  r  r  r  s         r.   prune_intermediate_layersz%SwiftFormer.prune_intermediate_layers	  s]     #7s4;;7G"Qikk.9q=1DI!!!R(r/   c                 l    | j                  |      }| j                  |      }| j                  |      }|S r3   )r   r   rO   r5   s     r.   forward_featureszSwiftFormer.forward_features  s.    IIaLKKNIIaLr/   
pre_logitsc                 6   | j                   dk(  r|j                  d      }| j                  |      }|r|S | j                  |      | j	                  |      }}| j
                  r.| j                  r"t        j                  j                         s||fS ||z   dz  S )Nr   )r^   rC   r   r^   )
r   meanr   r   r   r   trainingr(   r   r   )r+   r0   r  x_dists       r.   forward_headzSwiftFormer.forward_head  s    u$6"ANN1HIIaL$.."36""t}}UYY=S=S=Uf9 J!##r/   c                 J    | j                  |      }| j                  |      }|S r3   )r  r   r5   s     r.   r6   zSwiftFormer.forward-  s'    !!!$a r/   F)Tr3   )NFFr  F)r   FT)$r8   r9   r:   r&   rk   r   r;   r=   r	   rS   r<   strr%   r   r(   r   ignorer   r   r   r   r   r   r   r   r   r  r  r>   r
   r  r  r  r   r6   r?   r@   s   @r.   r   r   X  s    !-$6&?)+#$ #!$&$(,0$!#'L#IL# S	L# 	L#
 dL# BIIL# !L# L# L# L# L# "L# "L# %*L# L#  !L#" #L#\	1 YY   YY	D 	T#s(^ 	 	 YY*T * * YY)bii&: ; ) )BC Bhsm B YY)T ) ) 8<$$',0 ||0  eCcN340  	0 
 0  0  !%0  
tELL!5tELL7I)I#JJ	K0 h ./$#	3S	>*  	 %,, 5<< $ell $ $ r/   
state_dictmodelr1   c                    | j                  d|       } d| v r| S i }| j                         D ]  \  }}|j                  dd      }|j                  dd      }|j                  dd      }|j                  d	d
      }|j                  dd      }t        j                  dd|      }t        j
                  d|      }|rLt        |j                  d            |j                  d      }}|dz  }|dz  dk(  r	d| d| }nd|dz    d| }|||<    |S )Nr&  zstem.0.weightzpatch_embed.zstem.z
dist_head.z
head_dist.z
attn.Proj.z
attn.proj.z.layer_scale_1z.layer_scale_1.gammaz.layer_scale_2z.layer_scale_2.gammaz\.layer_scale(?=$|\.)z.layer_scale.gammaz^network\.(\d+)\.(.*)r   r^   r   r   z.blocks.z.downsample.)getitemsreplaceresubmatchr;   group)	r%  r&  out_dictkvr   n_idxrest	stage_idxs	            r.   checkpoint_filter_fnr5  3  s&   4J*$H  " 1IIng.IIlL1IIlL1II&(>?II&(>?FF+-A1EHH-q1aggaj/1771:4E
IqyA~i[7ik],tf=!" Or/   urlr   c                 :    | ddd dddt         t        dddd	d
dd|S )Nr   )rC      r8  Tgffffff?bicubiczstem.0r   z
apache-2.0zarXiv:2303.15446zdSwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applicationsz'https://github.com/Amshaker/SwiftFormer)r6  r   
input_size	pool_sizefixed_input_sizecrop_pctinterpolationr  r   
first_conv
classifierlicense	paper_ids
paper_name
origin_urlr   )r6  r   s     r.   _cfgrE  M  s@    =tae)%.B.C'|?  r/   ztimm/)	hf_hub_id)zswiftformer_xs.dist_in1kzswiftformer_s.dist_in1kzswiftformer_l1.dist_in1kzswiftformer_l3.dist_in1kvariant
pretrainedc                 N    t        t        | |ft        t        dd      d|}|S )N)r   r   r^   rC   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r5  r   )rG  rH  r   r&  s       r.   _create_swiftformerrN  l  s6     Wj1\dK 	E Lr/   c           	      R    t        g dg d      }t        dd| it        |fi |S )Nr   r   r   r   rH  )swiftformer_xsr   rN  rH  r   
model_argss      r.   rQ  rQ  v  s-    \6HIJeJe$zJd]cJdeer/   c           	      R    t        g dg d      }t        dd| it        |fi |S )N)rC   rC   	   r   )r   rV      r8  rP  rH  )swiftformer_srR  rS  s      r.   rX  rX  |  s-    \6HIJd:djIc\bIcddr/   c           	      R    t        g dg d      }t        dd| it        |fi |S )N)r   rC   
      )r   `      i  rP  rH  )swiftformer_l1rR  rS  s      r.   r^  r^    s-    ]7IJJeJe$zJd]cJdeer/   c           	      R    t        g dg d      }t        dd| it        |fi |S )N)r   r      r   )rV      i@  r   rP  rH  )swiftformer_l3rR  rS  s      r.   rb  rb    s-    ]7JKJeJe$zJd]cJdeer/   )r  r"  )9rQ   r+  typingr   r   r   r   r   r   r	   r
   r(   torch.nnr&   torch.nn.functional
functionalr   	timm.datar   r   timm.layersr   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rS   r   rB   rU   rm   ry   r   r   r   r   r#  r>   r5  rE  default_cfgsr=   rN  rQ  rX  r^  rb  r   r/   r.   <module>ro     sY   
 E E E     A M M * + ' </	F299 	F		 >%")) %P"")) "J% %P$")) $N0BII 0f=BII =@X")) XvT#u||*;%< RYY SWX[]b]i]iXiSj 4c # $sCx.  % $!  $  !%! !%!&   $ # R]  ft fs f{ f f
 ed ec ek e e ft fs f{ f f
 ft fs f{ f fr/   