o
    پi+                     @   s  d Z ddlmZ ddlmZ ddlmZmZmZm	Z	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mZ dd	lmZ dd
lmZ ddlmZmZ ddlm Z m!Z! dg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+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#Z0G d&d dej#Z1G d'd( d(e1Z2d)d* Z3e4e4d+d,d-d.d/e4d+d,d0d1d/e4d2d3d4d1d/e4d5d3d-d1d/e4d6d3d7d1d/e4d6d3d7d1d8d9d:e4d;d<d=d1d8d9d:e4d>d<d?d1d8d@e4d5d3d-dAd8d@e4dBd<dCdAd8d@dD
Z5ddGdHZ6ddJdKZ7e i dLe7dMdNdOe7dMdNdPe7dMdNdQe7dMdNdRe7dMdNdSe7dMdTdUdVe7dMdTdUdWe7dMdTdUdXe7dMdTdUdYe7dMdTdUdZe7d[d\d]e7d[d\d^e7d[d\d_e7d[d\d`e7d[d\dae7d[d\dbe7d[d\e7d[d\e7d[d\e7d[d\dcZ8e!ddde1fdedfZ9e!ddde1fdgdhZ:e!ddde1fdidjZ;e!ddde1fdkdlZ<e!ddde1fdmdnZ=e!ddde1fdodpZ>e!ddde1fdqdrZ?e!ddde1fdsdtZ@e!ddde1fdudvZAe!ddde1fdwdxZBe!ddde1fdydzZCe!ddde1fd{d|ZDe!ddde1fd}d~ZEe!ddde1fddZFe!ddde1fddZGe!ddde1fddZHe!ddde1fddZIe!ddde1fddZJe!ddde1fddZKe!ddde1fddZLdS )a   LeViT

Paper: `LeViT: a Vision Transformer in ConvNet's Clothing for Faster Inference`
    - https://arxiv.org/abs/2104.01136

@article{graham2021levit,
  title={LeViT: a Vision Transformer in ConvNet's Clothing for Faster Inference},
  author={Benjamin Graham and Alaaeldin El-Nouby and Hugo Touvron and Pierre Stock and Armand Joulin and Herv'e J'egou and Matthijs Douze},
  journal={arXiv preprint arXiv:22104.01136},
  year={2021}
}

Adapted from official impl at https://github.com/facebookresearch/LeViT, original copyright bellow.

This version combines both conv/linear models and fixes torchscript compatibility.

Modifications and additions for timm hacked together by / Copyright 2021, Ross Wightman
    )OrderedDict)partial)DictListOptionalTupleUnionN)IMAGENET_DEFAULT_STDIMAGENET_DEFAULT_MEAN)	to_ntuple	to_2tupleget_act_layerDropPathtrunc_normal_ndgrid   )build_model_with_cfg)feature_take_indices)
checkpointcheckpoint_seq)generate_default_cfgsregister_modelLevitc                       s8   e Zd Z	d	 fdd	Ze dd Zdd Z  ZS )
ConvNormr   r   c	           	   
      sH   t    tj|||||||dd| _t|| _tj| jj	| d S NFbias)
super__init__nnConv2dlinearBatchNorm2dbninit	constant_weight)	selfin_chsout_chskernel_sizestridepaddingdilationgroupsbn_weight_init	__class__ E/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/levit.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|	d|	d|j
dd  | j j| j j| j j| j jd}|jj| |jj| |S )N      ?r   r      )r+   r,   r-   r.   )r!   r#   r&   running_varepsr   running_meanr   r    sizeshaper+   r,   r-   r.   datacopy_)r'   cr#   wbmr2   r2   r3   fuse4   s   ""zConvNorm.fusec                 C   s   |  | |S N)r#   r!   r'   xr2   r2   r3   forwardA   s   zConvNorm.forward)r   r   r   r   r   r   	__name__
__module____qualname__r   torchno_gradrA   rE   __classcell__r2   r2   r0   r3   r   +   s    
r   c                       s6   e Zd Zd fdd	Ze dd Zdd Z  ZS )	
LinearNormr   c                    s>   t    tj||dd| _t|| _tj| jj	| d S r   )
r   r   r   Linearr!   BatchNorm1dr#   r$   r%   r&   )r'   in_featuresout_featuresr/   r0   r2   r3   r   F   s   
zLinearNorm.__init__c                 C   s   | j | j}}|j|j|j d  }|j|d d d f  }|j|j|j |j|j d   }t|	d|	d}|jj
| |jj
| |S )Nr4   r   r   )r!   r#   r&   r6   r7   r   r8   r   rN   r9   r;   r<   )r'   lr#   r>   r?   r@   r2   r2   r3   rA   M   s   "zLinearNorm.fusec                 C   s"   |  |}| |dd|S )Nr   r   )r!   r#   flatten
reshape_asrC   r2   r2   r3   rE   X   s   
zLinearNorm.forwardr   rF   r2   r2   r0   r3   rM   E   s
    

rM   c                       s6   e Zd Zd
 fdd	Ze dd Zdd	 Z  ZS )
NormLinearT{Gz?        c                    sj   t    t|| _t|| _tj|||d| _t	| jj
|d | jjd ur3tj| jjd d S d S )Nr   )stdr   )r   r   r   rO   r#   DropoutdroprN   r!   r   r&   r   r$   r%   )r'   rP   rQ   r   rY   r[   r0   r2   r3   r   ^   s   
zNormLinear.__init__c                 C   s   | j | j}}|j|j|j d  }|j| j j| j j |j|j d   }|j|d d d f  }|jd u r=|| jjj }n|j|d d d f  d| jj }t	
|d|d}|jj| |jj| |S )Nr4   r   r   )r#   r!   r&   r6   r7   r   r8   Tviewr   rN   r9   r;   r<   )r'   r#   rR   r>   r?   r@   r2   r2   r3   rA   h   s   &
$zNormLinear.fusec                 C   s   |  | | |S rB   )r!   r[   r#   rC   r2   r2   r3   rE   w   s   zNormLinear.forward)TrW   rX   rF   r2   r2   r0   r3   rV   ]   s
    

rV   c                          e Zd Z fddZ  ZS )Stem8c              
      s   t    d| _| dt||d dddd | d|  | d	t|d |d dddd | d
|  | dt|d |dddd d S )N   conv1      r5   r   r+   r,   act1conv2act2conv3r   r   r+   
add_moduler   r'   r(   r)   	act_layerr0   r2   r3   r   |   s   
""zStem8.__init__rG   rH   rI   r   rL   r2   r2   r0   r3   r`   {       r`   c                       r_   )Stem16c              
      s   t    d| _| dt||d dddd | d|  | d	t|d |d
 dddd | d|  | dt|d
 |d dddd | d|  | dt|d |dddd d S )N   rb   ra   rd   r5   r   re   rf   rg   rc   rh   ri   act3conv4rj   rl   r0   r2   r3   r      s   
"""zStem16.__init__rn   r2   r2   r0   r3   rp      ro   rp   c                       s&   e Zd Zd fdd	Zdd Z  ZS )
DownsampleFc                    s@   t    || _t|| _|rtjd|ddd| _d S d | _d S )Nrd   r   F)r+   r,   count_include_pad)r   r   r+   r   
resolutionr   	AvgPool2dpool)r'   r+   rv   use_poolr0   r2   r3   r      s   

&zDownsample.__init__c                 C   s   |j \}}}||| jd | jd |}| jd ur+| |dddddddd}n|d d d d | jd d | jf }||d|S )Nr   r   rd   r5   r\   )r:   r^   rv   rx   permuter+   reshape)r'   rD   BNCr2   r2   r3   rE      s   
$"zDownsample.forwardF)rG   rH   rI   r   rE   rL   r2   r2   r0   r3   rt      s    rt   c                       sr   e Zd ZU eeejf ed< ddddej	f fdd	Z
e d fd	d
	ZdejdejfddZdd Z  ZS )	Attentionattention_bias_cachera         @   Fc              
      sJ  t    |r	tnt}t|}|| _|| _|d | _|| _|| | _	t
|| | _t
|| | | _||| j| j	d  | _ttd| fd|| j|ddfg| _tt||d |d  | _ttt|d t|d d}	|	dd d d f |	dd d d f   }
|
d |d  |
d  }
| jd	|
d
d i | _d S )N      r5   actlnr   r/   r   .attention_bias_idxsF
persistent)r   r   r   rM   r   use_conv	num_headsscalekey_dimkey_attn_dimintval_dimval_attn_dimqkvr   
Sequentialr   proj	ParameterrJ   zerosattention_biasesstackr   arangerS   absregister_bufferr   )r'   dimr   r   
attn_ratiorv   r   rm   ln_layerposrel_posr0   r2   r3   r      s*   




 *(
zAttention.__init__Tc                    (   t  | |r| jri | _d S d S d S rB   r   trainr   r'   moder0   r2   r3   r         

zAttention.traindevicereturnc                 C   Z   t j s| jr| jd d | jf S t|}|| jvr(| jd d | jf | j|< | j| S rB   rJ   jit
is_tracingtrainingr   r   strr   r'   r   
device_keyr2   r2   r3   get_attention_biases      

zAttention.get_attention_biasesc                 C   sX  | j rL|j\}}}}| ||| jd|| j| j| j| jgdd\}}}|dd| | j	 | 
|j }	|	jdd}	||	dd |d||}nY|j\}}
}| |||
| jdj| j| j| jgdd\}}}|dddd}|dddd}|dddd}|| | j	 | 
|j }	|	jdd}	|	| dd||
| j}| |}|S )Nr\   r5   r   rd   r   r   )r   r:   r   r^   r   splitr   r   	transposer   r   r   softmaxrz   r{   r   r   )r'   rD   r|   r~   HWqkvattnr}   r2   r2   r3   rE      s0   
"


zAttention.forwardTrG   rH   rI   r   r   rJ   Tensor__annotations__r   SiLUr   rK   r   r   r   rE   rL   r2   r2   r0   r3   r      s   
 #	r   c                       sv   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dejdejfddZdd Z  ZS )AttentionDownsampler   ra          @r5   r   Fc              	      s  t    t|}|| _|| _|| _|| _|| | _t|| | _	| j	| j | _
|d | _|| _| jrGt}ttj|	r<dnd|	rAdnddd}n	t}tt||	d}||| j
| j | _ttd||d	fd
||| jfg| _ttd|
 fd
|| j
|fg| _tt||d |d  | _ttt|d t|d d}tttjd|d |dtjd|d |dd}|dd d d f |dd d d f    }|d |d  |d  }| j!d|dd i | _"d S )Nr   rd   r   r   F)r*   r,   ru   )rv   ry   down)r+   r   r   )step.r   r   )#r   r   r   r+   rv   r   r   r   r   r   r   r   r   r   r   r   rw   rM   rt   kvr   r   r   r   r   rJ   r   r   r   r   r   rS   r   r   r   )r'   in_dimout_dimr   r   r   r+   rv   r   ry   rm   r   	sub_layerk_posq_posr   r0   r2   r3   r      sP   




 *(
zAttentionDownsample.__init__Tc                    r   rB   r   r   r0   r2   r3   r   1  r   zAttentionDownsample.trainr   r   c                 C   r   rB   r   r   r2   r2   r3   r   7  r   z(AttentionDownsample.get_attention_biasesc                 C   s  | j rj|j\}}}}|d | j d |d | j d }}| ||| jd|| j| j| jgdd\}}	| 	||| j| jd}
|

dd| | j | |j }|jdd}|	|
dd || j||}na|j\}}}| |||| jdj| j| jgdd\}}	|dddd}|	dddd}	| 	||d| j| jdddd}
|
| | j | |j }|jdd}||	 
dd|d| j}| |}|S )Nr   r\   r5   r   r   rd   r   )r   r:   r+   r   r^   r   r   r   r   r   r   r   r   r   r   r{   r   rz   r   )r'   rD   r|   r~   r   r   HHWWr   r   r   r   r}   r2   r2   r3   rE   @  s$   &2" .&
zAttentionDownsample.forwardr   r   r2   r2   r0   r3   r      s   
 9	r   c                       s6   e Zd ZdZdddejdf fdd	Zdd Z  ZS )	LevitMlpzL MLP for Levit w/ normalization + ability to switch btw conv and linear
    NFrX   c                    sZ   t    |p|}|p|}|rtnt}|||| _| | _t|| _|||dd| _	d S )Nr   r   )
r   r   r   rM   ln1r   r   rZ   r[   ln2)r'   rP   hidden_featuresrQ   r   rm   r[   r   r0   r2   r3   r   ]  s   
	zLevitMlp.__init__c                 C   s,   |  |}| |}| |}| |}|S rB   )r   r   r[   r   rC   r2   r2   r3   rE   p  s
   



zLevitMlp.forward)	rG   rH   rI   __doc__r   r   r   rE   rL   r2   r2   r0   r3   r   Z  s    r   c                	       s:   e Zd Zdddejdddddf	 fdd		Zd
d Z  ZS )LevitDownsamplera   r   r   Nr   FrX   c                    sl   t    |p|}t|||||||	|
|d	| _t|t|| |
|d| _|dkr/t|| _
d S t	 | _
d S )N)	r   r   r   r   r   rm   rv   r   ry   r   rm   rX   )r   r   r   attn_downsampler   r   mlpr   r   Identity	drop_path)r'   r   r   r   r   r   	mlp_ratiorm   attn_act_layerrv   r   ry   r   r0   r2   r3   r   y  s(   

$zLevitDownsample.__init__c                 C   s"   |  |}|| | | }|S rB   )r   r   r   rC   r2   r2   r3   rE     s   
zLevitDownsample.forwardrG   rH   rI   r   r   r   rE   rL   r2   r2   r0   r3   r   x  s    &r   c                       s8   e Zd Zdddddejddf fdd		Zd
d Z  ZS )
LevitBlockra   r   r   r   FNrX   c              	      s   t    |	p|}	t|||||||	d| _|
dkrt|
nt | _t|t	|| ||d| _
|
dkr:t|
| _d S t | _d S )N)r   r   r   r   rv   r   rm   rX   r   )r   r   r   r   r   r   r   
drop_path1r   r   r   
drop_path2)r'   r   r   r   r   r   rv   r   rm   r   r   r0   r2   r3   r     s&   
	
$zLevitBlock.__init__c                 C   s,   ||  | | }|| | | }|S rB   )r   r   r   r   rC   r2   r2   r3   rE     s   zLevitBlock.forwardr   r2   r2   r0   r3   r     s    #r   c                
       s<   e Zd Zddddejdddddf
 fd	d
	Zdd Z  ZS )
LevitStagerc   ra   r   Nr    FrX   c                    s   t    t|
}
|r%t||||| dd||	|
||d| _dd |
D }
n||ks+J t | _g }t|D ]}|t|||||||	|
||d
g7 }q6tj	| | _
d S )Nr   r   )	r   r   r   r   rm   r   rv   r   r   c                 S   s   g | ]
}|d  d d  qS )r   r5   r2   .0rr2   r2   r3   
<listcomp>      z'LevitStage.__init__.<locals>.<listcomp>)r   r   r   rm   r   rv   r   r   )r   r   r   r   
downsampler   r   ranger   r   blocks)r'   r   r   r   depthr   r   r   rm   r   rv   r   r   r   r   _r0   r2   r3   r     sD   

zLevitStage.__init__c                 C      |  |}| |}|S rB   )r   r   rC   r2   r2   r3   rE        

zLevitStage.forwardr   r2   r2   r0   r3   r     s    6r   c                       sX  e Zd ZdZ												
	
				
				d6 fdd	Zejjdd Zejjd7ddZ	ejjd8ddZ
ejjdejfddZd9dedee fdd Z	
			!	d:d"ejd#eeeee f  d$ed%ed&ed'edeeej eejeej f f fd(d)Z	*		d;d#eeee f d+ed,efd-d.Zd/d0 Zd7d1efd2d3Zd4d5 Z  ZS )<r   z Vision Transformer with support for patch or hybrid CNN input stage

    NOTE: distillation is defaulted to True since pretrained weights use it, will cause problems
    w/ train scripts that don't take tuple outputs,
       rd        @      rd   r   Ns16	subsample
hard_swishFavgrX   c                    s  t    t|}t|p|}|| _|| _|| _|d  | _| _|| _|| _	d| _
g | _t|}t||ks8J t||}t||}t||	}	|
d urZ|dksTJ |
| _|}n#|dv s`J |dkrot||d |d| _n
t||d |d| _| jj}tdd	 tt|t|D }|d }g }t|D ]S}|dkrdnd
 |t||| ||| || || |	| |||| dkr|nd|dg7 }| 9 }t fdd	|D }|  jt|| |d| dg7  _|| }qtj| | _|dkrt|d ||d| _d S t | _d S )Nr\   Fr5   )r   s8r   r   )rm   c                 S   s   g | ]\}}|| qS r2   r2   )r   ipr2   r2   r3   r   E      z"Levit.__init__.<locals>.<listcomp>r   r   )
r   r   r   r   rm   r   rv   r   r   r   c                    s   g | ]
}|d    d  qS rU   r2   r   stage_strider2   r3   r   [  r   zstages.)num_chs	reductionmoduler[   )r   r   r   r   num_classesglobal_poolnum_featureshead_hidden_size	embed_dim	drop_rategrad_checkpointingfeature_infolenr   stemrp   r`   r+   tuplezipr   r   r   dictr   r   stagesrV   r   head)r'   img_sizein_chansr  r	  r   r   r   r   r   stem_backbonestem_stride	stem_typedown_oprm   r   r   r  r
  drop_path_rate
num_stagesr+   rv   r   r  r   r0   r   r3   r     sf   
 
$
0zLevit.__init__c                 C   s   dd |    D S )Nc                 S   s   h | ]}d |v r|qS )r   r2   )r   rD   r2   r2   r3   	<setcomp>e  r   z(Levit.no_weight_decay.<locals>.<setcomp>)
state_dictkeysr'   r2   r2   r3   no_weight_decayc     zLevit.no_weight_decayc                 C   s   t dddgd}|S )Nz ^cls_token|pos_embed|patch_embed)z^blocks\.(\d+)N)z^norm)i )r  r   )r  )r'   coarsematcherr2   r2   r3   group_matcherg  s
   zLevit.group_matcherTc                 C   
   || _ d S rB   )r  r'   enabler2   r2   r3   set_grad_checkpointingo     
zLevit.set_grad_checkpointingr   c                 C   s   | j S rB   )r  r  r2   r2   r3   get_classifiers  s   zLevit.get_classifierr  r  c                 C   sB   || _ |d ur
|| _|dkrt| j|| jd| _d S t | _d S Nr   r  )r  r  rV   r  r
  r   r   r  r'   r  r  r2   r2   r3   reset_classifierw  s   
zLevit.reset_classifierNCHWrD   indicesnorm
stop_early
output_fmtintermediates_onlyc              	   C   s"  |dv sJ dg }t t| j|\}}	| |}|j\}
}}}| js,|ddd}tj	
 s3|s7| j}n	| jd|	d  }t|D ]D\}}| jrVtj	
 sVt||}n||}||v rx| jrg|| n|||
||ddddd |d d d }|d d d }qD|r|S ||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:

        )r.  zOutput shape must be NCHW.r5   r   Nr\   r   rd   )r   r  r  r  r:   r   rS   r   rJ   r   is_scripting	enumerater  r   appendr{   rz   )r'   rD   r/  r0  r1  r2  r3  intermediatestake_indices	max_indexr|   r~   r   r   r  feat_idxstager2   r2   r3   forward_intermediates~  s.   
"zLevit.forward_intermediatesr   
prune_norm
prune_headc                 C   s<   t t| j|\}}| jd|d  | _|r| dd |S )z@ Prune layers not required for specified intermediates.
        Nr   r   r   )r   r  r  r-  )r'   r/  r=  r>  r8  r9  r2   r2   r3   prune_intermediate_layers  s
   zLevit.prune_intermediate_layersc                 C   sP   |  |}| js|ddd}| jr!tj s!t| j	|}|S | 	|}|S )Nr5   r   )
r  r   rS   r   r  rJ   r   r4  r   r  rC   r2   r2   r3   forward_features  s   

zLevit.forward_features
pre_logitsc                 C   s:   | j dkr| jr|jddn|jdd}|r|S | |S )Nr   r   r\   r   r   )r  r   meanr  )r'   rD   rA  r2   r2   r3   forward_head  s   
zLevit.forward_headc                 C   r   rB   )r@  rD  rC   r2   r2   r3   rE     r   zLevit.forward)r   rd   r   r   r   r   r   r   r   NNr   r   r   NFr   rX   rX   r   r   rB   )NFFr.  F)r   FT)rG   rH   rI   r   r   rJ   r   ignorer   r$  r(  r   Moduler*  r   r   r   r-  r   r   r   boolr   r<  r?  r@  rD  rE   rL   r2   r2   r0   r3   r     s    P

 
7

c                       sn   e Zd Z fddZejjdejfddZ	dde
dee fd	d
ZejjdddZddefddZ  ZS )LevitDistilledc                    s>   t  j|i | | jdkrt| j| jnt | _d| _d S )Nr   F)	r   r   r  rV   r  r   r   	head_distdistilled_training)r'   argskwargsr0   r2   r3   r     s   "
zLevitDistilled.__init__r   c                 C   s   | j | jfS rB   )r  rI  r  r2   r2   r3   r*    s   zLevitDistilled.get_classifierNr  r  c                 C   s`   || _ |d ur
|| _|dkrt| j|| jdnt | _|dkr)t| j|| _d S t | _d S r+  )	r  r  rV   r  r
  r   r   r  rI  r,  r2   r2   r3   r-    s   
(zLevitDistilled.reset_classifierTc                 C   r%  rB   )rJ  r&  r2   r2   r3   set_distilled_training  r)  z%LevitDistilled.set_distilled_trainingFrA  c                 C   sp   | j dkr| jr|jddn|jdd}|r|S | || |}}| jr2| jr2tj	 s2||fS || d S )Nr   rB  r   r   r5   )
r  r   rC  r  rI  rJ  r   rJ   r   r4  )r'   rD   rA  x_distr2   r2   r3   rD    s   
zLevitDistilled.forward_headrB   r   r   )rG   rH   rI   r   rJ   r   rE  r   rF  r*  r   r   r   r-  rM  rG  rD  rL   r2   r2   r0   r3   rH    s    rH  c                 C   s&   d| v r| d } dd |   D } | S )Nmodelc                 S   s   i | ]\}}d |vr||qS )r   r2   )r   r   r   r2   r2   r3   
<dictcomp>  s    z(checkpoint_filter_fn.<locals>.<dictcomp>)items)r  rO  r2   r2   r3   checkpoint_filter_fn  s   rR  )        rq   )rc      ra   )r5   rd   rc   )r	  r   r   r   )rc   ra   r   )rc   rc   rc   )r   i   rU      )rd      rV  )rT  rU     )rU  rY     )rV  	   r   silur   )r	  r   r   r   rm   r  )rY    i  r   )ra   
   r   )rY  rZ  i   )ra   r   rq   )r	  r   r   r   rm   )rc   ra   rV  )rY  r]  rZ  )ra   r^  r   )

levit_128s	levit_128	levit_192	levit_256	levit_384levit_384_s8levit_512_s8	levit_512
levit_256d
levit_512dFTc           	      K   s   d| v }| dd}|ddr|s|dd |d u r+| tv r#| }n|r+| dd}tt| fi |}t|r:tnt| |ft	td	|d
d|}|S )N_convout_indices)r   r   r5   features_onlyFfeature_clsgetterr   T)flatten_sequentialrj  )pretrained_filter_fnfeature_cfg)
popget
setdefault
model_cfgsreplacer  r   rH  r   rR  )	variantcfg_variant
pretrained	distilledrL  is_convrj  	model_cfgrO  r2   r2   r3   create_levit/  s*   

r|  r   c                 K   s    | ddd dddt tddd|S )	Nr   )rd   r   r   g?bicubicTzstem.conv1.linear)head.linearzhead_dist.linear)urlr  
input_size	pool_sizecrop_pctinterpolationfixed_input_sizerC  rY   
first_conv
classifier)r
   r	   )r  rL  r2   r2   r3   _cfgF  s   r  zlevit_128s.fb_dist_in1kztimm/)	hf_hub_idzlevit_128.fb_dist_in1kzlevit_192.fb_dist_in1kzlevit_256.fb_dist_in1kzlevit_384.fb_dist_in1kzlevit_conv_128s.fb_dist_in1k)rc   rc   )r  r  zlevit_conv_128.fb_dist_in1kzlevit_conv_192.fb_dist_in1kzlevit_conv_256.fb_dist_in1kzlevit_conv_384.fb_dist_in1kzlevit_384_s8.untrainedr~  )r  zlevit_512_s8.untrainedzlevit_512.untrainedzlevit_256d.untrainedzlevit_512d.untrainedzlevit_conv_384_s8.untrainedzlevit_conv_512_s8.untrained)zlevit_conv_512.untrainedzlevit_conv_256d.untrainedzlevit_conv_512d.untrainedr   c                 K      t dd| i|S )Nr_  rx  )r_  r|  rx  rL  r2   r2   r3   r_       r_  c                 K   r  )Nr`  rx  )r`  r  r  r2   r2   r3   r`    r  r`  c                 K   r  )Nra  rx  )ra  r  r  r2   r2   r3   ra    r  ra  c                 K   r  )Nrb  rx  )rb  r  r  r2   r2   r3   rb    r  rb  c                 K   r  )Nrc  rx  )rc  r  r  r2   r2   r3   rc    r  rc  c                 K   r  )Nrd  rx  )rd  r  r  r2   r2   r3   rd    r  rd  c                 K      t d| dd|S )Nre  Frx  ry  )re  r  r  r2   r2   r3   re       re  c                 K   r  )Nrf  Fr  )rf  r  r  r2   r2   r3   rf    r  rf  c                 K   r  )Nrg  Fr  )rg  r  r  r2   r2   r3   rg    r  rg  c                 K   r  )Nrh  Fr  )rh  r  r  r2   r2   r3   rh    r  rh  c                 K   r  )Nlevit_conv_128sTrx  r   )r  r  r  r2   r2   r3   r    r  r  c                 K   r  )Nlevit_conv_128Tr  )r  r  r  r2   r2   r3   r    r  r  c                 K   r  )Nlevit_conv_192Tr  )r  r  r  r2   r2   r3   r    r  r  c                 K   r  )Nlevit_conv_256Tr  )r  r  r  r2   r2   r3   r    r  r  c                 K   r  )Nlevit_conv_384Tr  )r  r  r  r2   r2   r3   r    r  r  c                 K   r  )Nlevit_conv_384_s8Tr  )r  r  r  r2   r2   r3   r    r  r  c                 K      t d| ddd|S )Nlevit_conv_512_s8TFrx  r   ry  )r  r  r  r2   r2   r3   r    r!  r  c                 K   r  )Nlevit_conv_512TFr  )r  r  r  r2   r2   r3   r    r!  r  c                 K   r  )Nlevit_conv_256dTFr  )r  r  r  r2   r2   r3   r    r!  r  c                 K   r  )Nlevit_conv_512dTFr  )r  r  r  r2   r2   r3   r    r!  r  )NFT)r   r   )Mr   collectionsr   	functoolsr   typingr   r   r   r   r   rJ   torch.nnr   	timm.datar	   r
   timm.layersr   r   r   r   r   r   _builderr   	_featuresr   _manipulater   r   	_registryr   r   __all__rF  r   rM   rV   r   r`   rp   rt   r   r   r   r   r   r   r   rH  rR  r  rt  r|  r  default_cfgsr_  r`  ra  rb  rc  rd  re  rf  rg  rh  r  r  r  r  r  r  r  r  r  r  r2   r2   r2   r3   <module>   sR    Oe-*= K$



 
#
(
)
*
+
,
.
/0
6