U
    ¯Ê¹j	a  ã                   @   s0  d Z ddlZddlmZ ddlmZ ddlZddl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mZmZmZmZ dd	lmZ dd
lmZ ddlmZmZ dddddœZdddddœZdddddœZ G dd„ dej!ƒZ"G dd„ dejj!ƒZ#G dd„ dejj!ƒZ$G dd „ d ejj!ƒZ%G d!d"„ d"ej!ƒZ&G d#d$„ d$ej!ƒZ'G d%d&„ d&ej!ƒZ(G d'd(„ d(ej!ƒZ)G d)d*„ d*ej*ƒZ+G d+d,„ d,ej!ƒZ,G d-d.„ d.ej!ƒZ-dAd0d1„Z.ee.d2d3�e.d2d3�e.d2d3�e.d2d3�d4œƒZ/dBd6d7„Z0edCe-d8œd9d:„ƒZ1edDe-d8œd;d<„ƒZ2edEe-d8œd=d>„ƒZ3edFe-d8œd?d@„ƒZ4dS )GaJ   EfficientFormer-V2

@article{
    li2022rethinking,
    title={Rethinking Vision Transformers for MobileNet Size and Speed},
    author={Li, Yanyu and Hu, Ju and Wen, Yang and Evangelidis, Georgios and Salahi, Kamyar and Wang, Yanzhi and Tulyakov, Sergey and Ren, Jian},
    journal={arXiv preprint arXiv:2212.08059},
    year={2022}
}

Significantly refactored and cleaned up for timm from original at: https://github.com/snap-research/EfficientFormer

Original code licensed Apache 2.0, Copyright (c) 2022 Snap Inc.

Modifications and timm support by / Copyright 2023, Ross Wightman
é    N)Úpartial)ÚDict©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Úcreate_conv2dÚcreate_norm_layerÚget_act_layerÚget_norm_layerÚConvNormAct)ÚDropPathÚtrunc_normal_Ú	to_2tupleÚ	to_ntupleÚndgridé   )Úbuild_model_with_cfg)Úcheckpoint_seq)Úgenerate_default_cfgsÚregister_model)é(   éP   éÀ   é€  )é    é@   é�   i   )r   é0   éx   éà   )r   r   é`   é°   )ÚLÚS2ÚS1ÚS0)é   r&   é   é
   )é   r)   é   é   )é   r,   é	   é   )é   r/   r.   r)   )r)   r)   )r)   r)   r)   r)   r,   r,   r,   r,   r,   r,   r,   r)   r)   r)   r)   )
r)   r)   r)   r,   r,   r,   r,   r)   r)   r)   )r)   r)   )r)   r)   r,   r,   r,   r,   r,   r,   r)   r)   r)   r)   )r)   r)   r,   r,   r,   r,   r)   r)   )r)   r)   )	r)   r)   r,   r,   r,   r,   r)   r)   r)   )r)   r)   r,   r,   r)   r)   )r)   r)   )r)   r,   r,   r,   r)   r)   )r)   r,   r,   r)   c                       s&   e Zd Zd
‡ fdd„	Zdd	„ Z‡  ZS )ÚConvNormr   Ú TÚbatchnorm2dNc              
      sD   |
pi }
t t| ƒ ¡  t||||||||d�| _t|	|f|
Ž| _d S )N)ÚstrideÚpaddingÚdilationÚgroupsÚbias)Úsuperr0   Ú__init__r   Úconvr   Úbn)ÚselfZin_channelsZout_channelsÚkernel_sizer3   r4   r5   r6   r7   Ú
norm_layerZnorm_kwargs©Ú	__class__© ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/efficientformer_v2.pyr9   7   s    ø
zConvNorm.__init__c                 C   s   |   |¡}|  |¡}|S ©N)r:   r;   ©r<   ÚxrA   rA   rB   ÚforwardR   s    

zConvNorm.forward)r   r   r1   r   r   Tr2   N©Ú__name__Ú
__module__Ú__qualname__r9   rF   Ú__classcell__rA   rA   r?   rB   r0   6   s           õr0   c                       st   e Zd ZU eeejf ed< dddddej	df‡ fdd	„	Z
e ¡ d‡ fdd„	ƒZejejdœdd„Zdd„ Z‡  ZS )ÚAttention2dÚattention_bias_cacher   r   r+   r)   é   Nc                    sð  t ƒ  ¡  || _|d | _|| _t|ƒ}ˆ d k	rlt‡ fdd„|D ƒƒ}t||dˆ |d�| _t	j
ˆ dd�| _nd | _d | _|| _| jd | jd	  | _t|| ƒ| _t|| ƒ| | _|| _| j| j }t||ƒ| _t||ƒ| _t|| jƒ| _t| j| jd| jd
�| _t	j| j| jd	d�| _t	j| j| jd	d�| _|ƒ | _t| j|d	ƒ| _t tt | jd ¡t | jd	 ¡ƒ¡ d	¡}	|	dd d …d f |	dd d d …f    ¡ }
|
d | jd	  |
d	  }
tj	 !t "|| j¡¡| _#| j$dt %|
¡dd� i | _&d S )Nç      à¿c                    s   g | ]}t  |ˆ  ¡‘qS rA   ©ÚmathÚceil©Ú.0Úr©r3   rA   rB   Ú
<listcomp>l   s     z(Attention2d.__init__.<locals>.<listcomp>r,   ©r=   r3   r6   Zbilinear)Zscale_factorÚmoder   r   )r=   r6   )r=   .Úattention_bias_idxsF©Ú
persistent)'r8   r9   Ú	num_headsÚscaleÚkey_dimr   Útupler0   Ústride_convÚnnZUpsampleÚupsampleÚ
resolutionÚNÚintÚdÚdhÚ
attn_ratioÚqÚkÚvÚv_localÚConv2dÚtalking_head1Útalking_head2ÚactÚprojÚtorchÚstackr   ÚarangeÚflattenÚabsÚ	ParameterÚzerosÚattention_biasesÚregister_bufferZ
LongTensorrM   )r<   Údimr_   r]   ri   rd   Ú	act_layerr3   ÚkhÚposÚrel_posr?   rV   rB   r9   [   s>    


.(zAttention2d.__init__Tc                    s    t ƒ  |¡ |r| jri | _d S rC   ©r8   ÚtrainrM   ©r<   rY   r?   rA   rB   r‚   ‹   s    
zAttention2d.train©ÚdeviceÚreturnc                 C   s^   t j ¡ s| jr$| jd d …| jf S t|ƒ}|| jkrP| jd d …| jf | j|< | j| S d S rC   ©rs   ÚjitÚ
is_tracingÚtrainingrz   rZ   ÚstrrM   ©r<   r…   Z
device_keyrA   rA   rB   Úget_attention_biases‘   s    
z Attention2d.get_attention_biasesc                 C   s@  |j \}}}}| jd k	r"|  |¡}|  |¡ || jd| j¡ dddd¡}|  |¡ || jd| j¡ dddd¡}|  |¡}|  	|¡}	| || jd| j¡ dddd¡}|| | j
 }
|
|  |j¡ }
|  |
¡}
|
jdd�}
|  |
¡}
|
|  dd¡}| || j| jd | jd ¡|	 }| jd k	�r(|  |¡}|  |¡}|  |¡}|S ©Néÿÿÿÿr   r   r,   r/   ©r|   )Úshapera   rj   Úreshaper]   re   Úpermuterk   rl   rm   r^   r�   r…   ro   Úsoftmaxrp   Ú	transposerh   rd   rc   rq   rr   ©r<   rE   ÚBÚCÚHÚWrj   rk   rl   rm   ÚattnrA   rA   rB   rF   š   s(    

&&

 

"


zAttention2d.forward)T©rH   rI   rJ   r   r‹   rs   ZTensorÚ__annotations__rb   ÚGELUr9   Zno_gradr‚   r…   r�   rF   rK   rA   rA   r?   rB   rL   X   s   
ø0	rL   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚLocalGlobalQueryc                    sD   t ƒ  ¡  t ddd¡| _tj||ddd|d�| _t||dƒ| _d S )Nr   r/   r   r,   )r=   r3   r4   r6   )	r8   r9   rb   Z	AvgPool2dÚpoolrn   Úlocalr0   rr   )r<   Zin_dimÚout_dimr?   rA   rB   r9   ¶   s    
zLocalGlobalQuery.__init__c                 C   s*   |   |¡}|  |¡}|| }|  |¡}|S rC   )r¡   r    rr   )r<   rE   Zlocal_qZpool_qrj   rA   rA   rB   rF   ¼   s
    


zLocalGlobalQuery.forwardrG   rA   rA   r?   rB   rŸ   µ   s   rŸ   c                       st   e Zd ZU eeejf ed< ddddddej	f‡ fdd	„	Z
e ¡ d‡ fdd„	ƒZejejdœdd„Zdd„ Z‡  ZS )ÚAttention2dDownsamplerM   r   é   r+   r)   rN   Nc              	      sà  t ƒ  ¡  || _|d | _|| _t|ƒ| _tdd„ | jD ƒƒ| _| jd | jd  | _	| jd | jd  | _
t|| ƒ| _t|| ƒ| | _|| _|p˜|| _| j| j }t||ƒ| _t||dƒ| _t|| jdƒ| _t| j| jdd| jd�| _|ƒ | _t| j| jdƒ| _t t || j	¡¡| _t tt | jd ¡t | jd ¡ƒ¡  d¡}	t ttjd| jd dd	�tjd| jd dd	�ƒ¡  d¡}
|
d
d d …d f |	d
d d d …f   !¡ }|d | jd  |d  }| j"d|dd� i | _#d S )NrO   c                 S   s   g | ]}t  |d  ¡‘qS ©r/   rP   rS   rA   rA   rB   rW   ×   s     z2Attention2dDownsample.__init__.<locals>.<listcomp>r   r   r,   r/   rX   )Ústep.rZ   Fr[   )$r8   r9   r]   r^   r_   r   rd   r`   Úresolution2re   ÚN2rf   rg   rh   ri   r¢   rŸ   rj   r0   rk   rl   rm   rq   rr   rb   rx   rs   ry   rz   rt   r   ru   rv   rw   r{   rM   )r<   r|   r_   r]   ri   rd   r¢   r}   r~   Zk_posZq_posr€   r?   rA   rB   r9   Ç   s>    




.þý(zAttention2dDownsample.__init__Tc                    s    t ƒ  |¡ |r| jri | _d S rC   r�   rƒ   r?   rA   rB   r‚   ô   s    
zAttention2dDownsample.trainr„   c                 C   s^   t j ¡ s| jr$| jd d …| jf S t|ƒ}|| jkrP| jd d …| jf | j|< | j| S d S rC   r‡   rŒ   rA   rA   rB   r�   ú   s    
z*Attention2dDownsample.get_attention_biasesc                 C   s  |j \}}}}|  |¡ || jd| j¡ dddd¡}|  |¡ || jd| j¡ dddd¡}|  |¡}|  	|¡}	| || jd| j¡ dddd¡}|| | j
 }
|
|  |j¡ }
|
jdd�}
|
|  dd¡}| || j| jd | jd ¡|	 }|  |¡}|  |¡}|S rŽ   )r‘   rj   r’   r]   r¨   r“   rk   re   rl   rm   r^   r�   r…   r”   r•   rh   r§   rq   rr   r–   rA   rA   rB   rF     s    &&

 "

zAttention2dDownsample.forward)Trœ   rA   rA   r?   rB   r£   Ä   s   
ø-	r£   c                       s8   e Zd Zdddddejejf‡ fdd„	Zdd	„ Z‡  ZS )
Ú
Downsampler,   r/   r   rN   Fc
           
         sf   t ƒ  ¡  t|ƒ}t|ƒ}t|ƒ}|	p,t ¡ }	t||||||	d�| _|r\t||||d�| _nd | _d S )N)r=   r3   r4   r>   )r|   r¢   rd   r}   )	r8   r9   r   rb   ÚIdentityr0   r:   r£   r›   )
r<   Úin_chsÚout_chsr=   r3   r4   rd   Úuse_attnr}   r>   r?   rA   rB   r9     s*    
ú	ü
zDownsample.__init__c                 C   s&   |   |¡}| jd k	r"|  |¡| S |S rC   )r:   r›   )r<   rE   ÚoutrA   rA   rB   rF   =  s    

zDownsample.forward©	rH   rI   rJ   rb   rž   ÚBatchNorm2dr9   rF   rK   rA   rA   r?   rB   r©     s   ö%r©   c                       s:   e Zd ZdZddejejddf‡ fdd„	Zdd„ Z‡  Z	S )	ÚConvMlpWithNormz`
    Implementation of MLP with 1*1 convolutions.
    Input: tensor with shape [B, C, H, W]
    Nç        Fc              	      s†   t ƒ  ¡  |p|}|p|}t||dd||d�| _|rNt||d|d||d�| _n
t ¡ | _t |¡| _t	||d|d�| _
t |¡| _d S )Nr   T)r7   r>   r}   r,   )r6   r7   r>   r}   )r>   )r8   r9   r   Úfc1Úmidrb   rª   ÚDropoutÚdrop1r0   Úfc2Údrop2)r<   Úin_featuresÚhidden_featuresZout_featuresr}   r>   ÚdropÚmid_convr?   rA   rB   r9   J  s2    

    þ     þ

zConvMlpWithNorm.__init__c                 C   s6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S rC   )r³   r´   r¶   r·   r¸   rD   rA   rA   rB   rF   d  s    




zConvMlpWithNorm.forward)
rH   rI   rJ   Ú__doc__rb   rž   r°   r9   rF   rK   rA   rA   r?   rB   r±   D  s   ør±   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )ÚLayerScale2dçñhãˆµøä>Fc                    s*   t ƒ  ¡  || _t |t |¡ ¡| _d S rC   )r8   r9   Úinplacerb   rx   rs   ZonesÚgamma)r<   r|   Zinit_valuesrÀ   r?   rA   rB   r9   n  s    
zLayerScale2d.__init__c                 C   s*   | j  dddd¡}| jr"| |¡S || S )Nr   r�   )rÁ   ÚviewrÀ   Zmul_)r<   rE   rÁ   rA   rA   rB   rF   s  s    zLayerScale2d.forward)r¿   FrG   rA   rA   r?   rB   r¾   m  s   r¾   c                	       s<   e Zd Zdejejddddddf	‡ fdd„	Zd	d
„ Z‡  ZS )ÚEfficientFormerV2Blockç      @r²   r¿   rN   NTc                    sÂ   t ƒ  ¡  |
rXt||||	d�| _|d k	r2t||ƒnt ¡ | _|dkrLt|ƒnt ¡ | _	nd | _d | _d | _	t
|t|| ƒ|||dd�| _|d k	ršt||ƒnt ¡ | _|dkr´t|ƒnt ¡ | _d S )N)rd   r}   r3   r²   T)r¹   rº   r}   r>   r»   r¼   )r8   r9   rL   Útoken_mixerr¾   rb   rª   Úls1r   Ú
drop_path1r±   rf   ÚmlpÚls2Ú
drop_path2)r<   r|   Ú	mlp_ratior}   r>   Ú	proj_dropÚ	drop_pathÚlayer_scale_init_valuerd   r3   r­   r?   rA   rB   r9   y  sF    
üÿ ÿÿ
ú	ÿ ÿÿzEfficientFormerV2Block.__init__c                 C   sB   | j d k	r$||  |  |   |¡¡¡ }||  |  |  |¡¡¡ }|S rC   )rÅ   rÇ   rÆ   rÊ   rÉ   rÈ   rD   rA   rA   rB   rF   £  s    
zEfficientFormerV2Block.forwardr¯   rA   rA   r?   rB   rÃ   x  s   õ*rÃ   c                       s&   e Zd Zejejf‡ fdd„	Z‡  ZS )ÚStem4c              
      sP   t ƒ  ¡  d| _t||d dddd||d�| _t|d |dddd||d�| _d S )Nr)   r/   r,   r   T)r=   r3   r4   r7   r>   r}   )r8   r9   r3   r   Zconv1Zconv2)r<   r«   r¬   r}   r>   r?   rA   rB   r9   «  s,    
      þ      þzStem4.__init__)rH   rI   rJ   rb   rž   r°   r9   rK   rA   rA   r?   rB   rÏ   ª  s   rÏ   c                       sB   e Zd Zddddddddddejejf‡ fd	d
„	Zdd„ Z‡  ZS )ÚEfficientFormerV2StagerN   TNFr   rÄ   r²   r¿   c                    sÐ   t ƒ  ¡  d| _t|ƒ|
ƒ}
t|ƒ}|rVt||||||d�| _|}tdd„ |D ƒƒ}n||ksbt‚t	 
¡ | _g }t|ƒD ]F}||	 d }t||||
| |o ||k||| |||d�
}||g7 }qxt	j|Ž | _d S )NF)r­   rd   r>   r}   c                 S   s   g | ]}t  |d  ¡‘qS r¥   rP   rS   rA   rA   rB   rW   Ü  s     z3EfficientFormerV2Stage.__init__.<locals>.<listcomp>r   )	rd   r3   rË   r­   rÌ   rÍ   rÎ   r}   r>   )r8   r9   Úgrad_checkpointingr   r   r©   Ú
downsampler`   ÚAssertionErrorrb   rª   ÚrangerÃ   Ú
SequentialÚblocks)r<   r|   Zdim_outÚdepthrd   rÒ   Úblock_strideÚdownsample_use_attnÚblock_use_attnÚnum_vitrË   rÌ   rÍ   rÎ   r}   r>   rÖ   Z	block_idxZ
remain_idxÚbr?   rA   rB   r9   º  sD    
ú

özEfficientFormerV2Stage.__init__c                 C   s6   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|S rC   )rÒ   rÑ   rs   rˆ   Úis_scriptingr   rÖ   rD   rA   rA   rB   rF   ó  s
    

zEfficientFormerV2Stage.forwardr¯   rA   rA   r?   rB   rÐ   ¸  s   ð9rÐ   c                       s¦   e Zd Zd%‡ fdd„	Zdd„ Zejjdd„ ƒZejjd&dd„ƒZ	ejjd'dd„ƒZ
ejjdd„ ƒZd(dd„Zejjd)dd„ƒZdd„ Zd*ed œd!d"„Zd#d$„ Z‡  ZS )+ÚEfficientFormerV2r,   r   ÚavgNr)   r2   r¿   Úgeluéè  r²   r   Tc                    s  t ƒ  ¡  |dkst‚|| _|| _g | _t|ƒ}tt|ƒ|	d�}t	|
ƒ}
t
||d |
|d�| _|d }d‰ t|ƒ}dd„ t d|t|ƒ¡ |¡D ƒ}|pªdd	t|ƒd
   }t|ƒ|ƒ}g }t|ƒD ]®}t‡ fdd„|D ƒƒ}t||| || ||| |dk�rdnd |dk|dk||| ||| ||
|d�}|| �r@ˆ d9 ‰ || }|  jt|ˆ d|› �d�g7  _| |¡ qÄtj|Ž | _|d | _||d ƒ| _t |¡| _|dk�r¾t |d |¡nt ¡ | _ || _!| j!�rü|dk�rðt |d |¡nt ¡ | _"nd | _"|  #| j$¡ d| _%d S )N)rß   r1   )Úepsr   )r}   r>   r)   c                 S   s   g | ]}|  ¡ ‘qS rA   )Útolist)rT   rE   rA   rA   rB   rW     s     z.EfficientFormerV2.__init__.<locals>.<listcomp>)F)Tr   c                    s   g | ]}t  |ˆ  ¡‘qS rA   rP   )rT   ÚsrV   rA   rB   rW   $  s     r/   r,   )r×   rd   rÒ   rØ   rÙ   rÚ   rÛ   rË   rÌ   rÍ   rÎ   r}   r>   zstages.)Znum_chsZ	reductionÚmoduler�   F)&r8   r9   rÓ   Únum_classesÚglobal_poolZfeature_infor   r   r
   r	   rÏ   ÚstemÚlenrs   ZlinspaceÚsumÚsplitr   rÔ   r`   rÐ   ÚdictÚappendrb   rÕ   ÚstagesÚnum_featuresÚnormrµ   Ú	head_dropÚLinearrª   ÚheadÚdistÚ	head_distÚapplyÚinit_weightsÚdistilled_training)r<   ÚdepthsZin_chansZimg_sizerç   Ú
embed_dimsZdownsamplesÚ
mlp_ratiosr>   Znorm_epsr}   ræ   Z	drop_rateZproj_drop_rateÚdrop_path_raterÎ   rÛ   ZdistillationZprev_dimZ
num_stagesZdprrî   ÚiZcurr_resolutionZstager?   rV   rB   r9   ý  sf    
"ñ
 
$&zEfficientFormerV2.__init__c                 C   s8   t |tjƒr4t|jdd� |jd k	r4tj |jd¡ d S )Nç{®Gáz”?)Ústdr   )Ú
isinstancerb   rò   r   Úweightr7   ÚinitZ	constant_)r<   ÚmrA   rA   rB   r÷   L  s    
zEfficientFormerV2.init_weightsc                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s   h | ]\}}d |kr|’qS )rz   rA   )rT   rk   Ú_rA   rA   rB   Ú	<setcomp>T  s      z4EfficientFormerV2.no_weight_decay.<locals>.<setcomp>)Znamed_parameters©r<   rA   rA   rB   Úno_weight_decayR  s    z!EfficientFormerV2.no_weight_decayFc                 C   s   t dddgd�}|S )Nz^stem)z^stages\.(\d+)N)z^norm)iŸ† )rè   rÖ   )rì   )r<   ZcoarseZmatcherrA   rA   rB   Úgroup_matcherV  s
    þzEfficientFormerV2.group_matcherc                 C   s   | j D ]
}||_qd S rC   )rî   rÑ   )r<   Úenablerä   rA   rA   rB   Úset_grad_checkpointing^  s    
z(EfficientFormerV2.set_grad_checkpointingc                 C   s   | j | jfS rC   ©ró   rõ   r  rA   rA   rB   Úget_classifierc  s    z EfficientFormerV2.get_classifierc                 C   sX   || _ |d k	r|| _|dkr*t | j|¡nt ¡ | _|dkrJt | j|¡nt ¡ | _d S )Nr   )ræ   rç   rb   rò   rï   rª   ró   rõ   )r<   ræ   rç   rA   rA   rB   Úreset_classifierg  s
     z"EfficientFormerV2.reset_classifierc                 C   s
   || _ d S rC   )rø   )r<   r	  rA   rA   rB   Úset_distilled_trainingn  s    z(EfficientFormerV2.set_distilled_trainingc                 C   s"   |   |¡}|  |¡}|  |¡}|S rC   )rè   rî   rð   rD   rA   rA   rB   Úforward_featuresr  s    


z"EfficientFormerV2.forward_features)Ú
pre_logitsc                 C   sl   | j dkr|jdd�}|  |¡}|r(|S |  |¡|  |¡ }}| jr\| jr\tj 	¡ s\||fS || d S d S )Nrß   )r/   r,   r�   r/   )
rç   Úmeanrñ   ró   rõ   rø   rŠ   rs   rˆ   rÝ   )r<   rE   r  Zx_distrA   rA   rB   Úforward_headx  s    

zEfficientFormerV2.forward_headc                 C   s   |   |¡}|  |¡}|S rC   )r  r  rD   rA   rA   rB   rF   †  s    

zEfficientFormerV2.forward)r,   r   rß   NNr)   r2   r¿   rà   rá   r²   r²   r²   r¿   r   T)F)T)N)T)F)rH   rI   rJ   r9   r÷   rs   rˆ   Úignorer  r  r
  r  r  r  r  Úboolr  rF   rK   rA   rA   r?   rB   rÞ   ü  s@                   îO


rÞ   r1   c                 K   s    | ddd dddt tdddœ|–S )	Nrá   )r,   r   r   Tgffffffî?Zbicubicr  zstem.conv1.conv)Úurlræ   Z
input_sizeZ	pool_sizeZfixed_input_sizeZcrop_pctÚinterpolationr  rÿ   Ú
classifierZ
first_convr   )r  ÚkwargsrA   rA   rB   Ú_cfgŒ  s          ûúr  ztimm/)Z	hf_hub_id)z#efficientformerv2_s0.snap_dist_in1kz#efficientformerv2_s1.snap_dist_in1kz#efficientformerv2_s2.snap_dist_in1kz"efficientformerv2_l.snap_dist_in1kFc                 K   s0   |  dd¡}tt| |fdtd|d�i|—Ž}|S )NÚout_indices)r   r   r/   r,   Zfeature_cfgT)Zflatten_sequentialr  )Úpopr   rÞ   rì   )ÚvariantÚ
pretrainedr  r  ÚmodelrA   rA   rB   Ú_create_efficientformerv2§  s      ÿ
þýr  )r†   c                 K   s8   t td td ddtd d�}tdd| it |f|Ž—ŽS )Nr%   r/   r²   ©rù   rú   rÛ   rü   rû   Úefficientformerv2_s0r  )r!  ©rì   ÚEfficientFormer_depthÚEfficientFormer_widthÚ EfficientFormer_expansion_ratiosr  ©r  r  Z
model_argsrA   rA   rB   r!  °  s    ûr!  c                 K   s8   t td td ddtd d�}tdd| it |f|Ž—ŽS )Nr$   r/   r²   r   Úefficientformerv2_s1r  )r'  r"  r&  rA   rA   rB   r'  ¼  s    ûr'  c                 K   s8   t td td ddtd d�}tdd| it |f|Ž—ŽS )Nr#   r)   rþ   r   Úefficientformerv2_s2r  )r(  r"  r&  rA   rA   rB   r(  È  s    ûr(  c                 K   s8   t td td ddtd d�}tdd| it |f|Ž—ŽS )Nr"   r.   gš™™™™™¹?r   Úefficientformerv2_lr  )r)  r"  r&  rA   rA   rB   r)  Ô  s    ûr)  )r1   )F)F)F)F)F)5r½   rQ   Ú	functoolsr   Útypingr   rs   Ztorch.nnrb   Z	timm.datar   r   Ztimm.layersr   r   r	   r
   r   r   r   r   r   r   Z_builderr   Z_manipulater   Ú	_registryr   r   r$  r#  r%  ÚModuler0   rL   rŸ   r£   r©   r±   r¾   rÃ   rÕ   rÏ   rÐ   rÞ   r  Zdefault_cfgsr  r!  r'  r(  r)  rA   rA   rA   rB   Ú<module>   s|   üüü"]S-)2D 
ÿÿÿÿö
	