U
    ¯Ê¹jà\  ã                   @   sX  d Z dgZddl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
  mZ ddlmZmZ ddlmZ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  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
j#ƒZ)G dd„ de
j#ƒZ*ee*ƒ G dd„ de
j#ƒZ+G dd„ de
j#ƒZ,d d!„ Z-d?d#d$„Z.e e.d%d&d'�e.d%d(�e.d%d(�e.d%d&d'�e.d%d(�e.d%d(�e.d%d&d'�e.d%d(�e.d%d(�e.d%d)d*d+d,�e.d%d-d.d+d/d0�d1œƒZ/d@d3d4„Z0edAd5d6„ƒZ1edBd7d8„ƒZ2edCd9d:„ƒZ3edDd;d<„ƒZ4edEd=d>„ƒZ5dS )FzÓ TinyViT

Paper: `TinyViT: Fast Pretraining Distillation for Small Vision Transformers`
    - https://arxiv.org/abs/2207.10666

Adapted from official impl at https://github.com/microsoft/Cream/tree/main/TinyViT
ÚTinyVité    N)Úpartial)ÚDict©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚLayerNorm2dÚNormMlpClassifierHeadÚDropPathÚtrunc_normal_Úresize_rel_pos_bias_table_levitÚuse_fused_attné   )Úbuild_model_with_cfg)Úregister_notrace_module)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsc                       s.   e Zd Zd‡ fdd„	Ze ¡ dd„ ƒZ‡  ZS )ÚConvNormr   r   c	           	   
      s^   t ƒ  ¡  tj|||||||dd�| _t |¡| _tjj 	| jj
|¡ tjj 	| jjd¡ d S )NF)Úbiasr   )ÚsuperÚ__init__ÚnnÚConv2dÚconvZBatchNorm2dÚbnÚtorchÚinitÚ	constant_Úweightr   )	ÚselfÚin_chsÚout_chsÚksÚstrideÚpadÚdilationÚgroupsÚbn_weight_init©Ú	__class__© úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/tiny_vit.pyr      s
    
zConvNorm.__init__c              	   C   sÈ   | j | j }}|j|j|j d  }|j|d d …d d d f  }|j|j|j |j|j d   }tjj	| 
d¡| j j | 
d¡|jdd … | j j| j j| j j| j jd�}|jj |¡ |jj |¡ |S )Ng      à?r   r   é   )r$   Úpaddingr&   r'   )r   r   r   Zrunning_varÚepsr   Zrunning_meanr   r   r   Úsizer'   Úshaper$   r.   r&   ÚdataZcopy_)r    Úcr   ÚwÚbÚmr+   r+   r,   Úfuse%   s$    ÿ     þzConvNorm.fuse)r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r   r   Úno_gradr7   Ú__classcell__r+   r+   r)   r,   r      s   r   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )Ú
PatchEmbedc                    sH   t ƒ  ¡  d| _t||d dddƒ| _|ƒ | _t|d |dddƒ| _d S )Né   r-   é   r   )r   r   r$   r   Úconv1ÚactÚconv2)r    r!   r"   Ú	act_layerr)   r+   r,   r   5   s
    
zPatchEmbed.__init__c                 C   s"   |   |¡}|  |¡}|  |¡}|S ©N)r@   rA   rB   ©r    Úxr+   r+   r,   Úforward<   s    


zPatchEmbed.forward©r8   r9   r:   r   rG   r<   r+   r+   r)   r,   r=   4   s   r=   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚMBConvc                    s„   t ƒ  ¡  t|| ƒ}t||dd�| _|ƒ | _t||ddd|d�| _|ƒ | _t||ddd�| _|ƒ | _	|dkrvt
|ƒnt ¡ | _d S )Nr   )r#   r?   ©r#   r$   r%   r'   ç        )r#   r(   )r   r   Úintr   r@   Úact1rB   Úact2Úconv3Úact3r
   r   ÚIdentityÚ	drop_path)r    r!   r"   Zexpand_ratiorC   rR   Zmid_chsr)   r+   r,   r   D   s    
zMBConv.__init__c                 C   sV   |}|   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}||7 }|  |¡}|S rD   )r@   rM   rB   rN   rO   rR   rP   )r    rF   Úshortcutr+   r+   r,   rG   O   s    






zMBConv.forwardrH   r+   r+   r)   r,   rI   C   s   rI   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚPatchMergingc                    sX   t ƒ  ¡  t||dddƒ| _|ƒ | _t||ddd|d�| _|ƒ | _t||dddƒ| _d S )Nr   r   r?   r-   )r'   )r   r   r   r@   rM   rB   rN   rO   )r    ÚdimÚout_dimrC   r)   r+   r,   r   ]   s    
zPatchMerging.__init__c                 C   s6   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S rD   )r@   rM   rB   rN   rO   rE   r+   r+   r,   rG   e   s    




zPatchMerging.forwardrH   r+   r+   r)   r,   rT   \   s   rT   c                       s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú	ConvLayerrK   ç      @c                    s>   t ƒ  ¡  ˆ| _|| _tj‡ ‡‡‡fdd„t|ƒD ƒŽ | _d S )Nc              
      s.   g | ]&}t ˆˆˆˆ tˆtƒr$ˆ| nˆƒ‘qS r+   )rI   Ú
isinstanceÚlist©Ú.0Úi©rC   Úconv_expand_ratiorU   rR   r+   r,   Ú
<listcomp>z   s   ü   þz&ConvLayer.__init__.<locals>.<listcomp>)r   r   rU   Údepthr   Ú
SequentialÚrangeÚblocks)r    rU   ra   rC   rR   r_   r)   r^   r,   r   o   s    
ûzConvLayer.__init__c                 C   s   |   |¡}|S rD   )rd   rE   r+   r+   r,   rG   ‚   s    
zConvLayer.forward)rK   rX   rH   r+   r+   r)   r,   rW   n   s     úrW   c                       s4   e Zd Zddejejdf‡ fdd„	Zdd„ Z‡  ZS )ÚNormMlpNrK   c                    sd   t ƒ  ¡  |p|}|p|}||ƒ| _t ||¡| _|ƒ | _t |¡| _t ||¡| _	t |¡| _
d S rD   )r   r   Únormr   ÚLinearÚfc1rA   ZDropoutÚdrop1Úfc2Údrop2)r    Úin_featuresÚhidden_featuresZout_featuresÚ
norm_layerrC   Údropr)   r+   r,   r   ˆ   s    	

zNormMlp.__init__c                 C   s@   |   |¡}|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}|S rD   )rf   rh   rA   ri   rj   rk   rE   r+   r+   r,   rG   ›   s    





zNormMlp.forward)	r8   r9   r:   r   Ú	LayerNormÚGELUr   rG   r<   r+   r+   r)   r,   re   ‡   s   ùre   c                       st   e Zd ZU ejje ed< ee	ej
f ed< d‡ fdd„	Ze ¡ d‡ fd	d
„	ƒZejej
dœdd„Zdd„ Z‡  ZS )Ú	AttentionÚ
fused_attnÚattention_bias_cacheé   r>   ©é   rw   c                    sr  t ƒ  ¡  t|tƒr t|ƒdks$t‚|| _|d | _|| _t	|| ƒ| _
| j
| | _|| _|| _tƒ | _t |¡| _t ||| j
d|   ¡| _t | j|¡| _tt t|d ƒt|d ƒ¡ƒ}t|ƒ}i }g }	|D ]Z}
|D ]P}t|
d |d  ƒt|
d |d  ƒf}||k�rt|ƒ||< |	 || ¡ qÜqÔtj t |t|ƒ¡¡| _| j dt !|	¡ "||¡dd� i | _#d S )Nr-   g      à¿r   r   Úattention_bias_idxsF)Ú
persistent)$r   r   rY   ÚtupleÚlenÚAssertionErrorÚ	num_headsÚscaleÚkey_dimrL   Úval_dimrV   Ú
attn_ratioÚ
resolutionr   rs   r   rp   rf   rg   ÚqkvÚprojrZ   Ú	itertoolsÚproductrc   ÚabsÚappendr   Ú	ParameterZzerosÚattention_biasesZregister_bufferZ
LongTensorÚviewrt   )r    rU   r   r}   r�   r‚   ZpointsÚNZattention_offsetsZidxsÚp1Zp2Úoffsetr)   r+   r,   r   ©   s4    

 (
zAttention.__init__Tc                    s    t ƒ  |¡ |r| jri | _d S rD   )r   Útrainrt   )r    Úmoder)   r+   r,   r�   Î   s    
zAttention.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 rD   )r   ÚjitÚ
is_tracingZtrainingrŠ   rx   Ústrrt   )r    r‘   Z
device_keyr+   r+   r,   Úget_attention_biasesÔ   s    
zAttention.get_attention_biasesc                 C   s   |   |j¡}|j\}}}|  |¡}|  |¡}| ||| jd¡j| j| j| j	gdd�\}}}	| 
dddd¡}| 
dddd¡}|	 
dddd¡}	| jr¤tj|||	|d�}n6|| j }|| dd¡ }
|
| }
|
jdd�}
|
|	 }| dd¡ ||| j¡}|  |¡}|S )	Néÿÿÿÿr?   )rU   r   r-   r   )Z	attn_maskéþÿÿÿ)r–   r‘   r1   rf   rƒ   r‹   r}   Úsplitr   r€   Úpermuters   ÚFZscaled_dot_product_attentionr~   Ú	transposeZsoftmaxÚreshaperV   r„   )r    rF   Z	attn_biasÚBrŒ   Ú_rƒ   ÚqÚkÚvÚattnr+   r+   r,   rG   Ý   s$    

.

zAttention.forward)ru   r>   rv   )T)r8   r9   r:   r   r“   ÚFinalÚboolÚ__annotations__r   r•   ZTensorr   r;   r�   r‘   r–   rG   r<   r+   r+   r)   r,   rr   ¥   s   
   ú%	rr   c                       sF   e Zd ZdZdddddejf‡ fdd„	Zdd	„ Zed
œdd„Z	‡  Z
S )ÚTinyVitBlocka5   TinyViT Block.

    Args:
        dim (int): Number of input channels.
        num_heads (int): Number of attention heads.
        window_size (int): Window size.
        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
        drop (float, optional): Dropout rate. Default: 0.0
        drop_path (float, optional): Stochastic depth rate. Default: 0.0
        local_conv_size (int): the kernel size of the convolution between
                               Attention and MLP. Default: 3
        act_layer: the activation function. Default: nn.GELU
    é   rX   rK   r?   c	                    sÚ   t ƒ  ¡  || _|| _|dks&tdƒ‚|| _|| _|| dksFtdƒ‚|| }	||f}
t||	|d|
d�| _|dkrzt	|ƒnt
 ¡ | _t|t|| ƒ||d�| _|dkr®t	|ƒnt
 ¡ | _|d }t|||d||d	�| _d S )
Nr   z"window_size must be greater than 0z"dim must be divisible by num_headsr   )r�   r‚   rK   )rl   rm   rC   ro   r-   rJ   )r   r   rU   r}   r|   Úwindow_sizeÚ	mlp_ratiorr   r£   r
   r   rQ   Ú
drop_path1re   rL   ÚmlpÚ
drop_path2r   Ú
local_conv)r    rU   r}   r©   rª   ro   rR   Úlocal_conv_sizerC   Zhead_dimZwindow_resolutionr%   r)   r+   r,   r     s(    

üzTinyVitBlock.__init__c              	   C   sÎ  |j \}}}}|| }|}|| jkrZ|| jkrZ| |||¡}|  |¡}| ||||¡}�n| j|| j  | j }| j|| j  | j }	|dkp”|	dk}
|
r²t |ddd|	d|f¡}|| ||	  }}|| j }|| j }| ||| j|| j|¡ dd¡ || | | j| j |¡}|  |¡}| |||| j| j|¡ dd¡ ||||¡}|
�rl|d d …d |…d |…f  ¡ }||  	|¡ }| 
dddd¡}|  |¡}| |||¡ dd¡}||  |  |¡¡ }| ||||¡S ©Nr   r-   r?   r   )r1   r©   r�   r£   r‹   r›   r%   rœ   Ú
contiguousr«   rš   r®   r­   r¬   )r    rF   rž   ÚHÚWÚCÚLrS   Zpad_bZpad_rr.   ZpHZpWZnHZnWr+   r+   r,   rG   +  s<    


 
 
 ÿ
,
zTinyVitBlock.forward©r’   c                 C   s$   d| j › d| j› d| j› d| j› �S )Núdim=z, num_heads=z, window_size=z, mlp_ratio=)rU   r}   r©   rª   ©r    r+   r+   r,   Ú
extra_reprS  s    zTinyVitBlock.extra_repr©r8   r9   r:   Ú__doc__r   rq   r   rG   r•   r¹   r<   r+   r+   r)   r,   r§   ÷   s   ÷%(r§   c                       sF   e Zd ZdZdddddejf‡ fdd„	Zdd	„ Zed
œdd„Z	‡  Z
S )ÚTinyVitStagea   A basic TinyViT layer for one stage.

    Args:
        dim (int): Number of input channels.
        out_dim: the output dimension of the layer
        depth (int): Number of blocks.
        num_heads (int): Number of attention heads.
        window_size (int): Local window size.
        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim.
        drop (float, optional): Dropout rate. Default: 0.0
        drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0
        downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None
        local_conv_size: the kernel size of the depthwise convolution between attention and MLP. Default: 3
        act_layer: the activation function. Default: nn.GELU
    rX   rK   Nr?   c              	      sv   t ƒ  ¡  || _ˆ| _|	d k	r0|	|ˆˆ d�| _nt ¡ | _|ˆksFt‚tj‡ ‡‡‡‡‡‡‡fdd„t	|ƒD ƒŽ | _
d S )N)rU   rV   rC   c                    s6   g | ].}t ˆˆˆˆˆtˆtƒr&ˆ| nˆˆˆ d �‘qS ))rU   r}   r©   rª   ro   rR   r¯   rC   )r§   rY   rZ   r[   ©rC   ro   rR   r¯   rª   r}   rV   r©   r+   r,   r`   ‹  s   öøz)TinyVitStage.__init__.<locals>.<listcomp>)r   r   ra   rV   Ú
downsampler   rQ   r|   rb   rc   rd   )r    rU   rV   ra   r}   r©   rª   ro   rR   r¾   r¯   rC   r)   r½   r,   r   l  s    
ý

õzTinyVitStage.__init__c                 C   s8   |   |¡}| dddd¡}|  |¡}| dddd¡}|S r°   )r¾   rš   rd   rE   r+   r+   r,   rG   ˜  s
    

zTinyVitStage.forwardr¶   c                 C   s   d| j › d| j› �S )Nr·   z, depth=)rV   ra   r¸   r+   r+   r,   r¹   Ÿ  s    zTinyVitStage.extra_reprrº   r+   r+   r)   r,   r¼   [  s   ô,r¼   c                       sº   e Zd Zddddddddd	d
dddejf‡ fdd„	Zdd„ Zejj	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dd„ Zd d!„ Zd"d#„ Z‡  ZS )'r   r?   éè  Úavg)é`   éÀ   é€  i   )r-   r-   é   r-   )r?   rÄ   é   é   )r¨   r¨   rw   r¨   rX   rK   çš™™™™™¹?Fc                    sŽ  t ƒ  ¡  || _|| _t|ƒ| _|| _|| _t||d |d�| _	dd„ t
 d|
t|ƒ¡D ƒ}t ¡ | _| j	j}|d }g | _t| jƒD ]Ì}|dkr¶t||| ||d || … |d�}np|| }|t|d |… ƒt|d |d … ƒ… }
t||d  ||| || || | j|	||
t|d�}|}|d9 }| j |¡ |  jt||d	|› �d
�g7  _q†|d | _ttdd�}t| j|||d�| _|  | j¡ d S )Nr   )r!   r"   rC   c                 S   s   g | ]}|  ¡ ‘qS r+   )Úitem©r\   rF   r+   r+   r,   r`   Ä  s     z$TinyVit.__init__.<locals>.<listcomp>)rU   ra   rC   rR   r_   r   )rU   rV   ra   r}   r©   rª   ro   r¯   rR   r¾   rC   r-   zstages.)Znum_chsZ	reductionÚmoduler—   gñhãˆµøä>)r/   )Ú	pool_typern   )r   r   Únum_classesÚdepthsr{   Z
num_stagesrª   Úgrad_checkpointingr=   Úpatch_embedr   ZlinspaceÚsumr   rb   Ústagesr$   Zfeature_inforc   rW   r¼   rT   rˆ   ÚdictZnum_featuresr   r   r	   ÚheadÚapplyÚ_init_weights)r    Zin_chansrÌ   Úglobal_poolÚ
embed_dimsrÍ   r}   Úwindow_sizesrª   Z	drop_rateÚdrop_path_rateZuse_checkpointZmbconv_expand_ratior¯   rC   Zdprr$   Zprev_dimZ	stage_idxZstagerV   Znorm_layer_cfr)   r+   r,   r   ¤  sj    

ý
û(
õ"
üzTinyVit.__init__c                 C   sD   t |tjƒr@t|jdd� t |tjƒr@|jd k	r@tj |jd¡ d S )Ng{®Gáz”?)Ústdr   )rY   r   rg   r   r   r   r   r   )r    r6   r+   r+   r,   rÕ   ÷  s    zTinyVit._init_weightsc                 C   s   dhS )NrŠ   r+   r¸   r+   r+   r,   Úno_weight_decay_keywordsý  s    z TinyVit.no_weight_decay_keywordsc                 C   s   dd„ |   ¡  ¡ D ƒS )Nc                 S   s   h | ]}d |kr|’qS )rŠ   r+   rÉ   r+   r+   r,   Ú	<setcomp>  s      z*TinyVit.no_weight_decay.<locals>.<setcomp>)Ú
state_dictÚkeysr¸   r+   r+   r,   Úno_weight_decay  s    zTinyVit.no_weight_decayc                 C   s   t d|rdnddgd�}|S )Nz^patch_embedz^stages\.(\d+))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.\w+\.(\d+)N)Ústemrd   )rÒ   )r    ZcoarseZmatcherr+   r+   r,   Úgroup_matcher  s    þþzTinyVit.group_matcherTc                 C   s
   || _ d S rD   )rÎ   )r    Úenabler+   r+   r,   Úset_grad_checkpointing  s    zTinyVit.set_grad_checkpointingc                 C   s   | j jS rD   )rÓ   Úfcr¸   r+   r+   r,   Úget_classifier  s    zTinyVit.get_classifierNc                 C   s   || _ | jj||d� d S )N)rË   )rÌ   rÓ   Úreset)r    rÌ   rÖ   r+   r+   r,   Úreset_classifier  s    zTinyVit.reset_classifierc                 C   s6   |   |¡}| jr(tj ¡ s(t| j|ƒ}n
|  |¡}|S rD   )rÏ   rÎ   r   r“   Zis_scriptingr   rÑ   rE   r+   r+   r,   Úforward_features  s
    

zTinyVit.forward_featuresc                 C   s   |   |¡}|S rD   )rÓ   rE   r+   r+   r,   Úforward_head$  s    
zTinyVit.forward_headc                 C   s   |   |¡}|  |¡}|S rD   )rè   ré   rE   r+   r+   r,   rG   (  s    

zTinyVit.forward)F)T)N)r8   r9   r:   r   rq   r   rÕ   r   r“   ÚignorerÛ   rß   rá   rã   rå   rç   rè   ré   rG   r<   r+   r+   r)   r,   r   £  s<   ñS




c                 C   sp   d|   ¡ kr| d } | ¡ }i }|  ¡ D ]B\}}| d¡r<q(d|krbt|j|| jd d d… ƒj}|||< q(|S )NÚmodelrx   rŠ   r—   )rÞ   rÝ   ÚitemsÚendswithr   ÚTr1   )rÝ   rë   Z	target_sdZout_dictr¡   r¢   r+   r+   r,   Úcheckpoint_filter_fn.  s    

rï   Ú c              
   K   s   | dt tddddddœ	|–S )Nr¿   zpatch_embed.conv1.convzhead.fc)r¨   r¨   )r?   éà   rñ   gffffffî?)	ÚurlrÌ   ZmeanrÚ   Z
first_convÚ
classifierÚ	pool_sizeÚ
input_sizeÚcrop_pctr   )rò   Úkwargsr+   r+   r,   Ú_cfg=  s    ÷
örø   ztimm/iQU  )Ú	hf_hub_idrÌ   )rù   )r?   rÃ   rÃ   )rÅ   rÅ   g      ð?)rù   rõ   rô   rö   )r?   é   rú   )é   rû   Zsquash)rù   rõ   rô   rö   Z	crop_mode)ztiny_vit_5m_224.dist_in22kz"tiny_vit_5m_224.dist_in22k_ft_in1kztiny_vit_5m_224.in1kztiny_vit_11m_224.dist_in22kz#tiny_vit_11m_224.dist_in22k_ft_in1kztiny_vit_11m_224.in1kztiny_vit_21m_224.dist_in22kz#tiny_vit_21m_224.dist_in22k_ft_in1kztiny_vit_21m_224.in1kz#tiny_vit_21m_384.dist_in22k_ft_in1kz#tiny_vit_21m_512.dist_in22k_ft_in1kFc                 K   s2   |  dd¡}tt| |ftd|d�tdœ|—Ž}|S )NÚout_indices)r   r   r-   r?   T)Zflatten_sequentialrü   )Zfeature_cfgZpretrained_filter_fn)Úpopr   r   rÒ   rï   )ÚvariantÚ
pretrainedr÷   rü   rë   r+   r+   r,   Ú_create_tiny_vit�  s    ý
ûúr   c                 K   sJ   t ddddgddddgdddd	gd
d
dd
gdd�}| |¡ td| f|ŽS )Né@   é€   é    i@  r-   rÄ   r>   é   é
   r¨   rw   rK   ©r×   rÍ   r}   rØ   rÙ   Útiny_vit_5m_224©rÒ   Úupdater   ©rÿ   r÷   Zmodel_kwargsr+   r+   r,   r  Ž  s    



û
r  c                 K   sJ   t ddddgddddgdddd	gd
d
d	d
gdd�}| |¡ td| f|ŽS )Nr  r  é   iÀ  r-   rÄ   r>   ru   rw   r¨   rÇ   r  Útiny_vit_11m_224r  r
  r+   r+   r,   r  ›  s    



û
r  c                 K   sJ   t ddddgddddgdddd	gd
d
dd
gdd�}| |¡ td| f|ŽS )NrÁ   rÂ   rÃ   é@  r-   rÄ   r?   rÅ   é   r¨   rw   gš™™™™™É?r  Útiny_vit_21m_224r  r
  r+   r+   r,   r  ¨  s    



û
r  c                 K   sJ   t ddddgddddgdddd	gddd
dgdd�}| |¡ td| f|ŽS )NrÁ   rÂ   rÃ   r  r-   rÄ   r?   rÅ   r  rÆ   rÇ   r  Útiny_vit_21m_384r  r
  r+   r+   r,   r  µ  s    



û
r  c                 K   sJ   t ddddgddddgdddd	gd
d
dd
gdd�}| |¡ td| f|ŽS )NrÁ   rÂ   rÃ   r  r-   rÄ   r?   rÅ   r  rû   é    rÇ   r  Útiny_vit_21m_512r  r
  r+   r+   r,   r  Â  s    



û
r  )rð   )F)F)F)F)F)F)6r»   Ú__all__Úmathr…   Ú	functoolsr   Útypingr   r   Ztorch.nnr   Ztorch.nn.functionalZ
functionalr›   Z	timm.datar   r   Ztimm.layersr   r	   r
   r   r   r   Z_builderr   Z_features_fxr   Z_manipulater   Ú	_registryr   r   rb   r   ÚModuler=   rI   rT   rW   re   rr   r§   r¼   r   rï   rø   Zdefault_cfgsr   r  r  r  r  r  r+   r+   r+   r,   Ú<module>   s¨    RaH 
ýÿÿýÿÿýÿÿ  ý   ýÓ5
